public function testDisplayCalculationInferredRelationModelAttributeWithCastingHintToNotCastDowButAlsoWithFullCastDown()
 {
     $q = DatabaseCompatibilityUtil::getQuote();
     $joinTablesAdapter = new RedBeanModelJoinTablesQueryAdapter('Meeting');
     $selectQueryAdapter = new RedBeanModelSelectQueryAdapter();
     $builder = new DisplayAttributesReportQueryBuilder($joinTablesAdapter, $selectQueryAdapter);
     $displayAttribute = new DisplayAttributeForReportForm('MeetingsModule', 'Meeting', Report::TYPE_SUMMATION);
     $displayAttribute->attributeIndexOrDerivedType = 'Account__activityItems__Inferred___createdDateTime__Maximum';
     $displayAttribute2 = new DisplayAttributeForReportForm('MeetingsModule', 'Meeting', Report::TYPE_SUMMATION);
     $displayAttribute2->attributeIndexOrDerivedType = 'Account__activityItems__Inferred___name';
     $content = $builder->makeQueryContent(array($displayAttribute, $displayAttribute2));
     $compareContent = "select max({$q}item{$q}.{$q}createddatetime{$q}) col0, " . "{$q}account{$q}.{$q}id{$q} accountid ";
     $this->assertEquals($compareContent, $content);
     $leftTablesAndAliases = $joinTablesAdapter->getLeftTablesAndAliases();
     $fromTablesAndAliases = $joinTablesAdapter->getFromTablesAndAliases();
     $this->assertEquals(1, $joinTablesAdapter->getFromTableJoinCount());
     $this->assertEquals(5, $joinTablesAdapter->getLeftTableJoinCount());
     $this->assertEquals('activity_item', $leftTablesAndAliases[0]['tableAliasName']);
     $this->assertEquals('activity', $leftTablesAndAliases[0]['onTableAliasName']);
     $this->assertEquals('item', $leftTablesAndAliases[1]['tableAliasName']);
     $this->assertEquals('activity_item', $leftTablesAndAliases[1]['onTableAliasName']);
     $this->assertEquals('securableitem', $leftTablesAndAliases[2]['tableAliasName']);
     $this->assertEquals('item', $leftTablesAndAliases[2]['onTableAliasName']);
     $this->assertEquals('ownedsecurableitem', $leftTablesAndAliases[3]['tableAliasName']);
     $this->assertEquals('securableitem', $leftTablesAndAliases[3]['onTableAliasName']);
     $this->assertEquals('account', $leftTablesAndAliases[4]['tableAliasName']);
     $this->assertEquals('ownedsecurableitem', $leftTablesAndAliases[4]['onTableAliasName']);
 }
 /**
  * After work on reporting branch, this test was breaking.  So we switched the test to show left joins as
  * 0.  This might be ok, just depends how you are using the adapter. Normally you would add more
  * filters in which case a join would be added if you are filtering on something specific with industry
  * @depends testResolveShouldAddFromTableWithAttributeOnModelSameTable
  */
 public function testResolveShouldAddFromTableWithOwnedCustomFieldAttribute()
 {
     $adapter = new RedBeanModelAttributeToDataProviderAdapter('Account', 'industry');
     $joinTablesAdapter = new RedBeanModelJoinTablesQueryAdapter('Account');
     $builder = new ModelWhereAndJoinBuilder($adapter, $joinTablesAdapter, true);
     $tableAliasName = $builder->resolveJoins();
     $this->assertEquals(0, $joinTablesAdapter->getFromTableJoinCount());
     $this->assertEquals(0, $joinTablesAdapter->getLeftTableJoinCount());
     $adapter = new RedBeanModelAttributeToDataProviderAdapter('Account', 'industry');
     $joinTablesAdapter = new RedBeanModelJoinTablesQueryAdapter('Account');
     $builder = new ModelWhereAndJoinBuilder($adapter, $joinTablesAdapter, false);
     $tableAliasName = $builder->resolveJoins();
     $this->assertEquals(0, $joinTablesAdapter->getFromTableJoinCount());
     $this->assertEquals(0, $joinTablesAdapter->getLeftTableJoinCount());
 }
 public function testAddLeftTableAndGetAliasNameWithSpecifiedOnTableAliasName()
 {
     $quote = DatabaseCompatibilityUtil::getQuote();
     $adapter = new RedBeanModelJoinTablesQueryAdapter('QueryFromModel');
     $alias = $adapter->addLeftTableAndGetAliasName('zz', 'joinid');
     $this->assertEquals('zz', $alias);
     $this->assertEquals(0, $adapter->getFromTableJoinCount());
     $this->assertEquals(1, $adapter->getLeftTableJoinCount());
     $fromPart = $adapter->getJoinFromQueryPart();
     $joinPart = $adapter->getJoinQueryPart();
     $wherePart = $adapter->getJoinWhereQueryPart();
     $compareFromPart = null;
     $compareJoinPart = "left join {$quote}zz{$quote} ";
     $compareJoinPart .= "on {$quote}zz{$quote}.{$quote}id{$quote} = {$quote}queryfrommodel{$quote}.{$quote}joinid{$quote} ";
     $compareWherePart = null;
     $this->assertEquals($compareFromPart, $fromPart);
     $this->assertEquals($compareJoinPart, $joinPart);
     $this->assertEquals($compareWherePart, $wherePart);
     //Now add a specified onTableAliasName
     $alias = $adapter->addLeftTableAndGetAliasName('xyz', 'ajoinid', 'zz');
     $this->assertEquals('xyz', $alias);
     $this->assertEquals(0, $adapter->getFromTableJoinCount());
     $this->assertEquals(2, $adapter->getLeftTableJoinCount());
     $fromPart = $adapter->getJoinFromQueryPart();
     $joinPart = $adapter->getJoinQueryPart();
     $wherePart = $adapter->getJoinWhereQueryPart();
     $compareFromPart = null;
     $compareJoinPart = "left join {$quote}zz{$quote} ";
     $compareJoinPart .= "on {$quote}zz{$quote}.{$quote}id{$quote} = {$quote}queryfrommodel{$quote}.{$quote}joinid{$quote} ";
     $compareJoinPart .= "left join {$quote}xyz{$quote} ";
     $compareJoinPart .= "on {$quote}xyz{$quote}.{$quote}id{$quote} = {$quote}zz{$quote}.{$quote}ajoinid{$quote} ";
     $compareWherePart = null;
     $this->assertEquals($compareFromPart, $fromPart);
     $this->assertEquals($compareJoinPart, $joinPart);
     $this->assertEquals($compareWherePart, $wherePart);
 }
 public function testInferredRelationModelAttributeWithCastingHintToNotCastDownSoFarWithItemAttribute()
 {
     $q = DatabaseCompatibilityUtil::getQuote();
     $joinTablesAdapter = new RedBeanModelJoinTablesQueryAdapter('Meeting');
     $builder = new FiltersReportQueryBuilder($joinTablesAdapter, '1');
     $filter = new FilterForReportForm('MeetingsModule', 'Meeting', Report::TYPE_ROWS_AND_COLUMNS);
     $filter->attributeIndexOrDerivedType = 'Account__activityItems__Inferred___ReadOptimization';
     $content = $builder->makeQueryContent(array($filter));
     $compareContent = "({$q}ownedsecurableitem{$q}.{$q}securableitem_id{$q} = (select securableitem_id " . "from {$q}account_read{$q} where {$q}securableitem_id{$q} = {$q}ownedsecurableitem" . "{$q}.{$q}securableitem_id{$q} and {$q}munge_id{$q} in ('U" . self::$superUserId . "', 'G" . self::$everyoneGroupId . "') limit 1))";
     $this->assertEquals($compareContent, $content);
     $this->assertEquals(1, $joinTablesAdapter->getFromTableJoinCount());
     $this->assertEquals(4, $joinTablesAdapter->getLeftTableJoinCount());
 }
 public function testInferredRelationModelAttributeWithCastingHintToNotCastDowButAlsoWithFullCastDown()
 {
     $q = DatabaseCompatibilityUtil::getQuote();
     $joinTablesAdapter = new RedBeanModelJoinTablesQueryAdapter('Meeting');
     $builder = new OrderBysReportQueryBuilder($joinTablesAdapter);
     $orderBy = new OrderByForReportForm('MeetingsModule', 'Meeting', Report::TYPE_ROWS_AND_COLUMNS);
     $orderBy->attributeIndexOrDerivedType = 'Account__activityItems__Inferred___createdDateTime';
     $orderBy2 = new OrderByForReportForm('MeetingsModule', 'Meeting', Report::TYPE_ROWS_AND_COLUMNS);
     $orderBy2->attributeIndexOrDerivedType = 'Account__activityItems__Inferred___name';
     $content = $builder->makeQueryContent(array($orderBy, $orderBy2));
     $compareContent = "{$q}item{$q}.{$q}createddatetime{$q} asc, " . "{$q}account{$q}.{$q}name{$q} asc";
     $this->assertEquals($compareContent, $content);
     $leftTablesAndAliases = $joinTablesAdapter->getLeftTablesAndAliases();
     $fromTablesAndAliases = $joinTablesAdapter->getFromTablesAndAliases();
     $this->assertEquals(1, $joinTablesAdapter->getFromTableJoinCount());
     $this->assertEquals(5, $joinTablesAdapter->getLeftTableJoinCount());
     $this->assertEquals('activity_item', $leftTablesAndAliases[0]['tableAliasName']);
     $this->assertEquals('activity', $leftTablesAndAliases[0]['onTableAliasName']);
     $this->assertEquals('item', $leftTablesAndAliases[1]['tableAliasName']);
     $this->assertEquals('activity_item', $leftTablesAndAliases[1]['onTableAliasName']);
     $this->assertEquals('securableitem', $leftTablesAndAliases[2]['tableAliasName']);
     $this->assertEquals('item', $leftTablesAndAliases[2]['onTableAliasName']);
     $this->assertEquals('ownedsecurableitem', $leftTablesAndAliases[3]['tableAliasName']);
     $this->assertEquals('securableitem', $leftTablesAndAliases[3]['onTableAliasName']);
     $this->assertEquals('account', $leftTablesAndAliases[4]['tableAliasName']);
     $this->assertEquals('ownedsecurableitem', $leftTablesAndAliases[4]['onTableAliasName']);
 }
 public function testCreatedDateTimeFilterWithInferredRelationModelAttributeAsDisplay()
 {
     $q = DatabaseCompatibilityUtil::getQuote();
     $selectQueryAdapter = new RedBeanModelSelectQueryAdapter();
     $joinTablesAdapter = new RedBeanModelJoinTablesQueryAdapter('Meeting');
     $builder = new DisplayAttributesReportQueryBuilder($joinTablesAdapter, $selectQueryAdapter, Report::CURRENCY_CONVERSION_TYPE_ACTUAL);
     $displayAttribute = new DisplayAttributeForReportForm('MeetingsModule', 'Meeting', Report::TYPE_ROWS_AND_COLUMNS);
     $displayAttribute->attributeIndexOrDerivedType = 'Account__activityItems__Inferred___name';
     $builder->makeQueryContent(array($displayAttribute));
     $builder = new FiltersReportQueryBuilder($joinTablesAdapter, '1');
     $filter = new FilterForReportForm('MeetingsModule', 'Meeting', Report::TYPE_ROWS_AND_COLUMNS);
     $filter->attributeIndexOrDerivedType = 'createdDateTime';
     $filter->valueType = MixedDateTypesSearchFormAttributeMappingRules::TYPE_BETWEEN;
     $filter->value = '1991-05-05';
     $filter->secondValue = '1991-06-05';
     $filter->availableAtRunTime = true;
     $content = $builder->makeQueryContent(array($filter));
     $compareContent = "((({$q}item1{$q}.{$q}createddatetime{$q} >= '1991-05-05 00:00:00') " . "and ({$q}item1{$q}.{$q}createddatetime{$q} <= '1991-06-05 23:59:59')))";
     $this->assertEquals($compareContent, $content);
     $this->assertEquals(4, $joinTablesAdapter->getFromTableJoinCount());
     $this->assertEquals(5, $joinTablesAdapter->getLeftTableJoinCount());
     $builder = new FiltersReportQueryBuilder($joinTablesAdapter, 'not 1');
     $content = $builder->makeQueryContent(array($filter));
     $compareContent = "(not (({$q}item1{$q}.{$q}createddatetime{$q} >= '1991-05-05 00:00:00') " . "and ({$q}item1{$q}.{$q}createddatetime{$q} <= '1991-06-05 23:59:59')))";
     $this->assertEquals($compareContent, $content);
 }
 public function testHasManyForHasManyBelongsToOnCastedUpModel()
 {
     $q = DatabaseCompatibilityUtil::getQuote();
     $joinTablesAdapter = new RedBeanModelJoinTablesQueryAdapter('ReportModelTestItem9');
     $builder = new GroupBysReportQueryBuilder($joinTablesAdapter);
     $groupBy = new GroupByForReportForm('ReportsTestModule', 'ReportModelTestItem9', Report::TYPE_SUMMATION);
     $groupBy->attributeIndexOrDerivedType = 'reportModelTestItem9s___owner__User';
     $content = $builder->makeQueryContent(array($groupBy));
     $compareContent = "{$q}_user{$q}.{$q}id{$q}";
     $this->assertEquals($compareContent, $content);
     $leftTablesAndAliases = $joinTablesAdapter->getLeftTablesAndAliases();
     $fromTablesAndAliases = $joinTablesAdapter->getFromTablesAndAliases();
     $this->assertEquals(0, $joinTablesAdapter->getFromTableJoinCount());
     $this->assertEquals(3, $joinTablesAdapter->getLeftTableJoinCount());
     $this->assertEquals('reportmodeltestitem91', $leftTablesAndAliases[0]['tableAliasName']);
     $this->assertEquals('reportmodeltestitem9', $leftTablesAndAliases[0]['onTableAliasName']);
     $this->assertEquals('ownedsecurableitem', $leftTablesAndAliases[1]['tableAliasName']);
     $this->assertEquals('reportmodeltestitem91', $leftTablesAndAliases[1]['onTableAliasName']);
     $this->assertEquals('id', $leftTablesAndAliases[1]['tableJoinIdName']);
     $this->assertEquals('_user', $leftTablesAndAliases[2]['tableAliasName']);
     $this->assertEquals('ownedsecurableitem', $leftTablesAndAliases[2]['onTableAliasName']);
 }
 /**
  * Tag cloud should utilize a sub-query as part of its query.
  */
 public function testASingleTagCloudAttributeWithEqualsOperator()
 {
     $q = DatabaseCompatibilityUtil::getQuote();
     $joinTablesAdapter = new RedBeanModelJoinTablesQueryAdapter('ReportModelTestItem');
     $builder = new FiltersReportQueryBuilder($joinTablesAdapter, '1');
     $filter = new FilterForReportForm('ReportsTestModule', 'ReportModelTestItem', Report::TYPE_ROWS_AND_COLUMNS);
     $filter->attributeIndexOrDerivedType = 'tagCloud';
     $filter->value = 'a';
     $filter->operator = OperatorRules::TYPE_EQUALS;
     $content = $builder->makeQueryContent(array($filter));
     $leftTablesAndAliases = $joinTablesAdapter->getLeftTablesAndAliases();
     $fromTablesAndAliases = $joinTablesAdapter->getFromTablesAndAliases();
     $compareContent = "((1 = (select 1 from {$q}customfieldvalue{$q} customfieldvalue where " . "{$q}customfieldvalue{$q}.{$q}multiplevaluescustomfield_id{$q} = {$q}" . "multiplevaluescustomfield{$q}.id and {$q}customfieldvalue{$q}.{$q}value{$q}" . " = 'a' limit 1)))";
     $this->assertEquals($compareContent, $content);
     $this->assertEquals(0, $joinTablesAdapter->getFromTableJoinCount());
     $this->assertEquals(1, $joinTablesAdapter->getLeftTableJoinCount());
     $this->assertEquals('multiplevaluescustomfield', $leftTablesAndAliases[0]['tableAliasName']);
     $this->assertEquals('reportmodeltestitem', $leftTablesAndAliases[0]['onTableAliasName']);
 }