PageRenderTime 19ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 0ms

/apps/request/domain/Filter.php

http://zoop.googlecode.com/
PHP | 84 lines | 77 code | 6 blank | 1 comment | 27 complexity | 65aaac54af1e51733b738c9e04a6c1c6 MD5 | raw file
Possible License(s): BSD-3-Clause, LGPL-2.1
  1. <?php
  2. class Filter extends DbObject
  3. {
  4. static public function jsonToSql($json)
  5. {
  6. return self::sqlify(json_decode($json)->subs[0]);
  7. }
  8. static function sqlify($data)
  9. {
  10. $parts = array();
  11. foreach($data->fields as $field)
  12. $parts[] = self::sqlifyField($field);
  13. foreach($data->subs as $sub)
  14. $parts[] = '(' . self::sqlify($sub) . ')';
  15. $boolOp = $data->anyall == 'any' ? ' OR ' : ' AND ';
  16. return implode($boolOp, $parts);
  17. }
  18. static function sqlifyField($field)
  19. {
  20. $config = Config::get('app.filter');
  21. $name = $config['fields'][$field->field]['field'];
  22. $type = $config['fields'][$field->field]['type'];
  23. $operator = $field->operator;
  24. $widgit = $config['type_operator_map'][$type][$field->operator]['widgit'];
  25. // echo_r(array($type, $operator, $widgit));
  26. $left = $name;
  27. if($operator == 'is')
  28. {
  29. $op = '=';
  30. $right = $field->operandValues->menu;
  31. }
  32. else if($operator == 'is_not')
  33. {
  34. $op = '<>';
  35. $right = $field->operandValues->menu;
  36. }
  37. else if($operator == 'in')
  38. {
  39. $op = 'IN';
  40. $right = '(' . implode(', ', $field->operandValues->multi) . ')';
  41. }
  42. else if($operator == 'not_in')
  43. {
  44. $op = 'NOT IN';
  45. $right = '(' . implode(', ', $field->operandValues->multi) . ')';
  46. }
  47. else if($operator == 'less_than')
  48. {
  49. $op = ' < ';
  50. $right = $field->operandValues->menu;
  51. }
  52. else if($operator == 'greater_than')
  53. {
  54. $op = ' > ';
  55. $right = $field->operandValues->menu;
  56. }
  57. else if($operator == 'less_than_equal')
  58. {
  59. $op = ' <= ';
  60. $right = $field->operandValues->menu;
  61. }
  62. else if($operator == 'greater_than_equal')
  63. {
  64. $op = ' >= ';
  65. $right = $field->operandValues->menu;
  66. }
  67. else if($operator == 'in_the_range')
  68. {
  69. $all = "($left >= {$field->operandValues->menu1} AND $left <= {$field->operandValues->menu2})";
  70. return $all;
  71. }
  72. else
  73. {
  74. trigger_error("unrecognized operator '$operator'");
  75. }
  76. return "($left $op $right)";
  77. }
  78. }