1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
sqlwhere.php
См. документацию.
1<?php
8
10
27{
29
31 /*
32 "ID" => array(
33 "FIELD_NAME" => "UF.ID",
34 ),
35 */
36 );
37 var $c_joins = array();
38 var $l_joins = array();
39 var $bDistinctReqired = false;
40
42 "!><" => "NB", //not between
43 "!=%" => "NM", //not Identical by like
44 "!%=" => "NM", //not Identical by like
45 "!==" => "SN", // strong negation for boolean and null
46 "!=" => "NI", //not Identical
47 "!%" => "NS", //not substring
48 "><" => "B", //between
49 ">=" => "GE", //greater or equal
50 "<=" => "LE", //less or equal
51 "=%" => "M", //Identical by like
52 "%=" => "M", //Identical by like
53 "!@" => "NIN", //not in
54 "==" => "SE", // strong equality (not is null)
55 "=" => "I", //Identical
56 "%" => "S", //substring
57 "?" => "?", //logical
58 ">" => "G", //greater
59 "<" => "L", //less
60 "!" => "N", // not field LIKE val
61 "@" => "IN", // IN (new SqlExpression)
62 "*" => "FT", // partial full text match
63 "*=" => "FTI", // identical full text match
64 "*%" => "FTL", // partial full text match based on LIKE
65 );
66
67 public function _Upper($field)
68 {
69 return "UPPER(".$field.")";
70 }
71
72 public function _Empty($field)
73 {
74 return "(".$field." IS NULL OR ".$field." = '')";
75 }
76
77 public function _NotEmpty($field)
78 {
80 $helper = $connection->getSqlHelper();
81
82 return "(".$field." IS NOT NULL AND " . $helper->getLengthFunction($field) . " > 0)";
83 }
84
85 public function _StringEQ($field, $sql_value)
86 {
87 return $field." = '".$sql_value."'";
88 }
89
90 public function _StringNotEQ($field, $sql_value)
91 {
92 return "(".$field." IS NULL OR ".$field." <> '".$sql_value."')";
93 }
94
95 public function _StringIN($field, $sql_values)
96 {
97 return $field." in ('".implode("', '", $sql_values)."')";
98 }
99
100 public function _StringNotIN($field, $sql_values)
101 {
102 return "(".$field." IS NULL OR ".$field." not in ('".implode("', '", $sql_values)."'))";
103 }
104
105 public function _ExprEQ($field, $val)
106 {
107 return $field." = ".$val->compile();
108 }
109
110 public function _ExprNotEQ($field, $val)
111 {
112 return "(".$field." IS NULL OR ".$field." <> ".$val->compile().")";
113 }
114
115 public function _NumberIN($field, $sql_values)
116 {
117 $result = $field." in (".implode(", ", $sql_values).")";
118 if (in_array(0, $sql_values, true))
119 $result .= " or ".$field." IS NULL";
120 return $result;
121 }
122
123 public function _NumberNotIN($field, $sql_values)
124 {
125 $result = $field." not in (".implode(", ", $sql_values).")";
126 if (in_array(0, $sql_values, true))
127 $result .= " and ".$field." IS NOT NULL";
128 return $result;
129 }
130
136 public static function splitWords($string)
137 {
138 return Filter\Helper::splitWords($string);
139 }
140
145 public static function GetMinTokenSize()
146 {
147 return Filter\Helper::getMinTokenSize();
148 }
149
150 public function match($field, $fieldValue, $wildcard)
151 {
152 if (!is_array($fieldValue))
153 {
154 $fieldValue = array($fieldValue);
155 }
156 $orValues = array();
157 $wildcard = ($wildcard? "*" : "");
158
159 foreach ($fieldValue as $value)
160 {
161 $match = Filter\Helper::matchAgainstWildcard($value, $wildcard);
162 if ($match <> '')
163 {
164 $orValues[] = $match;
165 }
166 }
167
168 if(!empty($orValues))
169 {
171 $helper = $connection->getSqlHelper();
172 $value = $helper->getMatchOrExpression($orValues);
173
174 return $helper->getMatchFunction($field, "'" . $helper->forSql($value) . "'");
175 }
176
177 return '';
178 }
179
180 public function matchLike($field, $fieldValue)
181 {
182 if(!is_array($fieldValue))
183 {
184 $fieldValue = array($fieldValue);
185 }
186 $orValues = array();
187
188 foreach($fieldValue as $value)
189 {
190 //split to words by any non-word symbols
191 $andValues = Filter\Helper::splitWords($value);
192 if(!empty($andValues))
193 {
194 $andValues = array_map(
195 function($val)
196 {
197 return CSQLWhere::ForLIKE(mb_strtoupper($val));
198 },
199 $andValues
200 );
201
202 $orValues[] = "(".$this->_Upper($field)." like '%".implode("%' ESCAPE '!' AND ".$this->_Upper($field)." like '%", $andValues)."%' ESCAPE '!')";
203 }
204 }
205 if(!empty($orValues))
206 {
207 return "(".implode("\n OR ", $orValues).")";
208 }
209
210 return '';
211 }
212
213 public function AddFields($arFields)
214 {
215 if(is_array($arFields))
216 {
217 foreach($arFields as $key=>$arField)
218 {
219 $key = strtoupper($key);
220 if(!isset($this->fields[$key]) && is_array($arField) && $arField["FIELD_NAME"] <> '')
221 {
222 $ar = array();
223 $ar["TABLE_ALIAS"] = $arField["TABLE_ALIAS"] ?? '';
224 $ar["FIELD_NAME"] = $arField["FIELD_NAME"];
225 $ar["FIELD_TYPE"] = $arField["FIELD_TYPE"] ?? '';
226 $ar["USER_TYPE_ID"] = $arField["USER_TYPE_ID"] ?? '';
227 $ar["MULTIPLE"] = $arField["MULTIPLE"] ?? "N";
228 $ar["JOIN"] = $arField["JOIN"] ?? '';
229 if(isset($arField["LEFT_JOIN"]))
230 $ar["LEFT_JOIN"] = $arField["LEFT_JOIN"];
231 if(isset($arField["CALLBACK"]))
232 $ar["CALLBACK"] = $arField["CALLBACK"];
233 $this->fields[$key] = $ar;
234 }
235 }
236 }
237 }
238
239 public function SetFields($arFields)
240 {
241 $this->fields = array();
242 $this->AddFields($arFields);
243 }
244
245 public function MakeOperation($key)
246 {
247 if(isset(self::$operations[$op = mb_substr($key, 0, 3)]))
248 {
249 return array("FIELD"=> mb_substr($key, 3), "OPERATION"=>self::$operations[$op]);
250 }
251 elseif(isset(self::$operations[$op = mb_substr($key, 0, 2)]))
252 {
253 return array("FIELD"=> mb_substr($key, 2), "OPERATION"=>self::$operations[$op]);
254 }
255 elseif(isset(self::$operations[$op = mb_substr($key, 0, 1)]))
256 {
257 return array("FIELD"=> mb_substr($key, 1), "OPERATION"=>self::$operations[$op]);
258 }
259 else
260 {
261 return array("FIELD"=>$key, "OPERATION"=>"E"); // field LIKE val
262 }
263 }
264
265 public static function getOperationByCode($code)
266 {
267 $all_operations = array_flip(self::$operations);
268
269 return $all_operations[$code] ?? null;
270 }
271
272 public function GetQuery($arFilter)
273 {
274 $this->l_joins = array();
275 $this->c_joins = array();
276 foreach($this->fields as $key=>$field)
277 {
278 $this->l_joins[$field["TABLE_ALIAS"]] = isset($field['LEFT_JOIN']);
279 $this->c_joins[$key] = 0;
280 }
281 return $this->GetQueryEx($arFilter, $this->l_joins);
282 }
283
284 public function GetQueryEx($arFilter, &$arJoins, $level=0)
285 {
286 if(!is_array($arFilter))
287 return "";
288
289 $logic = false;
290 if(isset($arFilter['LOGIC']))
291 {
292 $logic = $arFilter["LOGIC"];
293 unset($arFilter["LOGIC"]);
294 }
295
296 $inverted = false;
297 if($logic == 'NOT')
298 {
299 $inverted = true;
300 $logic = 'AND';
301 }
302
303 if($logic !== "OR")
304 $logic = "AND";
305
306 $result = array();
307 foreach($arFilter as $key=>$value)
308 {
309 if(is_numeric($key))
310 {
311 $arRecursiveJoins = $arJoins;
312 $value = $this->GetQueryEx($value, $arRecursiveJoins, $level+1);
313 if($value <> '')
314 $result[] = "(".$value."\n".str_repeat("\t", $level).")";
315
316 foreach($arRecursiveJoins as $TABLE_ALIAS=>$bLeftJoin)
317 {
318 if($bLeftJoin)
319 {
320 if($logic == "OR")
321 $arJoins[$TABLE_ALIAS] |= true;
322 else
323 $arJoins[$TABLE_ALIAS] &= true;
324 }
325 else
326 {
327 if($logic == "OR")
328 $arJoins[$TABLE_ALIAS] |= false;
329 else
330 $arJoins[$TABLE_ALIAS] &= false;
331 }
332 }
333 }
334 else
335 {
336 $operation = $this->MakeOperation($key);
337 $key = mb_strtoupper($operation["FIELD"]);
338 $operation = $operation["OPERATION"];
339
340 if(isset($this->fields[$key]))
341 {
342 $FIELD_NAME = $this->fields[$key]["FIELD_NAME"];
343 $FIELD_TYPE = $this->fields[$key]["FIELD_TYPE"];
344 //Handle joins logic
345 if (!isset($this->c_joins[$key]))
346 {
347 $this->c_joins[$key] = 0;
348 }
349 $this->c_joins[$key]++;
350
351 if (!empty($this->fields[$key]["TABLE_ALIAS"]))
352 {
353 if(
354 (
355 ($operation=="I" || $operation=="E" || $operation=="S" || $operation=="M")
356 && (
357 is_scalar($value)
358 && (
359 ($FIELD_TYPE=="int" && intval($value)==0)
360 || ($FIELD_TYPE=="double" && doubleval($value)==0)
361 || $value == ''
362 )
363 )
364 )
365 ||
366 (
367 ($operation=="NI" || $operation=="N" || $operation=="NS" || $operation=="NB" || $operation=="NM")
368 && !is_object($value)
369 && (
370 is_array($value)
371 || (
372 ($FIELD_TYPE=="int" && intval($value)!=0)
373 || ($FIELD_TYPE=="double" && doubleval($value)!=0)
374 || ($FIELD_TYPE!="int" && $FIELD_TYPE!="double" && is_scalar($value) && $value <> '')
375 )
376 )
377 )
378 )
379 {
380 if($logic == "OR")
381 $arJoins[$this->fields[$key]["TABLE_ALIAS"]] |= true;
382 else
383 $arJoins[$this->fields[$key]["TABLE_ALIAS"]] &= true;
384 }
385 else
386 {
387 if($logic == "OR")
388 $arJoins[$this->fields[$key]["TABLE_ALIAS"]] |= false;
389 else
390 $arJoins[$this->fields[$key]["TABLE_ALIAS"]] &= false;
391 }
392 }
393
394 switch($FIELD_TYPE)
395 {
396 case "file":
397 case "enum":
398 case "int":
399 $this->addIntFilter($result, $this->fields[$key]["MULTIPLE"] === "Y", $FIELD_NAME, $operation, $value);
400 break;
401 case "double":
402 $this->addFloatFilter($result, $this->fields[$key]["MULTIPLE"] === "Y", $FIELD_NAME, $operation, $value);
403 break;
404 case "string":
405 $this->addStringFilter($result, $this->fields[$key]["MULTIPLE"] === "Y", $FIELD_NAME, $operation, $value);
406 break;
407 case "date":
408 case "datetime":
409 if($FIELD_TYPE == "date" || $this->fields[$key]["USER_TYPE_ID"] == "date")
410 {
411 $this->addDateFilter($result, $this->fields[$key]["MULTIPLE"] === "Y", $FIELD_NAME, $operation, $value, "SHORT");
412 }
413 else
414 {
415 $this->addDateFilter($result, $this->fields[$key]["MULTIPLE"] === "Y", $FIELD_NAME, $operation, $value, "FULL");
416 }
417 break;
418 case "callback":
419 $res = call_user_func_array($this->fields[$key]["CALLBACK"], array(
420 $FIELD_NAME,
421 $operation,
422 $value,
423 ));
424 if($res <> '')
425 {
426 $result[] = $res;
427 }
428 break;
429 }
430 }
431 }
432 }
433
434 if(!empty($result))
435 return "\n".str_repeat("\t", $level).($inverted ? 'NOT (' : '').implode("\n".str_repeat("\t", $level).$logic." ", $result).($inverted ? ')' : '');
436 else
437 return "";
438 }
439
440 public function GetJoins()
441 {
442 $result = array();
443
444 foreach($this->c_joins as $key => $counter)
445 {
446 if($counter > 0)
447 {
448 $TABLE_ALIAS = $this->fields[$key]["TABLE_ALIAS"];
449 if($this->l_joins[$TABLE_ALIAS])
450 $result[$TABLE_ALIAS] = $this->fields[$key]["LEFT_JOIN"];
451 else
452 $result[$TABLE_ALIAS] = $this->fields[$key]["JOIN"];
453 }
454 }
455 return implode("\n", $result);
456 }
457
458 public function ForLIKE($str)
459 {
460 global $DB;
461 static $search = array( "!", "_", "%");
462 static $replace = array("!!", "!_", "!%");
463 return str_replace($search, $replace, $DB->ForSQL($str));
464 }
465
466 public function addIntFilter(&$result, $isMultiple, $FIELD_NAME, $operation, $value)
467 {
468 if (is_array($value))
469 $FIELD_VALUE = array_map("intval", $value);
470 elseif (is_object($value))
471 $FIELD_VALUE = $value;
472 else
473 $FIELD_VALUE = intval($value);
474
475 switch ($operation)
476 {
477 case "I":
478 case "E":
479 case "S":
480 case "M":
481 case "SE":
482 if (is_array($FIELD_VALUE))
483 {
484 if (!empty($FIELD_VALUE))
485 $result[] = "(".$this->_NumberIN($FIELD_NAME, $FIELD_VALUE).")";
486 else
487 $result[] = "1=0";
488
489 if ($isMultiple)
490 $this->bDistinctReqired = true;
491 }
492 elseif (is_object($FIELD_VALUE))
493 $result[] = $FIELD_NAME." = ".$FIELD_VALUE->compile();
494 elseif ($FIELD_VALUE == 0 && $operation !== "SE")
495 $result[] = "(".$FIELD_NAME." IS NULL OR ".$FIELD_NAME." = 0)";
496 else
497 $result[] = $FIELD_NAME." = ".$FIELD_VALUE;
498 break;
499 case "NI":
500 case "N":
501 case "NS":
502 case "NM":
503 if (is_array($FIELD_VALUE))
504 {
505 if (!empty($FIELD_VALUE))
506 $result[] = "(".$this->_NumberNotIN($FIELD_NAME, $FIELD_VALUE).")";
507 else
508 $result[] = "1=1";
509 }
510 elseif ($FIELD_VALUE instanceof \Bitrix\Main\DB\SqlExpression)
511 {
512 $result[] = $FIELD_NAME." <> ".$FIELD_VALUE->compile();
513 }
514 elseif ($FIELD_VALUE == 0)
515 $result[] = "(".$FIELD_NAME." IS NOT NULL AND ".$FIELD_NAME." <> 0)";
516 else
517 $result[] = $FIELD_NAME." <> ".$FIELD_VALUE;
518
519 if ($isMultiple)
520 $this->bDistinctReqired = true;
521 break;
522 case "G":
523 if (is_array($FIELD_VALUE))
524 {
525 if (isset($FIELD_VALUE[0]))
526 {
527 $result[] = $FIELD_NAME." > ".$FIELD_VALUE[0];
528 }
529 else
530 {
531 $result[] = "1=0";
532 }
533 }
534 elseif ($FIELD_VALUE instanceof \Bitrix\Main\DB\SqlExpression)
535 {
536 $result[] = $FIELD_NAME." > ".$FIELD_VALUE->compile();
537 }
538 else
539 $result[] = $FIELD_NAME." > ".$FIELD_VALUE;
540
541 if ($isMultiple)
542 $this->bDistinctReqired = true;
543 break;
544 case "L":
545 if (is_array($FIELD_VALUE))
546 {
547 if (isset($FIELD_VALUE[0]))
548 {
549 $result[] = $FIELD_NAME." < ".$FIELD_VALUE[0];
550 }
551 else
552 {
553 $result[] = "1=0";
554 }
555 }
556 elseif ($FIELD_VALUE instanceof \Bitrix\Main\DB\SqlExpression)
557 {
558 $result[] = $FIELD_NAME." < ".$FIELD_VALUE->compile();
559 }
560 else
561 $result[] = $FIELD_NAME." < ".$FIELD_VALUE;
562
563 if ($isMultiple)
564 $this->bDistinctReqired = true;
565 break;
566 case "GE":
567 if (is_array($FIELD_VALUE))
568 {
569 if (isset($FIELD_VALUE[0]))
570 {
571 $result[] = $FIELD_NAME." >= ".$FIELD_VALUE[0];
572 }
573 else
574 {
575 $result[] = "1=0";
576 }
577 }
578 elseif ($FIELD_VALUE instanceof \Bitrix\Main\DB\SqlExpression)
579 {
580 $result[] = $FIELD_NAME." >= ".$FIELD_VALUE->compile();
581 }
582 else
583 $result[] = $FIELD_NAME." >= ".$FIELD_VALUE;
584
585 if ($isMultiple)
586 $this->bDistinctReqired = true;
587 break;
588 case "LE":
589 if (is_array($FIELD_VALUE))
590 {
591 if (isset($FIELD_VALUE[0]))
592 {
593 $result[] = $FIELD_NAME." <= ".$FIELD_VALUE[0];
594 }
595 else
596 {
597 $result[] = "1=0";
598 }
599 }
600 elseif ($FIELD_VALUE instanceof \Bitrix\Main\DB\SqlExpression)
601 {
602 $result[] = $FIELD_NAME." <= ".$FIELD_VALUE->compile();
603 }
604 else
605 $result[] = $FIELD_NAME." <= ".$FIELD_VALUE;
606
607 if ($isMultiple)
608 $this->bDistinctReqired = true;
609 break;
610 case "B":
611 if (is_array($FIELD_VALUE) && count($FIELD_VALUE) > 1)
612 $result[] = $FIELD_NAME." between ".$FIELD_VALUE[0]." AND ".$FIELD_VALUE[1];
613
614 if ($isMultiple)
615 $this->bDistinctReqired = true;
616 break;
617 case "NB":
618 if (is_array($FIELD_VALUE) && count($FIELD_VALUE) > 1)
619 $result[] = $FIELD_NAME." not between ".$FIELD_VALUE[0]." AND ".$FIELD_VALUE[1];
620
621 if ($isMultiple)
622 $this->bDistinctReqired = true;
623 break;
624 case "IN":
625 if(is_object($FIELD_VALUE))
626 $result[] = $FIELD_NAME." IN (".$FIELD_VALUE->compile().")";
627 elseif(is_array($FIELD_VALUE))
628 $result[] = $FIELD_NAME." IN (".implode(",", $FIELD_VALUE).")";
629 else
630 $result[] = $FIELD_NAME." IN (".$FIELD_VALUE.")";
631 break;
632 case "NIN":
633 if(is_object($FIELD_VALUE))
634 $result[] = $FIELD_NAME." NOT IN (".$FIELD_VALUE->compile().")";
635 elseif(is_array($FIELD_VALUE))
636 $result[] = $FIELD_NAME." NOT IN (".implode(",", $FIELD_VALUE).")";
637 else
638 $result[] = $FIELD_NAME." NOT IN (".$FIELD_VALUE.")";
639 break;
640 }
641 }
642
643 public function addFloatFilter(&$result, $isMultiple, $FIELD_NAME, $operation, $value)
644 {
645 if (is_array($value))
646 {
647 $FIELD_VALUE = [];
648 foreach($value as $i => $val)
649 {
650 $FIELD_VALUE[$i] = doubleval($val);
651 if(!is_finite($FIELD_VALUE[$i]))
652 {
653 $FIELD_VALUE[$i] = 0;
654 }
655 }
656 }
657 elseif (is_object($value))
658 {
659 $FIELD_VALUE = $value;
660 }
661 else
662 {
663 $FIELD_VALUE = doubleval($value);
664 if(!is_finite($FIELD_VALUE))
665 {
666 $FIELD_VALUE = 0;
667 }
668 }
669
670 switch ($operation)
671 {
672 case "I":
673 case "E":
674 case "S":
675 case "M":
676 if (is_array($FIELD_VALUE))
677 {
678 if (!empty($FIELD_VALUE))
679 $result[] = "(".$this->_NumberIN($FIELD_NAME, $FIELD_VALUE).")";
680 else
681 $result[] = "1=0";
682
683 if ($isMultiple)
684 $this->bDistinctReqired = true;
685 }
686 elseif (is_object($FIELD_VALUE))
687 $result[] = $FIELD_NAME." = ".$FIELD_VALUE->compile();
688 elseif ($FIELD_VALUE == 0)
689 $result[] = "(".$FIELD_NAME." IS NULL OR ".$FIELD_NAME." = 0)";
690 else
691 $result[] = $FIELD_NAME." = ".$FIELD_VALUE;
692 break;
693 case "NI":
694 case "N":
695 case "NS":
696 case "NM":
697 if (is_array($FIELD_VALUE))
698 {
699 if (!empty($FIELD_VALUE))
700 $result[] = "(".$this->_NumberNotIN($FIELD_NAME, $FIELD_VALUE).")";
701 else
702 $result[] = "1=1";
703 }
704 elseif ($FIELD_VALUE == 0)
705 $result[] = "(".$FIELD_NAME." IS NOT NULL AND ".$FIELD_NAME." <> 0)";
706 else
707 $result[] = $FIELD_NAME." <> ".$FIELD_VALUE;
708
709 if ($isMultiple)
710 $this->bDistinctReqired = true;
711 break;
712 case "G":
713 if (is_array($FIELD_VALUE))
714 {
715 if (isset($FIELD_VALUE[0]))
716 {
717 $result[] = $FIELD_NAME." > ".$FIELD_VALUE[0];
718 }
719 else
720 {
721 $result[] = "1=0";
722 }
723 }
724 else
725 $result[] = $FIELD_NAME." > ".$FIELD_VALUE;
726
727 if ($isMultiple)
728 $this->bDistinctReqired = true;
729 break;
730 case "L":
731 if (is_array($FIELD_VALUE))
732 {
733 if (is_array($FIELD_VALUE))
734 {
735 if (isset($FIELD_VALUE[0]))
736 {
737 $result[] = $FIELD_NAME." < ".$FIELD_VALUE[0];
738 }
739 else
740 {
741 $result[] = "1=0";
742 }
743 }
744 }
745 else
746 $result[] = $FIELD_NAME." < ".$FIELD_VALUE;
747
748 if ($isMultiple)
749 $this->bDistinctReqired = true;
750 break;
751 case "GE":
752 if (is_array($FIELD_VALUE))
753 {
754 if (is_array($FIELD_VALUE))
755 {
756 if (isset($FIELD_VALUE[0]))
757 {
758 $result[] = $FIELD_NAME." >= ".$FIELD_VALUE[0];
759 }
760 else
761 {
762 $result[] = "1=0";
763 }
764 }
765 }
766 else
767 $result[] = $FIELD_NAME." >= ".$FIELD_VALUE;
768
769 if ($isMultiple)
770 $this->bDistinctReqired = true;
771 break;
772 case "LE":
773 if (is_array($FIELD_VALUE))
774 {
775 if (isset($FIELD_VALUE[0]))
776 {
777 $result[] = $FIELD_NAME." <= ".$FIELD_VALUE[0];
778 }
779 else
780 {
781 $result[] = "1=0";
782 }
783 }
784 else
785 $result[] = $FIELD_NAME." <= ".$FIELD_VALUE;
786
787 if ($isMultiple)
788 $this->bDistinctReqired = true;
789 break;
790 case "B":
791 if (is_array($FIELD_VALUE) && count($FIELD_VALUE)>1)
792 $result[] = $FIELD_NAME." between ".$FIELD_VALUE[0]." AND ".$FIELD_VALUE[1];
793
794 if ($isMultiple)
795 $this->bDistinctReqired = true;
796 break;
797 case "NB":
798 if (is_array($FIELD_VALUE) && count($FIELD_VALUE)>1)
799 $result[] = $FIELD_NAME." not between ".$FIELD_VALUE[0]." AND ".$FIELD_VALUE[1];
800
801 if ($isMultiple)
802 $this->bDistinctReqired = true;
803 break;
804 case "IN":
805 $result[] = $FIELD_NAME." IN (".$FIELD_VALUE->compile().")";
806 break;
807 case "NIN":
808 $result[] = $FIELD_NAME." NOT IN (".$FIELD_VALUE->compile().")";
809 break;
810 }
811 }
812
813 public function addStringFilter(&$result, $isMultiple, $FIELD_NAME, $operation, $value)
814 {
815 global $DB;
816
817 if (is_array($value))
818 {
819 $FIELD_VALUE = array();
820 if ($operation=="S" || $operation=="NS")
821 {
822 foreach ($value as $val)
823 $FIELD_VALUE[] = $this->ForLIKE(mb_strtoupper((string)$val));
824 }
825 else
826 {
827 foreach ($value as $val)
828 $FIELD_VALUE[] = $DB->ForSQL((string)$val);
829 }
830 }
831 elseif (is_object($value))
832 {
833 $FIELD_VALUE = $value;
834 }
835 else
836 {
837 if ($operation=="S" || $operation=="NS")
838 $FIELD_VALUE = $this->ForLIKE(mb_strtoupper((string)$value));
839 else
840 $FIELD_VALUE = $DB->ForSQL((string)$value);
841 }
842
843 switch ($operation)
844 {
845 case "I":
846 if (is_array($FIELD_VALUE))
847 {
848 $result[] = $this->_StringIN($FIELD_NAME, $FIELD_VALUE);
849 if ($isMultiple)
850 $this->bDistinctReqired = true;
851 }
852 elseif (is_object($FIELD_VALUE))
853 {
854 $result[] = $this->_ExprEQ($FIELD_NAME, $FIELD_VALUE);
855 }
856 elseif ($FIELD_VALUE == '')
857 $result[] = $this->_Empty($FIELD_NAME);
858 else
859 $result[] = $this->_StringEQ($FIELD_NAME, $FIELD_VALUE);
860 break;
861 case "E":
862 if (is_array($FIELD_VALUE))
863 $result[] = "(".$this->_Upper($FIELD_NAME)." like upper('".implode("') OR ".$this->_Upper($FIELD_NAME)." like upper('", $FIELD_VALUE)."'))";
864 elseif (is_object($FIELD_VALUE))
865 $result[] = $this->_ExprEQ($FIELD_NAME, $FIELD_VALUE);
866 elseif($FIELD_VALUE == '')
867 $result[] = $this->_Empty($FIELD_NAME);
868 else
869 {
870 //kinda optimization for digits only
871 if (preg_match("/[^0-9]/", $FIELD_VALUE))
872 $result[] = $this->_Upper($FIELD_NAME)." like upper('".$FIELD_VALUE."')";
873 else
874 $result[] = $this->_StringEQ($FIELD_NAME, $FIELD_VALUE);
875 }
876
877 if ($isMultiple)
878 $this->bDistinctReqired = true;
879 break;
880 case "S":
881 if (is_array($FIELD_VALUE))
882 $result[] = "(".$this->_Upper($FIELD_NAME)." like '%".implode("%' ESCAPE '!' OR ".$this->_Upper($FIELD_NAME)." like '%", $FIELD_VALUE)."%' ESCAPE '!')";
883 elseif (is_object($FIELD_VALUE))
884 $result[] = $this->_Upper($FIELD_NAME)." like ".$FIELD_VALUE->compile()." ESCAPE '!'";
885 elseif ($FIELD_VALUE == '')
886 $result[] = $this->_Empty($FIELD_NAME);
887 else
888 $result[] = $this->_Upper($FIELD_NAME)." like '%".$FIELD_VALUE."%' ESCAPE '!'";
889
890 if ($isMultiple)
891 $this->bDistinctReqired = true;
892 break;
893 case "M":
894 if (is_array($FIELD_VALUE))
895 $result[] = "(".$FIELD_NAME." like '".implode("' OR ".$FIELD_NAME." like '", $FIELD_VALUE)."')";
896 elseif (is_object($FIELD_VALUE))
897 $result[] = $this->_ExprEQ($FIELD_NAME, $FIELD_VALUE);
898 elseif ($FIELD_VALUE == '')
899 $result[] = $this->_Empty($FIELD_NAME);
900 else
901 {
902 //kinda optimization for digits only
903 if (preg_match("/[^0-9]/", $FIELD_VALUE))
904 $result[] = $FIELD_NAME." like '".$FIELD_VALUE."'";
905 else
906 $result[] = $this->_StringEQ($FIELD_NAME, $FIELD_VALUE);
907 }
908
909 if ($isMultiple)
910 $this->bDistinctReqired = true;
911 break;
912 case "NI":
913 if (is_array($FIELD_VALUE))
914 $result[] = $this->_StringNotIN($FIELD_NAME, $FIELD_VALUE);
915 elseif (is_object($FIELD_VALUE))
916 $result[] = $this->_ExprNotEQ($FIELD_NAME, $FIELD_VALUE);
917 elseif ($FIELD_VALUE == '')
918 $result[] = $this->_NotEmpty($FIELD_NAME);
919 else
920 $result[] = $this->_StringNotEQ($FIELD_NAME, $FIELD_VALUE);
921
922 if ($isMultiple)
923 $this->bDistinctReqired = true;
924 break;
925 case "N":
926 if (is_array($FIELD_VALUE))
927 $result[] = "(".$this->_Upper($FIELD_NAME)." not like upper('".implode("') AND ".$this->_Upper($FIELD_NAME)." not like upper('", $FIELD_VALUE)."'))";
928 elseif (is_object($FIELD_VALUE))
929 $result[] = $this->_Upper($FIELD_NAME)." not like ".$FIELD_VALUE->compile();
930 elseif ($FIELD_VALUE == '')
931 $result[] = $this->_NotEmpty($FIELD_NAME);
932 else
933 $result[] = $this->_Upper($FIELD_NAME)." not like upper('".$FIELD_VALUE."')";
934
935 if ($isMultiple)
936 $this->bDistinctReqired = true;
937 break;
938 case "NS":
939 if (is_array($FIELD_VALUE))
940 $result[] = "(".$this->_Upper($FIELD_NAME)." not like '%".implode("%' ESCAPE '!' AND ".$this->_Upper($FIELD_NAME)." not like '%", $FIELD_VALUE)."%' ESCAPE '!')";
941 elseif (is_object($FIELD_VALUE))
942 $result[] = $this->_Upper($FIELD_NAME)." not like ".$FIELD_VALUE->compile();
943 elseif ($FIELD_VALUE == '')
944 $result[] = $this->_NotEmpty($FIELD_NAME);
945 else
946 $result[] = $this->_Upper($FIELD_NAME)." not like '%".$FIELD_VALUE."%' ESCAPE '!'";
947
948 if ($isMultiple)
949 $this->bDistinctReqired = true;
950 break;
951 case "NM":
952 if(is_array($FIELD_VALUE))
953 $result[] = "(".$FIELD_NAME." not like '".implode("' AND ".$FIELD_NAME." not like '", $FIELD_VALUE)."')";
954 elseif (is_object($FIELD_VALUE))
955 $result[] = $FIELD_NAME." not like ".$FIELD_VALUE->compile();
956 elseif ($FIELD_VALUE == '')
957 $result[] = $this->_NotEmpty($FIELD_NAME);
958 else
959 $result[] = $FIELD_NAME." not like '".$FIELD_VALUE."'";
960
961 if ($isMultiple)
962 $this->bDistinctReqired = true;
963 break;
964 case "G":
965 if (is_array($FIELD_VALUE))
966 {
967 if (isset($FIELD_VALUE[0]))
968 {
969 $result[] = $FIELD_NAME." > '".$FIELD_VALUE[0]."'";
970 }
971 else
972 {
973 $result[] = "1=0";
974 }
975 }
976 elseif (is_object($FIELD_VALUE))
977 $result[] = $FIELD_NAME." > ".$FIELD_VALUE->compile();
978 else
979 $result[] = $FIELD_NAME." > '".$FIELD_VALUE."'";
980
981 if ($isMultiple)
982 $this->bDistinctReqired = true;
983 break;
984 case "L":
985 if (is_array($FIELD_VALUE))
986 {
987 if (isset($FIELD_VALUE[0]))
988 {
989 $result[] = $FIELD_NAME." < '".$FIELD_VALUE[0]."'";
990 }
991 else
992 {
993 $result[] = "1=0";
994 }
995 }
996 elseif (is_object($FIELD_VALUE))
997 $result[] = $FIELD_NAME." < ".$FIELD_VALUE->compile();
998 else
999 $result[] = $FIELD_NAME." < '".$FIELD_VALUE."'";
1000
1001 if ($isMultiple)
1002 $this->bDistinctReqired = true;
1003 break;
1004 case "GE":
1005 if (is_array($FIELD_VALUE))
1006 {
1007 if (isset($FIELD_VALUE[0]))
1008 {
1009 $result[] = $FIELD_NAME." >= '".$FIELD_VALUE[0]."'";
1010 }
1011 else
1012 {
1013 $result[] = "1=0";
1014 }
1015 }
1016 elseif (is_object($FIELD_VALUE))
1017 $result[] = $FIELD_NAME." >= ".$FIELD_VALUE->compile();
1018 else
1019 $result[] = $FIELD_NAME." >= '".$FIELD_VALUE."'";
1020
1021 if ($isMultiple)
1022 $this->bDistinctReqired = true;
1023 break;
1024 case "LE":
1025 if (is_array($FIELD_VALUE))
1026 {
1027 if (isset($FIELD_VALUE[0]))
1028 {
1029 $result[] = $FIELD_NAME." <= '".$FIELD_VALUE[0]."'";
1030 }
1031 else
1032 {
1033 $result[] = "1=0";
1034 }
1035 }
1036 elseif (is_object($FIELD_VALUE))
1037 $result[] = $FIELD_NAME." <= ".$FIELD_VALUE->compile();
1038 else
1039 $result[] = $FIELD_NAME." <= '".$FIELD_VALUE."'";
1040
1041 if ($isMultiple)
1042 $this->bDistinctReqired = true;
1043 break;
1044 case "B":
1045 if (is_array($FIELD_VALUE) && count($FIELD_VALUE) > 1)
1046 $result[] = $FIELD_NAME." between '".$FIELD_VALUE[0]."' AND '".$FIELD_VALUE[1]."'";
1047
1048 if ($isMultiple)
1049 $this->bDistinctReqired = true;
1050 break;
1051 case "NB":
1052 if (is_array($FIELD_VALUE) && count($FIELD_VALUE) > 1)
1053 $result[] = $FIELD_NAME." not between '".$FIELD_VALUE[0]."' AND '".$FIELD_VALUE[1]."'";
1054
1055 if ($isMultiple)
1056 $this->bDistinctReqired = true;
1057 break;
1058 case "?":
1059 if (is_scalar($FIELD_VALUE) && mb_strlen($FIELD_VALUE))
1060 {
1061 $q = GetFilterQuery($FIELD_NAME, $FIELD_VALUE);
1062 // Check if error ("0" was returned)
1063 if ($q !== '0')
1064 $result[] = $q;
1065 }
1066 break;
1067 case "IN":
1068 if(is_object($FIELD_VALUE))
1069 $result[] = $FIELD_NAME." IN (".$FIELD_VALUE->compile().")";
1070 elseif(is_array($FIELD_VALUE))
1071 $result[] = $FIELD_NAME." IN ('".implode("', '", $FIELD_VALUE)."')";
1072 else
1073 $result[] = $FIELD_NAME." IN ('".$FIELD_VALUE."')";
1074 break;
1075 case "NIN":
1076 if(is_object($FIELD_VALUE))
1077 $result[] = $FIELD_NAME." NOT IN (".$FIELD_VALUE->compile().")";
1078 elseif(is_array($FIELD_VALUE))
1079 $result[] = $FIELD_NAME." NOT IN ('".implode("', '", $FIELD_VALUE)."')";
1080 else
1081 $result[] = $FIELD_NAME." NOT IN ('".$FIELD_VALUE."')";
1082 break;
1083 case "FT":
1084 case "FTI":
1085 $part = $this->match($FIELD_NAME, $value, ($operation == "FT"));
1086 if($part <> '')
1087 {
1088 $result[] = $part;
1089
1090 if ($isMultiple)
1091 $this->bDistinctReqired = true;
1092 }
1093 break;
1094 case "FTL":
1095 $part = $this->matchLike($FIELD_NAME, $value);
1096 if($part <> '')
1097 {
1098 $result[] = $part;
1099
1100 if ($isMultiple)
1101 $this->bDistinctReqired = true;
1102 }
1103 break;
1104 }
1105 }
1106
1107 public function addDateFilter(&$result, $isMultiple, $FIELD_NAME, $operation, $value, $format)
1108 {
1109 global $DB;
1110
1111 if (is_array($value))
1112 {
1113 $FIELD_VALUE = array();
1114 foreach ($value as $val)
1115 {
1116 if ($val instanceof \Bitrix\Main\Type\Date)
1117 {
1118 $FIELD_VALUE[] = $DB->CharToDateFunction((string)$val, $format);
1119 }
1120 elseif (is_object($val))
1121 {
1122 $FIELD_VALUE[] = $val->compile();
1123 }
1124 elseif($val <> '')
1125 {
1126 $FIELD_VALUE[] = $DB->CharToDateFunction($val, $format);
1127 }
1128 else
1129 {
1130 $FIELD_VALUE[] = 'NULL';
1131 }
1132 }
1133 }
1134 elseif ($value instanceof \Bitrix\Main\Type\Date)
1135 {
1136 $FIELD_VALUE = $DB->CharToDateFunction((string)$value, $format);
1137 }
1138 elseif (is_object($value))
1139 {
1140 $FIELD_VALUE = $value->compile();
1141 }
1142 elseif($value <> '')
1143 {
1144 $FIELD_VALUE = $DB->CharToDateFunction($value, $format);
1145 }
1146 else
1147 {
1148 $FIELD_VALUE = 'NULL';
1149 }
1150
1151 switch($operation)
1152 {
1153 case "I":
1154 case "E":
1155 case "S":
1156 case "M":
1157 if (is_array($FIELD_VALUE))
1158 {
1159 $result[] = $FIELD_NAME." in (".implode(", ", $FIELD_VALUE).")";
1160 if ($isMultiple)
1161 $this->bDistinctReqired = true;
1162 }
1163 elseif ($value == '')
1164 $result[] = "(".$FIELD_NAME." IS NULL)";
1165 else
1166 $result[] = $FIELD_NAME." = ".$FIELD_VALUE;
1167 break;
1168 case "NI":
1169 case "N":
1170 case "NS":
1171 case "NM":
1172 if (is_array($FIELD_VALUE))
1173 $result[] = $FIELD_NAME." not in (".implode(", ", $FIELD_VALUE).")";
1174 elseif ($value == '')
1175 $result[] = "(".$FIELD_NAME." IS NOT NULL)";
1176 else
1177 $result[] = $FIELD_NAME." <> ".$FIELD_VALUE;
1178
1179 if ($isMultiple)
1180 $this->bDistinctReqired = true;
1181 break;
1182 case "G":
1183 if (is_array($FIELD_VALUE))
1184 {
1185 if (isset($FIELD_VALUE[0]))
1186 {
1187 $result[] = $FIELD_NAME." > ".$FIELD_VALUE[0];
1188 }
1189 else
1190 {
1191 $result[] = "1=0";
1192 }
1193 }
1194 else
1195 $result[] = $FIELD_NAME." > ".$FIELD_VALUE;
1196
1197 if ($isMultiple)
1198 $this->bDistinctReqired = true;
1199 break;
1200 case "L":
1201 if (is_array($FIELD_VALUE))
1202 {
1203 if (isset($FIELD_VALUE[0]))
1204 {
1205 $result[] = $FIELD_NAME." < ".$FIELD_VALUE[0];
1206 }
1207 else
1208 {
1209 $result[] = "1=0";
1210 }
1211 }
1212 else
1213 $result[] = $FIELD_NAME." < ".$FIELD_VALUE;
1214
1215 if ($isMultiple)
1216 $this->bDistinctReqired = true;
1217 break;
1218 case "GE":
1219 if (is_array($FIELD_VALUE))
1220 {
1221 if (isset($FIELD_VALUE[0]))
1222 {
1223 $result[] = $FIELD_NAME." >= ".$FIELD_VALUE[0];
1224 }
1225 else
1226 {
1227 $result[] = "1=0";
1228 }
1229 }
1230 else
1231 $result[] = $FIELD_NAME." >= ".$FIELD_VALUE;
1232
1233 if ($isMultiple)
1234 $this->bDistinctReqired = true;
1235 break;
1236 case "LE":
1237 if (is_array($FIELD_VALUE))
1238 {
1239 if (isset($FIELD_VALUE[0]))
1240 {
1241 $result[] = $FIELD_NAME." <= ".$FIELD_VALUE[0];
1242 }
1243 else
1244 {
1245 $result[] = "1=0";
1246 }
1247 }
1248 else
1249 $result[] = $FIELD_NAME." <= ".$FIELD_VALUE;
1250
1251 if ($isMultiple)
1252 $this->bDistinctReqired = true;
1253 break;
1254 case "B":
1255 if (is_array($FIELD_VALUE) && count($FIELD_VALUE) > 1)
1256 $result[] = $FIELD_NAME." between ".$FIELD_VALUE[0]." AND ".$FIELD_VALUE[1];
1257
1258 if ($isMultiple)
1259 $this->bDistinctReqired = true;
1260 break;
1261 case "NB":
1262 if (is_array($FIELD_VALUE) && count($FIELD_VALUE) > 1)
1263 $result[] = $FIELD_NAME." not between ".$FIELD_VALUE[0]." AND ".$FIELD_VALUE[1];
1264
1265 if ($isMultiple)
1266 $this->bDistinctReqired = true;
1267 break;
1268 case "IN":
1269 $result[] = $FIELD_NAME." IN (".$FIELD_VALUE->compile().")";
1270 break;
1271 }
1272 }
1273}
1274
1281{
1282 protected
1285
1286 protected
1288
1289 protected
1291
1292 public function __construct($expression, $args = null)
1293 {
1294 $this->expression = $expression;
1295
1296 if (!is_null($args))
1297 {
1298 $this->args = is_array($args) ? $args : array($args);
1299 }
1300
1301 global $DB;
1302 $this->DB = $DB;
1303 }
1304
1305 public function compile()
1306 {
1307 $this->i = -1;
1308
1309 // string (default), integer (i), float (f), numeric (n), date (d), time (t)
1310 $value = preg_replace_callback('/(?:[^\\\\]|^)(\?[#sifv]?)/', array($this, 'execPlaceholders'), $this->expression);
1311 $value = str_replace('\?', '?', $value);
1312
1313 return $value;
1314 }
1315
1316 protected function execPlaceholders($matches)
1317 {
1318 $this->i++;
1319
1320 $id = $matches[1];
1321
1322 if (isset($this->args[$this->i]))
1323 {
1324 $value = $this->args[$this->i];
1325
1326 if ($id == '?' || $id == '?s')
1327 {
1328 return "'" . $this->DB->ForSql($value) . "'";
1329 }
1330 elseif ($id == '?#')
1331 {
1333 $helper = $connection->getSqlHelper();
1334
1335 return $helper->quote($value);
1336 }
1337 elseif ($id == '?v')
1338 {
1340 $helper = $connection->getSqlHelper();
1341
1342 return $helper->values($value);
1343 }
1344 elseif ($id == '?i')
1345 {
1346 return (int) $value;
1347 }
1348 elseif ($id == '?f')
1349 {
1350 return (float) $value;
1351 }
1352 }
1353
1354 return $id;
1355 }
1356}
1357
1359{
1360}
$connection
Определения actionsdefinitions.php:38
static getConnection($name="")
Определения application.php:638
Определения sqlwhere.php:27
_Empty($field)
Определения sqlwhere.php:72
static getOperationByCode($code)
Определения sqlwhere.php:265
static GetMinTokenSize()
Определения sqlwhere.php:145
MakeOperation($key)
Определения sqlwhere.php:245
AddFields($arFields)
Определения sqlwhere.php:213
static $operations
Определения sqlwhere.php:41
SetFields($arFields)
Определения sqlwhere.php:239
addFloatFilter(&$result, $isMultiple, $FIELD_NAME, $operation, $value)
Определения sqlwhere.php:643
matchLike($field, $fieldValue)
Определения sqlwhere.php:180
match($field, $fieldValue, $wildcard)
Определения sqlwhere.php:150
addStringFilter(&$result, $isMultiple, $FIELD_NAME, $operation, $value)
Определения sqlwhere.php:813
_NotEmpty($field)
Определения sqlwhere.php:77
_NumberNotIN($field, $sql_values)
Определения sqlwhere.php:123
const FT_MIN_TOKEN_SIZE
Определения sqlwhere.php:28
addDateFilter(&$result, $isMultiple, $FIELD_NAME, $operation, $value, $format)
Определения sqlwhere.php:1107
GetJoins()
Определения sqlwhere.php:440
_Upper($field)
Определения sqlwhere.php:67
_StringIN($field, $sql_values)
Определения sqlwhere.php:95
GetQueryEx($arFilter, &$arJoins, $level=0)
Определения sqlwhere.php:284
$c_joins
Определения sqlwhere.php:37
$bDistinctReqired
Определения sqlwhere.php:39
ForLIKE($str)
Определения sqlwhere.php:458
_StringNotEQ($field, $sql_value)
Определения sqlwhere.php:90
_NumberIN($field, $sql_values)
Определения sqlwhere.php:115
static splitWords($string)
Определения sqlwhere.php:136
$fields
Определения sqlwhere.php:30
_StringNotIN($field, $sql_values)
Определения sqlwhere.php:100
GetQuery($arFilter)
Определения sqlwhere.php:272
_StringEQ($field, $sql_value)
Определения sqlwhere.php:85
_ExprNotEQ($field, $val)
Определения sqlwhere.php:110
addIntFilter(&$result, $isMultiple, $FIELD_NAME, $operation, $value)
Определения sqlwhere.php:466
_ExprEQ($field, $val)
Определения sqlwhere.php:105
$l_joins
Определения sqlwhere.php:38
compile()
Определения sqlwhere.php:1305
$expression
Определения sqlwhere.php:1283
$args
Определения sqlwhere.php:1284
execPlaceholders($matches)
Определения sqlwhere.php:1316
__construct($expression, $args=null)
Определения sqlwhere.php:1292
Определения sqlwhere.php:1359
$str
Определения commerceml2.php:63
$arFields
Определения dblapprove.php:5
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$res
Определения filter_act.php:7
GetFilterQuery($field, $val, $procent="Y", $ex_sep=array(), $clob="N", $div_fields="Y", $clob_upper="N")
Определения filter_tools.php:383
$result
Определения get_property_values.php:14
global $DB
Определения cron_frame.php:29
if(!is_null($config))($config as $configItem)(! $configItem->isVisible()) $code
Определения options.php:195
Определения arrayresult.php:2
$counter
Определения options.php:5
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
$ar
Определения options.php:199
if(empty($signedUserToken)) $key
Определения quickway.php:257
$i
Определения factura.php:643
</p ></td >< td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 2.0pt 0cm 2.0pt;height:9.0pt'>< p class=Normal align=center style='margin:0cm;margin-bottom:.0001pt;text-align:center;line-height:normal'>< a name=ТекстовоеПоле54 ></a ><?=($taxRate > count( $arTaxList) > 0) ? $taxRate."%"
Определения waybill.php:936
$val
Определения options.php:1793
$matches
Определения index.php:22
$arFilter
Определения user_search.php:106