public function checkComplexQuery($expr) { $left = $expr->left(); $right = $expr->right(); $oCriteria = array(); if (DefaultOpCollection::isBoolean($expr)) { //$query = '(' . $this->buildComplexQuery($left) . ' ' . $expr->op() . ' ' . $this->buildComplexQuery($right) . ')'; $iCriteria = $this->checkComplexQuery($left); if (!empty($iCriteria)) { //$oCriteria = $iCriteria; $oCriteria[] = $iCriteria; } $iCriteria = $this->checkComplexQuery($right); if (!empty($iCriteria)) { //$oCriteria = array_merge($oCriteria, $iCriteria); $oCriteria[] = $iCriteria; } /*if ($expr->not()) { $query = "NOT $query"; }*/ } else { $fieldname = $left->getField(); $value = addslashes($right->getValue()); //$not = $expr->not()?' NOT ':''; if (empty($value)) { // minor hack to prevent the case of 'field:'. results are no 'field:""' $value = ' '; } $rsField = DBUtil::getResultArray("SELECT * FROM document_fields WHERE name = \"{$fieldname}\";"); if ($rsField[0]['data_type'] == 'LARGE TEXT') { $iCriteria = array(); $iCriteria[0] = array(); $iCriteria[0]['field'] = $fieldname; $iCriteria[0]['value'] = $value; $iCriteria[0]['not'] = $expr->not(); $oCriteria[] = $iCriteria[0]; } //global $default; //$default->log->debug("FIELD-TYPE: " . $iCriteria[0]['field']); //$default->log->debug("FIELD-TYPE: " . $oCriteria[0]['field']); /*if (strpos($value, ' ') === false) { $query = "$not$fieldname:$value"; } else { $query = "$not$fieldname:\"$value\""; }*/ } return $oCriteria; }
public function is_valid() { return DefaultOpCollection::validateParent($this, DefaultOpCollection::$is); }
/** * Enter description here... * * @param OpExpr $left * @param ExprOp $op * @param OpExpr $right * @param boolean $not */ public function transform(&$left, &$op, &$right, &$not) { if (!$left->isOpExpr() || !$right->isOpExpr() || !DefaultOpCollection::isBoolean($op)) { return; } if ($left->isTextOnly() && $right->isDBonly()) { // we just swap the items around, to ease other transformations $tmp = $left; $left = $right; $right = $tmp; return; } if ($op != $right->op() || !DefaultOpCollection::isBoolean($right)) { return; } if ($op == ExprOp::OP_OR && ($not || $right->not())) { // NOTE: we can't transform. e.g. // db or !(db or txt) => db or !db and !txt // so nothing to do // BUT: db and !(db and txt) => db and !db and !txt return; } $rightLeft = $right->left(); $rightRight = $right->right(); if ($left->isDBonly() && $rightLeft->isDBonly()) { $newLeft = new OpExpr($left, $op, $rightLeft); $right = $rightRight; $left = $newLeft; return; } if ($left->isTextOnly() && $rightRight->isTextOnly()) { $newRight = new OpExpr($left, $op, $rightRight); $left = $rightLeft; $right = $newRight; return; } }