Example #1
0
 public function testBuildWhereStatement()
 {
     $condition = new Condition();
     $condition->add('testColumn', 11);
     $condition2 = new Condition(ConditionInterface::DISJUNCTION);
     $condition2->add('testColumn2', ['test', 'test2', 'test3']);
     $condition2->add('testColumn3', 'test', ArgumentInterface::NOT_EQUAL);
     $condition2->add('testColumn3', 'test', ArgumentInterface::NOTNULL);
     $condition2->add('testColumn3 = "test"', '', ArgumentInterface::OWN);
     $condition2->add('testColumn', [1, 2], ArgumentInterface::NOT_EQUAL);
     $condition->addCondition($condition2);
     static::assertEquals('(testColumn = 11) AND ((testColumn2 IN ("test","test2","test3")) OR (testColumn3 != "test") OR (testColumn3 IS NOT NULL) OR (testColumn3 = "test") OR (testColumn NOT IN (1,2)))', $this->sqlBuilder->buildWhereStatement($this->metadata, $condition));
 }
Example #2
0
 /**
  * @param array $entityIDs
  *
  * @return array
  */
 protected function applySearch(array $entityIDs)
 {
     $condition = new Condition(ConditionInterface::DISJUNCTION);
     foreach ($this->searchFilter as $searchText) {
         foreach (static::$fieldValueColumns as $fieldId => $fieldColumn) {
             $condition->addCondition((new Condition())->addArgument(new Argument($fieldColumn, '%' . $searchText . '%', ArgumentInterface::LIKE))->addArgument(new Argument(\samsoncms\api\MaterialField::F_FIELDID, $fieldId)));
         }
     }
     return $this->query->entity(\samsoncms\api\MaterialField::class)->whereCondition($condition)->where(Material::F_PRIMARY, $entityIDs)->fields(Material::F_PRIMARY);
 }
Example #3
0
 /**
 * Find additional field database record by Name or ID.
 * This is generic method that should be used in nested classes to find its
 * records by some its primary key value.
 *
 * @param QueryInterface $query Query object instance
 * @param string         $nameOrID Additional field name or identifier
 * @param self $return Variable to return found database record
 *
 *@return bool|null|self  Field instance or null if 3rd parameter not passed
 */
 public static function byNameOrID(QueryInterface $query, $nameOrID, self &$return = null)
 {
     // Create id or URL condition
     $idOrUrl = new Condition('OR');
     $idOrUrl->add('FieldID', $nameOrID)->add('Name', $nameOrID);
     // Perform query
     $return = $query->entity(get_called_class())->whereCondition($idOrUrl)->first();
     // If only one argument is passed - return null, otherwise bool
     return func_num_args() > 1 ? $return == null : $return;
 }
Example #4
0
 /**
  * Try to find all materials which have fields similar to search strings
  *
  * @param array $filteredIds Collection of filtered material identifiers
  *
  * @return bool True if ALL field filtering succeeded or there was no filtering at all otherwise false
  */
 protected function applySearchFilter(&$filteredIds = array())
 {
     /** @var array $fields Variable to store all fields related to set navigation */
     $fields = array();
     /** @var array $navigationArray Array of set navigation identifiers */
     $navigationArray = array();
     /** @var array $fieldFilter Array of filtered material identifiers via materialfield table */
     $fieldFilter = array();
     /** @var array $materialFilter Array of filtered material identifiers via material table */
     $materialFilter = array();
     // If there are at least one search string
     if (!empty($this->search)) {
         // Create array containing all navigation identifiers
         foreach ($this->navigation as $navigation) {
             // Navigation hook for searching action
             $navigation = is_array($navigation) ? $navigation : array($navigation);
             $navigationArray = array_merge($navigationArray, $navigation);
         }
         // Get all related fields
         $this->query->entity('\\samson\\activerecord\\structurefield')->where('StructureID', $navigationArray)->groupBy('FieldID')->fields('FieldID', $fields);
         // Iterate over search strings
         foreach ($this->search as $searchString) {
             // Try to find search value in materialfield table
             $this->query->entity('\\samson\\activerecord\\materialfield')->where('FieldID', $fields)->where('MaterialID', $filteredIds)->where('Value', '%' . $searchString . '%', Relation::LIKE)->where('Active', 1)->groupBy('MaterialID')->fields('MaterialID', $fieldFilter);
             // TODO: Add generic support for all native fields or their configuration
             // Condition to search in material table by Name and URL
             $materialCondition = new Condition('OR');
             $materialCondition->add('Name', '%' . $searchString . '%', Relation::LIKE)->add('Url', '%' . $searchString . '%', Relation::LIKE);
             // Try to find search value in material table
             $this->query->entity('\\samson\\activerecord\\material')->whereCondition($materialCondition)->where('Active', 1);
             // If we have not empty collection of filtering identifiers
             if (count($filteredIds)) {
                 $this->query->where('MaterialID', $filteredIds);
             }
             $materialFilter = $this->query->fields('MaterialID');
             // If there are no materials with specified conditions
             if (empty($materialFilter) && empty($fieldFilter) && count($materialFilter) != 0 && count($fieldFilter != 0)) {
                 // Filter applying failed
                 return false;
             } else {
                 // Otherwise set filtered material identifiers
                 $filteredIds = array_unique(array_merge($materialFilter, $fieldFilter));
             }
         }
     }
     // We have no search collection filters
     return true;
 }
Example #5
0
 /**
  * Build correct localized field request for retrieving additional fields records.
  *
  * @param Field[] $fields Collection of additional fields
  *
  * @return Condition Built condition for query
  */
 protected function fieldsCondition($fields)
 {
     // Group fields by localization
     $localizedColumns = array();
     $notLocalizedColumns = array();
     /** @var Field $field Iterate table columns(fields) */
     foreach ($fields as $field) {
         if ($field->localized()) {
             $localizedColumns[] = $field->id;
         } else {
             $notLocalizedColumns[] = $field->id;
         }
     }
     // Create field condition
     $fieldsCondition = new Condition(ConditionInterface::DISJUNCTION);
     // Create localized condition
     if (count($localizedColumns)) {
         $localizedCondition = new Condition(ConditionInterface::CONJUNCTION);
         $localizedCondition->add(Field::F_PRIMARY, $localizedColumns)->add(MaterialField::F_LOCALE, $this->locale);
         // Add this condition to condition group
         $fieldsCondition->addCondition($localizedCondition);
     }
     // Create not localized condition
     if (count($notLocalizedColumns)) {
         $fieldsCondition->add(Field::F_PRIMARY, $notLocalizedColumns);
     }
     return $fieldsCondition;
 }