/** * Test aggregation support. */ public function testAggregation() { // Apply a simple groupby. $this->queryResult = $this->factory->getAggregate('entity_test')->groupBy('user_id')->execute(); $this->assertResults(array(array('user_id' => 1), array('user_id' => 2), array('user_id' => 3))); $function_expected = array(); $function_expected['count'] = array(array('id_count' => 6)); $function_expected['min'] = array(array('id_min' => 1)); $function_expected['max'] = array(array('id_max' => 6)); $function_expected['sum'] = array(array('id_sum' => 21)); $function_expected['avg'] = array(array('id_avg' => 21.0 / 6.0)); // Apply a simple aggregation for different aggregation functions. foreach ($function_expected as $aggregation_function => $expected) { $this->queryResult = $this->factory->getAggregate('entity_test')->aggregate('id', $aggregation_function)->execute(); $this->assertEqual($this->queryResult, $expected); } // Apply aggregation and groupby on the same query. $this->queryResult = $this->factory->getAggregate('entity_test')->aggregate('id', 'COUNT')->groupBy('user_id')->execute(); $this->assertResults(array(array('user_id' => 1, 'id_count' => 1), array('user_id' => 2, 'id_count' => 3), array('user_id' => 3, 'id_count' => 2))); // Apply aggregation and a condition which matches. $this->queryResult = $this->factory->getAggregate('entity_test')->aggregate('id', 'COUNT')->groupBy('id')->conditionAggregate('id', 'COUNT', 8)->execute(); $this->assertResults(array()); // Don't call aggregate to test the implicit aggregate call. $this->queryResult = $this->factory->getAggregate('entity_test')->groupBy('id')->conditionAggregate('id', 'COUNT', 8)->execute(); $this->assertResults(array()); // Apply aggregation and a condition which matches. $this->queryResult = $this->factory->getAggregate('entity_test')->aggregate('id', 'count')->groupBy('id')->conditionAggregate('id', 'COUNT', 6)->execute(); $this->assertResults(array(array('id_count' => 6))); // Apply aggregation, a groupby and a condition which matches partially via // the operator '='. $this->queryResult = $this->factory->getAggregate('entity_test')->aggregate('id', 'count')->conditionAggregate('id', 'count', 2)->groupBy('user_id')->execute(); $this->assertResults(array(array('id_count' => 2, 'user_id' => 3))); // Apply aggregation, a groupby and a condition which matches partially via // the operator '>'. $this->queryResult = $this->factory->getAggregate('entity_test')->aggregate('id', 'count')->conditionAggregate('id', 'COUNT', 1, '>')->groupBy('user_id')->execute(); $this->assertResults(array(array('id_count' => 2, 'user_id' => 3), array('id_count' => 3, 'user_id' => 2))); // Apply aggregation and a sort. This might not be useful, but have a proper // test coverage. $this->queryResult = $this->factory->getAggregate('entity_test')->aggregate('id', 'COUNT')->sortAggregate('id', 'COUNT')->execute(); $this->assertSortedResults(array(array('id_count' => 6))); // Don't call aggregate to test the implicit aggregate call. $this->queryResult = $this->factory->getAggregate('entity_test')->sortAggregate('id', 'COUNT')->execute(); $this->assertSortedResults(array(array('id_count' => 6))); // Apply aggregation, groupby and a sort descending. $this->queryResult = $this->factory->getAggregate('entity_test')->aggregate('id', 'COUNT')->groupBy('user_id')->sortAggregate('id', 'COUNT', 'DESC')->execute(); $this->assertSortedResults(array(array('user_id' => 2, 'id_count' => 3), array('user_id' => 3, 'id_count' => 2), array('user_id' => 1, 'id_count' => 1))); // Apply aggregation, groupby and a sort ascending. $this->queryResult = $this->factory->getAggregate('entity_test')->aggregate('id', 'COUNT')->groupBy('user_id')->sortAggregate('id', 'COUNT', 'ASC')->execute(); $this->assertSortedResults(array(array('user_id' => 1, 'id_count' => 1), array('user_id' => 3, 'id_count' => 2), array('user_id' => 2, 'id_count' => 3))); // Apply aggregation, groupby, an aggregation condition and a sort with the // operator '='. $this->queryResult = $this->factory->getAggregate('entity_test')->aggregate('id', 'COUNT')->groupBy('user_id')->sortAggregate('id', 'COUNT')->conditionAggregate('id', 'COUNT', 2)->execute(); $this->assertSortedResults(array(array('id_count' => 2, 'user_id' => 3))); // Apply aggregation, groupby, an aggregation condition and a sort with the // operator '<' and order ASC. $this->queryResult = $this->factory->getAggregate('entity_test')->aggregate('id', 'COUNT')->groupBy('user_id')->sortAggregate('id', 'COUNT', 'ASC')->conditionAggregate('id', 'COUNT', 3, '<')->execute(); $this->assertSortedResults(array(array('id_count' => 1, 'user_id' => 1), array('id_count' => 2, 'user_id' => 3))); // Apply aggregation, groupby, an aggregation condition and a sort with the // operator '<' and order DESC. $this->queryResult = $this->factory->getAggregate('entity_test')->aggregate('id', 'COUNT')->groupBy('user_id')->sortAggregate('id', 'COUNT', 'DESC')->conditionAggregate('id', 'COUNT', 3, '<')->execute(); $this->assertSortedResults(array(array('id_count' => 2, 'user_id' => 3), array('id_count' => 1, 'user_id' => 1))); // Test aggregation/groupby support for fieldapi fields. // Just group by a fieldapi field. $this->queryResult = $this->factory->getAggregate('entity_test')->groupBy('field_test_1')->execute(); $this->assertResults(array(array('field_test_1' => 1), array('field_test_1' => 2), array('field_test_1' => 3))); // Group by a fieldapi field and aggregate a normal property. $this->queryResult = $this->factory->getAggregate('entity_test')->aggregate('user_id', 'COUNT')->groupBy('field_test_1')->execute(); $this->assertResults(array(array('field_test_1' => 1, 'user_id_count' => 2), array('field_test_1' => 2, 'user_id_count' => 3), array('field_test_1' => 3, 'user_id_count' => 1))); // Group by a normal property and aggregate a fieldapi field. $this->queryResult = $this->factory->getAggregate('entity_test')->aggregate('field_test_1', 'COUNT')->groupBy('user_id')->execute(); $this->assertResults(array(array('user_id' => 1, 'field_test_1_count' => 1), array('user_id' => 2, 'field_test_1_count' => 3), array('user_id' => 3, 'field_test_1_count' => 2))); $this->queryResult = $this->factory->getAggregate('entity_test')->aggregate('field_test_1', 'SUM')->groupBy('user_id')->execute(); $this->assertResults(array(array('user_id' => 1, 'field_test_1_sum' => 1), array('user_id' => 2, 'field_test_1_sum' => 5), array('user_id' => 3, 'field_test_1_sum' => 5))); // Aggregate by two different fieldapi fields. $this->queryResult = $this->factory->getAggregate('entity_test')->aggregate('field_test_1', 'SUM')->aggregate('field_test_2', 'SUM')->groupBy('user_id')->execute(); $this->assertResults(array(array('user_id' => 1, 'field_test_1_sum' => 1, 'field_test_2_sum' => 2), array('user_id' => 2, 'field_test_1_sum' => 5, 'field_test_2_sum' => 16), array('user_id' => 3, 'field_test_1_sum' => 5, 'field_test_2_sum' => 10))); // This time aggregate the same field twice. $this->queryResult = $this->factory->getAggregate('entity_test')->aggregate('field_test_1', 'SUM')->aggregate('field_test_1', 'COUNT')->groupBy('user_id')->execute(); $this->assertResults(array(array('user_id' => 1, 'field_test_1_sum' => 1, 'field_test_1_count' => 1), array('user_id' => 2, 'field_test_1_sum' => 5, 'field_test_1_count' => 3), array('user_id' => 3, 'field_test_1_sum' => 5, 'field_test_1_count' => 2))); // Group by and aggregate by a fieldapi field. $this->queryResult = $this->factory->getAggregate('entity_test')->groupBy('field_test_1')->aggregate('field_test_2', 'COUNT')->execute(); $this->assertResults(array(array('field_test_1' => 1, 'field_test_2_count' => 2), array('field_test_1' => 2, 'field_test_2_count' => 3), array('field_test_1' => 3, 'field_test_2_count' => 1))); // Group by and aggregate by a fieldapi field and use multiple aggregate // functions. $this->queryResult = $this->factory->getAggregate('entity_test')->groupBy('field_test_1')->aggregate('field_test_2', 'COUNT')->aggregate('field_test_2', 'SUM')->execute(); $this->assertResults(array(array('field_test_1' => 1, 'field_test_2_count' => 2, 'field_test_2_sum' => 9), array('field_test_1' => 2, 'field_test_2_count' => 3, 'field_test_2_sum' => 11), array('field_test_1' => 3, 'field_test_2_count' => 1, 'field_test_2_sum' => 8))); // Apply an aggregate condition for a fieldapi field and group by a simple // property. $this->queryResult = $this->factory->getAggregate('entity_test')->conditionAggregate('field_test_1', 'COUNT', 3)->groupBy('user_id')->execute(); $this->assertResults(array(array('user_id' => 2, 'field_test_1_count' => 3), array('user_id' => 3, 'field_test_1_count' => 2))); $this->queryResult = $this->factory->getAggregate('entity_test')->aggregate('field_test_1', 'SUM')->conditionAggregate('field_test_1', 'COUNT', 2, '>')->groupBy('user_id')->execute(); $this->assertResults(array(array('user_id' => 2, 'field_test_1_sum' => 5, 'field_test_1_count' => 3), array('user_id' => 3, 'field_test_1_sum' => 5, 'field_test_1_count' => 2))); // Apply an aggregate condition for a simple property and a group by a // fieldapi field. $this->queryResult = $this->factory->getAggregate('entity_test')->conditionAggregate('user_id', 'COUNT', 2)->groupBy('field_test_1')->execute(); $this->assertResults(array(array('field_test_1' => 1, 'user_id_count' => 2))); $this->queryResult = $this->factory->getAggregate('entity_test')->conditionAggregate('user_id', 'COUNT', 2, '>')->groupBy('field_test_1')->execute(); $this->assertResults(array(array('field_test_1' => 1, 'user_id_count' => 2), array('field_test_1' => 2, 'user_id_count' => 3))); // Apply an aggregate condition and a group by fieldapi fields. $this->queryResult = $this->factory->getAggregate('entity_test')->groupBy('field_test_1')->conditionAggregate('field_test_2', 'COUNT', 2)->execute(); $this->assertResults(array(array('field_test_1' => 1, 'field_test_2_count' => 2))); $this->queryResult = $this->factory->getAggregate('entity_test')->groupBy('field_test_1')->conditionAggregate('field_test_2', 'COUNT', 2, '>')->execute(); $this->assertResults(array(array('field_test_1' => 1, 'field_test_2_count' => 2), array('field_test_1' => 2, 'field_test_2_count' => 3))); // Apply an aggregate condition and a group by fieldapi fields with multiple // conditions via AND. $this->queryResult = $this->factory->getAggregate('entity_test')->groupBy('field_test_1')->conditionAggregate('field_test_2', 'COUNT', 2)->conditionAggregate('field_test_2', 'SUM', 8)->execute(); $this->assertResults(array()); // Apply an aggregate condition and a group by fieldapi fields with multiple // conditions via OR. $this->queryResult = $this->factory->getAggregate('entity_test', 'OR')->groupBy('field_test_1')->conditionAggregate('field_test_2', 'COUNT', 2)->conditionAggregate('field_test_2', 'SUM', 8)->execute(); $this->assertResults(array(array('field_test_1' => 1, 'field_test_2_count' => 2, 'field_test_2_sum' => 9), array('field_test_1' => 3, 'field_test_2_count' => 1, 'field_test_2_sum' => 8))); // Group by a normal property and aggregate a fieldapi field and sort by the // groupby field. $this->queryResult = $this->factory->getAggregate('entity_test')->aggregate('field_test_1', 'COUNT')->groupBy('user_id')->sort('user_id', 'DESC')->execute(); $this->assertSortedResults(array(array('user_id' => 3, 'field_test_1_count' => 2), array('user_id' => 2, 'field_test_1_count' => 3), array('user_id' => 1, 'field_test_1_count' => 1))); $this->queryResult = $this->factory->getAggregate('entity_test')->aggregate('field_test_1', 'COUNT')->groupBy('user_id')->sort('user_id', 'ASC')->execute(); $this->assertSortedResults(array(array('user_id' => 1, 'field_test_1_count' => 1), array('user_id' => 2, 'field_test_1_count' => 3), array('user_id' => 3, 'field_test_1_count' => 2))); $this->queryResult = $this->factory->getAggregate('entity_test')->conditionAggregate('field_test_1', 'COUNT', 2, '>')->groupBy('user_id')->sort('user_id', 'ASC')->execute(); $this->assertSortedResults(array(array('user_id' => 2, 'field_test_1_count' => 3), array('user_id' => 3, 'field_test_1_count' => 2))); // Group by a normal property, aggregate a fieldapi field, and sort by the // aggregated field. $this->queryResult = $this->factory->getAggregate('entity_test')->sortAggregate('field_test_1', 'COUNT', 'DESC')->groupBy('user_id')->execute(); $this->assertSortedResults(array(array('user_id' => 2, 'field_test_1_count' => 3), array('user_id' => 3, 'field_test_1_count' => 2), array('user_id' => 1, 'field_test_1_count' => 1))); $this->queryResult = $this->factory->getAggregate('entity_test')->sortAggregate('field_test_1', 'COUNT', 'ASC')->groupBy('user_id')->execute(); $this->assertSortedResults(array(array('user_id' => 1, 'field_test_1_count' => 1), array('user_id' => 3, 'field_test_1_count' => 2), array('user_id' => 2, 'field_test_1_count' => 3))); // Group by and aggregate by fieldapi field, and sort by the groupby field. $this->queryResult = $this->factory->getAggregate('entity_test')->groupBy('field_test_1')->aggregate('field_test_2', 'COUNT')->sort('field_test_1', 'ASC')->execute(); $this->assertSortedResults(array(array('field_test_1' => 1, 'field_test_2_count' => 2), array('field_test_1' => 2, 'field_test_2_count' => 3), array('field_test_1' => 3, 'field_test_2_count' => 1))); $this->queryResult = $this->factory->getAggregate('entity_test')->groupBy('field_test_1')->aggregate('field_test_2', 'COUNT')->sort('field_test_1', 'DESC')->execute(); $this->assertSortedResults(array(array('field_test_1' => 3, 'field_test_2_count' => 1), array('field_test_1' => 2, 'field_test_2_count' => 3), array('field_test_1' => 1, 'field_test_2_count' => 2))); // Groupy and aggregate by fieldapi field, and sort by the aggregated field. $this->queryResult = $this->factory->getAggregate('entity_test')->groupBy('field_test_1')->sortAggregate('field_test_2', 'COUNT', 'DESC')->execute(); $this->assertSortedResults(array(array('field_test_1' => 2, 'field_test_2_count' => 3), array('field_test_1' => 1, 'field_test_2_count' => 2), array('field_test_1' => 3, 'field_test_2_count' => 1))); $this->queryResult = $this->factory->getAggregate('entity_test')->groupBy('field_test_1')->sortAggregate('field_test_2', 'COUNT', 'ASC')->execute(); $this->assertSortedResults(array(array('field_test_1' => 3, 'field_test_2_count' => 1), array('field_test_1' => 1, 'field_test_2_count' => 2), array('field_test_1' => 2, 'field_test_2_count' => 3))); }