/** * Given a related model id return a list of check items models. * @param integer $taskId */ public static function getByTask($taskId) { assert('is_int($taskId)'); $joinTablesAdapter = new RedBeanModelJoinTablesQueryAdapter('TaskCheckListItem'); $orderBySortColumnName = RedBeanModelDataProvider::resolveSortAttributeColumnName('TaskCheckListItem', $joinTablesAdapter, 'sortOrder'); $orderByColumnNameFallback = RedBeanModelDataProvider::resolveSortAttributeColumnName('TaskCheckListItem', $joinTablesAdapter, 'id'); $where = "task_id = '" . $taskId . "'"; $orderBy = $orderBySortColumnName . 'asc, ' . $orderByColumnNameFallback . ' desc'; return self::getSubset($joinTablesAdapter, null, null, $where, $orderBy); }
/** * Given a related model type, a related model id, and a page size, return a list of comment models. * @param string $type * @param integer $relatedId * @param integer $pageSize */ public static function getCommentsByRelatedModelTypeIdAndPageSize($type, $relatedId, $pageSize) { assert('is_string($type)'); assert('is_int($relatedId)'); assert('is_int($pageSize) || $pageSize = null'); $joinTablesAdapter = new RedBeanModelJoinTablesQueryAdapter('Comment'); $orderByColumnName = RedBeanModelDataProvider::resolveSortAttributeColumnName('Comment', $joinTablesAdapter, 'createdDateTime'); $where = "relatedmodel_type = '" . strtolower($type) . "' AND relatedmodel_id = '" . $relatedId . "'"; $orderBy = $orderByColumnName . ' desc'; return self::getSubset($joinTablesAdapter, null, $pageSize, $where, $orderBy); }
/** * This test specifically looks at when searching a note's owner. Because note extends mashableactivity which * does not have a bean, the query is constructed slightly different than if mashableactivity had a bean. */ public function testQueryIsProperlyGeneratedForNoteWithRelatedOwnerSearch() { Yii::app()->user->userModel = User::getByUsername('super'); $_FAKEPOST = array('Note' => array('owner' => array('id' => Yii::app()->user->userModel->id))); $metadataAdapter = new SearchDataProviderMetadataAdapter(new Note(false), 1, $_FAKEPOST['Note']); $_GET['Note_sort'] = 'description.desc'; $searchAttributeData = $metadataAdapter->getAdaptedMetadata(); $quote = DatabaseCompatibilityUtil::getQuote(); $joinTablesAdapter = new RedBeanModelJoinTablesQueryAdapter('Note'); $where = RedBeanModelDataProvider::makeWhere('Note', $searchAttributeData, $joinTablesAdapter); $orderByColumnName = RedBeanModelDataProvider::resolveSortAttributeColumnName('Note', $joinTablesAdapter, 'description'); $subsetSql = Note::makeSubsetOrCountSqlQuery('note', $joinTablesAdapter, 1, 5, $where, $orderByColumnName); $compareSubsetSql = "select {$quote}note{$quote}.{$quote}id{$quote} id "; $compareSubsetSql .= "from ({$quote}note{$quote}, {$quote}activity{$quote}, {$quote}ownedsecurableitem{$quote})"; $compareSubsetSql .= " where ({$quote}ownedsecurableitem{$quote}.{$quote}owner__user_id{$quote} = " . Yii::app()->user->userModel->id . ")"; $compareSubsetSql .= " and {$quote}activity{$quote}.{$quote}id{$quote} ="; $compareSubsetSql .= " {$quote}note{$quote}.{$quote}activity_id{$quote}"; $compareSubsetSql .= " and {$quote}ownedsecurableitem{$quote}.{$quote}id{$quote} = {$quote}activity{$quote}.{$quote}ownedsecurableitem_id{$quote}"; $compareSubsetSql .= " order by {$quote}note{$quote}.{$quote}description{$quote} limit 5 offset 1"; $this->assertEquals($compareSubsetSql, $subsetSql); }
/** * Public for testing purposes only. */ public static function makeUnionSql(array $modelClassNamesAndSearchAttributeData, array $modelClassNamesAndSortAttributes = null, $sortDescending = false, $offset = null, $limit = null) { assert('$modelClassNamesAndSortAttributes === null || count($modelClassNamesAndSortAttributes) == count($modelClassNamesAndSearchAttributeData)'); assert('is_bool($sortDescending)'); $sqlStatementsToUnion = array(); foreach ($modelClassNamesAndSearchAttributeData as $identifier => $modelClassNameAndSearchAttributeData) { foreach ($modelClassNameAndSearchAttributeData as $modelClassName => $searchAttributeData) { $joinTablesAdapter = new RedBeanModelJoinTablesQueryAdapter($modelClassName); $where = ModelDataProviderUtil::makeWhere($modelClassName, $searchAttributeData, $joinTablesAdapter); $orderByColumnName = null; $tableName = $modelClassName::getTableName($modelClassName); if ($modelClassNamesAndSortAttributes !== null) { if (isset($modelClassNamesAndSortAttributes[$modelClassName])) { $orderByColumnName = RedBeanModelDataProvider::resolveSortAttributeColumnName($modelClassName, $joinTablesAdapter, $modelClassNamesAndSortAttributes[$modelClassName]); } else { throw new notSupportedException(); } } $quotedExtraSelectColumnNameAndAliases = array(); $quotedExtraSelectColumnNameAndAliases["'" . $modelClassName . "'"] = 'modelClassName'; if ($orderByColumnName != null) { $quotedExtraSelectColumnNameAndAliases[$orderByColumnName] = 'orderByColumn'; } $sqlStatementsToUnion[] = $modelClassName::makeSubsetOrCountSqlQuery($tableName, $joinTablesAdapter, null, null, $where, null, false, $joinTablesAdapter->getSelectDistinct(), $quotedExtraSelectColumnNameAndAliases); } } $orderBy = null; if ($modelClassNamesAndSortAttributes !== null) { $orderBy = 'orderByColumn'; if ($sortDescending) { $orderBy .= ' desc'; } } return self::makeSubsetUnionSqlQuery($sqlStatementsToUnion, $offset, $limit, $orderBy); }
protected static function getLastCompletedJobLogByType($type) { assert('is_string($type) && $type != ""'); $searchAttributeData = array(); $searchAttributeData['clauses'] = array(1 => array('attributeName' => 'type', 'operatorType' => 'equals', 'value' => $type)); $searchAttributeData['structure'] = '1'; $joinTablesAdapter = new RedBeanModelJoinTablesQueryAdapter('JobLog'); $sort = RedBeanModelDataProvider::resolveSortAttributeColumnName('JobLog', $joinTablesAdapter, 'createdDateTime'); $where = RedBeanModelDataProvider::makeWhere('JobLog', $searchAttributeData, $joinTablesAdapter); $models = JobLog::getSubset($joinTablesAdapter, null, 1, $where, $sort . ' desc'); if (count($models) > 1) { throw new NotSupportedException(); } if (count($models) == 0) { return null; } return $models[0]; }
/** * See ModelDataProviderUtilTest->testResolveSortAttributeColumnName */ public function testResolveSortAttributeColumnName() { $quote = DatabaseCompatibilityUtil::getQuote(); //Test a standard non-relation attribute on I $joinTablesAdapter = new RedBeanModelJoinTablesQueryAdapter('I'); $sort = RedBeanModelDataProvider::resolveSortAttributeColumnName('I', $joinTablesAdapter, 'iMember'); $this->assertEquals("{$quote}i{$quote}.{$quote}imember{$quote}", $sort); $this->assertEquals(0, $joinTablesAdapter->getFromTableJoinCount()); $this->assertEquals(0, $joinTablesAdapter->getLeftTableJoinCount()); //Test a standard casted up attribute on H from I $joinTablesAdapter = new RedBeanModelJoinTablesQueryAdapter('I'); $sort = RedBeanModelDataProvider::resolveSortAttributeColumnName('I', $joinTablesAdapter, 'name'); $this->assertEquals("{$quote}h{$quote}.{$quote}name{$quote}", $sort); $this->assertEquals(1, $joinTablesAdapter->getFromTableJoinCount()); $this->assertEquals(0, $joinTablesAdapter->getLeftTableJoinCount()); //Test a relation attribute G->g from H $joinTablesAdapter = new RedBeanModelJoinTablesQueryAdapter('H'); $sort = RedBeanModelDataProvider::resolveSortAttributeColumnName('H', $joinTablesAdapter, 'castUpHasOne'); $this->assertEquals("{$quote}g{$quote}.{$quote}g{$quote}", $sort); $this->assertEquals(0, $joinTablesAdapter->getFromTableJoinCount()); $this->assertEquals(1, $joinTablesAdapter->getLeftTableJoinCount()); $leftTables = $joinTablesAdapter->getLeftTablesAndAliases(); $this->assertEquals('g', $leftTables[0]['tableName']); //Test a relation attribute G->g where casted up from I $joinTablesAdapter = new RedBeanModelJoinTablesQueryAdapter('I'); $sort = RedBeanModelDataProvider::resolveSortAttributeColumnName('I', $joinTablesAdapter, 'castUpHasOne'); $this->assertEquals("{$quote}g{$quote}.{$quote}g{$quote}", $sort); $this->assertEquals(1, $joinTablesAdapter->getFromTableJoinCount()); $this->assertEquals(1, $joinTablesAdapter->getLeftTableJoinCount()); $fromTables = $joinTablesAdapter->getFromTablesAndAliases(); $this->assertEquals('h', $fromTables[0]['tableName']); $leftTables = $joinTablesAdapter->getLeftTablesAndAliases(); $this->assertEquals('g', $leftTables[0]['tableName']); //Test a customField like TestCustomFieldsModel->industry $joinTablesAdapter = new RedBeanModelJoinTablesQueryAdapter('TestCustomFieldsModel'); $sort = RedBeanModelDataProvider::resolveSortAttributeColumnName('TestCustomFieldsModel', $joinTablesAdapter, 'industry'); $this->assertEquals("{$quote}customfield{$quote}.{$quote}value{$quote}", $sort); $this->assertEquals(0, $joinTablesAdapter->getFromTableJoinCount()); $this->assertEquals(1, $joinTablesAdapter->getLeftTableJoinCount()); $leftTables = $joinTablesAdapter->getLeftTablesAndAliases(); $this->assertEquals('customfield', $leftTables[0]['tableName']); }
/** * @depends testSortingModels */ public function testSortingRelatedOwnerAttribute() { Yii::app()->user->userModel = User::getByUsername('super'); $quote = DatabaseCompatibilityUtil::getQuote(); $joinTablesAdapter = new RedBeanModelJoinTablesQueryAdapter('Account'); $orderByColumnName = RedBeanModelDataProvider::resolveSortAttributeColumnName('Account', $joinTablesAdapter, 'owner'); $this->assertEquals("{$quote}person{$quote}.{$quote}lastname{$quote}", $orderByColumnName); $leftTablesAndAliases = $joinTablesAdapter->getLeftTablesAndAliases(); $this->assertEquals('person', $leftTablesAndAliases[1]['tableName']); $this->assertEquals('person', $leftTablesAndAliases[1]['tableAliasName']); $this->assertEquals('id', $leftTablesAndAliases[1]['tableJoinIdName']); $this->assertEquals('_user', $leftTablesAndAliases[1]['onTableAliasName']); $this->assertEquals('person_id', $leftTablesAndAliases[1]['onTableJoinIdName']); $subsetSql = Account::makeSubsetOrCountSqlQuery('account', $joinTablesAdapter, 1, 5, null, $orderByColumnName); $compareSubsetSql = "select {$quote}account{$quote}.{$quote}id{$quote} id "; $compareSubsetSql .= "from ({$quote}account{$quote}, {$quote}ownedsecurableitem{$quote}) "; $compareSubsetSql .= "left join {$quote}_user{$quote} on "; $compareSubsetSql .= "{$quote}_user{$quote}.{$quote}id{$quote} = {$quote}ownedsecurableitem{$quote}.{$quote}owner__user_id{$quote} "; $compareSubsetSql .= "left join {$quote}person{$quote} on "; $compareSubsetSql .= "{$quote}person{$quote}.{$quote}id{$quote} = {$quote}_user{$quote}.{$quote}person_id{$quote} "; $compareSubsetSql .= " where {$quote}ownedsecurableitem{$quote}.{$quote}id{$quote} = "; $compareSubsetSql .= "{$quote}account{$quote}.{$quote}ownedsecurableitem_id{$quote} "; $compareSubsetSql .= "order by {$quote}person{$quote}.{$quote}lastname{$quote} limit 5 offset 1"; $this->assertEquals($compareSubsetSql, $subsetSql); }
/** * @param $moduleClassName * @return Array of SavedWorkflow models */ public static function getAllByModuleClassName($moduleClassName) { assert('is_string($moduleClassName)'); $searchAttributeData = array(); $searchAttributeData['clauses'] = array(1 => array('attributeName' => 'moduleClassName', 'operatorType' => 'equals', 'value' => $moduleClassName)); $searchAttributeData['structure'] = '1'; $joinTablesAdapter = new RedBeanModelJoinTablesQueryAdapter('SavedWorkflow'); $where = RedBeanModelDataProvider::makeWhere('SavedWorkflow', $searchAttributeData, $joinTablesAdapter); $orderBy = RedBeanModelDataProvider::resolveSortAttributeColumnName('SavedWorkflow', $joinTablesAdapter, 'order'); return self::getSubset($joinTablesAdapter, null, null, $where, $orderBy); }