/** * Gets the classes whose objects the user can execute certain action * * @param $action object - The action that the user should be allowed to do * @param $user User - The user that holds de permissions * @return Array - an array of class objects */ function &findByPermission($action, $user) { $classQuery = new Query("Class"); // Navigate relationships $folderClassQuery =& $classQuery->queryRelationedClass("FolderClass"); $permissionQuery =& $folderClassQuery->queryRelationedClass("Permission"); $actionQuery =& $permissionQuery->queryRelationedClass("Action", Relationship::ManyToOneType()); $roleQuery =& $permissionQuery->queryRelationedClass("Role", Relationship::ManyToOneType()); $roleUserQuery =& $roleQuery->queryRelationedClass("RoleUser"); $userQuery =& $roleUserQuery->queryRelationedClass("User", Relationship::ManyToOneType()); // Criterias $criteriaGroup = new CriteriaGroup(); $actionCriteria = new Criteria($actionQuery, "action", $action->getAction()); $userCriteria = new Criteria($userQuery, "ID", $user->getId()); $criteriaGroup->addCriterion($actionCriteria); $criteriaGroup->addCriterion($userCriteria); $classQuery->setCriterion($criteriaGroup); // sorting $order = new Order($classQuery, "title", "ASC"); $classQuery->addOrder($order); // Execute the query $recordset =& $classQuery->execute(); $array = $this->mapAll($recordset); return $array; }
/** * Gets the folders for a user to do certain action. * * @param $action Action - that the user intends to do * @param $user User - the user that tries to get his folders. * @return Array - vector of folder objects */ function &findByPermission($action, $user) { $folderQuery = $this->newQueryObject(); $folderClassQuery =& $folderQuery->queryRelationedClass("FolderClass"); $permissionQuery =& $folderClassQuery->queryRelationedClass("Permission"); $actionQuery =& $permissionQuery->queryRelationedClass("Action", Relationship::ManyToOneType()); $roleQuery =& $permissionQuery->queryRelationedClass("Role", Relationship::ManyToOneType()); $roleUserQuery =& $roleQuery->queryRelationedClass("RoleUser"); $criteriaGroup = new CriteriaGroup(); $actionCriteria = new Criteria($actionQuery, "action", $action->getAction()); $criteriaGroup->addCriterion($actionCriteria); $userCriteria = new Criteria($roleUserQuery, "userID", $user->getId()); $criteriaGroup->addCriterion($userCriteria); // Set the criterion $folderQuery->setCriterion($criteriaGroup); // Execute return $this->mapAll($folderQuery->execute()); }
public function eagerFetching(DbFetcher $oQuery, ObjectMapper $oParentMapper, $sPrefix, $aParams = array(), $aLocalParams = array()) { if (isset($this->aParams['ToModuleAlias'])) { Core::import('Modules.' . $this->aParams['ToModuleAlias']); } $oMapper = Manager::getInstance()->getMapper($this->aParams['ToMapperAlias']); //echo '<pre>', print_r($oMapper, true), '</pre>'; die(); $aContainer = $oMapper->getContainer(); if ($oMapper) { $oParentFields = $oParentMapper->getFields(); $oQuery->addJoinTable($aContainer['TableName'], $sPrefix . '_' . $this->getAlias(), DbFetcher::JOIN_LEFT, $sPrefix . '.' . $oParentFields->get($this->getField())->getField() . ' = ' . $sPrefix . '_' . $this->getAlias() . '.id'); $oFields = $oMapper->getFields(); foreach ($oFields as $alias => $field) { if ($field->getType() != 'Object' && $field->getField()) { $oQuery->addSelectField($sPrefix . '_' . $this->getAlias() . '.' . $field->getField(), $sPrefix . '_' . $this->getAlias() . '_' . $field->getField()); } } // Условия выборки if (isset($aLocalParams['Criteria']) && is_object($aLocalParams['Criteria'])) { $oQuery->addCriteria(call_user_func(array($aLocalParams['Criteria'], 'renderWhere'))); } if (isset($aLocalParams['Criteria']) && is_array($aLocalParams['Criteria']) && count($aLocalParams['Criteria']) > 0) { $oCriteria = new CriteriaGroup(Criteria::TYPE_AND); foreach ($aLocalParams['Criteria'] as $k => $itm) { if (is_object($itm)) { $oCriteria->addElement($itm); } else { if (is_array($itm)) { $oCriteria->addElement(new CriteriaElement($k, $itm['Type'], $itm['Value'])); } else { $oCriteria->addElement(new CriteriaElement($k, '=', $itm)); } } } $oQuery->addCriteria($oMapper->parseFindCriteria($oCriteria->renderWhere(), $sPrefix . '_' . $this->getAlias())); } if (isset($aLocalParams['Criteria']) && is_string($aLocalParams['Criteria'])) { $oQuery->addCriteria($oMapper->parseFindCriteria($aLocalParams['Criteria'], $sPrefix . '_' . $this->getAlias())); } // Сортировка if (isset($aLocalParams['Order']) && is_array($aLocalParams['Order']) && count($aLocalParams['Order']) > 0) { foreach ($aLocalParams['Order'] as $k => $itm) { $oQuery->addOrder($oMapper->parseFindField($k, $sPrefix . '_' . $this->getAlias()), $itm); } } if (isset($aLocalParams['With']) && is_array($aLocalParams['With']) && count($aLocalParams['With'])) { // TODO: Вложенные JOINы } } return $oQuery; }
/** * Searches objects by text parameters * @param $classId Id of the class * @param $text Text to lookup in the objects * @param $fullTextSearch if true, the text is searched in all text fields and every coincidence is returned. * If false, it is only looked up in the title. */ function findByText($classId, $text, $fullTextSearch, $folderId = -1) { $objectQuery = new Query("Object"); $criteriaGroup = new CriteriaGroup(CriteriaGroup::getAndSeparator()); // Lookup by class... $criteria = new Criteria($objectQuery, "classID", $classId); $criteriaGroup->addCriterion($criteria); if ($folderId != -1 && $folderId != null) { // Lookup by folder... $objectFolderQuery =& $objectQuery->queryRelationedClass("ObjectFolder"); $folderCriteria = new Criteria($objectFolderQuery, "folderID", $folderId); $criteriaGroup->addCriterion($folderCriteria); } // ... and criterias sent if ($fullTextSearch) { // by fullTextIndex $criteria = new Criteria($objectQuery, "fullTextIndex", $text, Criteria::likeType()); $criteriaGroup->addCriterion($criteria); } else { // Issue a query to ObjectAttribute entity $objectAttributeQuery =& $objectQuery->queryRelationedClass("ObjectAttribute"); // Get the class $baseClassMapper = new BaseClassMapper(); $class = $baseClassMapper->get($classId); /* @var $class BaseClass */ // Get the fields that compose the title $titleClassAttributesArray = $class->getTitleClassAttributes(); // We need to query all title fields using the given value with OR (anyone can match) $criteriaGroupTitle = new CriteriaGroup(CriteriaGroup::getOrSeparator()); foreach ($titleClassAttributesArray as $titleClassAttribute) { // Must belong to the given class and LIKE the given title $criteriaGroupItem = new CriteriaGroup(); /* @var $titleClassAttribute ClassAttribute */ $criteriaGroupItem->addCriterion($criteria); $criteria = new Criteria($objectAttributeQuery, "classAttributeId", $titleClassAttribute->getId()); $criteriaGroupItem->addCriterion($criteria); $criteria = new Criteria($objectAttributeQuery, "value", $text, Criteria::likeType()); $criteriaGroupItem->addCriterion($criteria); $criteriaGroupTitle->addCriterion($criteriaGroupItem); } // Set the title criteria $criteriaGroup->addCriterion($criteriaGroupTitle); } $objectQuery->setCriterion($criteriaGroup); // Execute the query and map the results $objectMapper = new ObjectMapper(); $rv = $objectMapper->mapAll($objectQuery->execute()); return $rv; }
$criteria = new Criteria($classQuery, "className", "news"); $query->setCriterion($criteria); echo "Resulting query: " . $query->getQueryString() . "<br/>"; assert("SELECT DISTINCT ##Object.* FROM ##Object LEFT OUTER JOIN ##Class ON ##Object.ID = ##Class.ObjectID WHERE ##Class.className = 'news'" == $query->getQueryString()); echo "Query with CriteriaGroup instead of only one Criteria<br/>"; $query = new Query("object"); $criteriaGroup = new CriteriaGroup(CriteriaGroup::getAndSeparator()); $criteria = new Criteria($query, "hits", "10", Criteria::lessEqualThanType()); $criteriaGroup->addCriterion($criteria); $criteria = new Criteria($query, "hits", "1", Criteria::moreEqualThanType()); $criteriaGroup->addCriterion($criteria); $query->setCriterion($criteriaGroup); echo "Resulting query: " . $query->getQueryString() . "<br/>"; echo "Query with multiples Criteria Groups and an order<br/>"; $query = new Query("object"); $criteriaGroupRoot = new CriteriaGroup(CriteriaGroup::getAndSeparator()); $criteriaGroupOne = new CriteriaGroup(CriteriaGroup::getAndSeparator()); $criteria = new Criteria($query, "created", "2005-04-15", Criteria::lessThanType()); $criteriaGroupOne->addCriterion($criteria); $criteriaGroupTwo = new CriteriaGroup(CriteriaGroup::getOrSeparator()); $criteria = new Criteria($query, "updatedBy", "1"); $criteriaGroupTwo->addCriterion($criteria); $criteria = new Criteria($query, "updatedBy", "2"); $criteriaGroupTwo->addCriterion($criteria); $criteriaGroupRoot->addCriterion($criteriaGroupOne); $criteriaGroupRoot->addCriterion($criteriaGroupTwo); $query->setCriterion($criteriaGroupRoot); $order = new Order($query, "hits", Order::OrderTypeAsc()); $query->addOrder($order); echo "Resulting query: " . $query->getQueryString() . "<br/>"; $rs = $query->execute();
public function deleteByParams($aParams = array()) { $aContainer = $this->getContainer(); $sClassName = $this->sModelAlias; $oQuery = new DbUpdater(DbUpdater::TYPE_DELETE, $this->tableName(), $sClassName, $this->getDbConnectionAlias()); // Условия выборки if (isset($aParams['Criteria']) && is_object($aParams['Criteria'])) { $oQuery->addCriteria($aParams['Criteria']->renderWhere()); } if (isset($aParams['Criteria']) && is_array($aParams['Criteria']) && count($aParams['Criteria']) > 0) { $oCriteria = new CriteriaGroup('AND'); foreach ($aParams['Criteria'] as $k => $itm) { if (is_object($itm)) { $oCriteria->addElement($itm); } else { if (is_array($itm)) { $oCriteria->addElement(new CriteriaElement($k, $itm['Type'], $itm['Value'])); } else { $oCriteria->addElement(new CriteriaElement($k, '=', $itm)); } } } $oQuery->addCriteria($this->parseUpdateCriteria($oCriteria->renderWhere())); } return $oQuery->delete(); }
public function eagerFetching(DbFetcher $oQuery, ObjectMapper $oParentMapper, $sPrefix, $aParams = array(), $aLocalParams = array()) { $oMapper = Manager::getInstance()->getMapper($this->aParams['ToMapperAlias']); if ($oMapper) { $oQuery->addJoinTable($this->aParams['TableName'], $this->getAlias(), DbFetcher::JOIN_LEFT, $sPrefix . '.id' . ' = ' . $this->getAlias() . '.' . $this->aParams['Field2']); // Условия выборки if (isset($aLocalParams['Criteria']) && is_object($aLocalParams['Criteria'])) { $oQuery->addCriteria(call_user_func(array($aLocalParams['Criteria'], 'renderWhere'))); } if (isset($aLocalParams['Criteria']) && is_array($aLocalParams['Criteria']) && count($aLocalParams['Criteria']) > 0) { $oCriteria = new CriteriaGroup(Criteria::TYPE_AND); foreach ($aLocalParams['Criteria'] as $k => $itm) { if (is_object($itm)) { $oCriteria->addElement($itm); } else { if (is_array($itm)) { $oCriteria->addElement(new CriteriaElement($k, $itm['Type'], $itm['Value'])); } else { $oCriteria->addElement(new CriteriaElement($k, '=', $itm)); } } } $oQuery->addCriteria($oMapper->parseFindCriteria($oCriteria->renderWhere(), $sPrefix . '_' . $this->getAlias())); } if (isset($aLocalParams['Criteria']) && is_string($aLocalParams['Criteria'])) { $oQuery->addCriteria($oMapper->parseFindCriteria($aLocalParams['Criteria'], $sPrefix . '_' . $this->getAlias())); } // Сортировка if (isset($aLocalParams['Order']) && is_array($aLocalParams['Order']) && count($aLocalParams['Order']) > 0) { foreach ($aLocalParams['Order'] as $k => $itm) { $oQuery->addOrder($oMapper->parseFindField($k, $sPrefix . '_' . $this->getAlias()), $itm); } } if (isset($aLocalParams['With']) && is_array($aLocalParams['With']) && count($aLocalParams['With'])) { // TODO: Вложенные JOINы } } return $oQuery; }