use of io.crate.execution.dsl.projection.GroupProjection in project crate by crate.
the class ProjectorsTest method testProjectionsWithCorrectGranularityAreApplied.
@Test
public void testProjectionsWithCorrectGranularityAreApplied() {
GroupProjection groupProjection = new GroupProjection(new ArrayList<>(), new ArrayList<>(), AggregateMode.ITER_FINAL, RowGranularity.SHARD);
FilterProjection filterProjection = new FilterProjection(new InputColumn(0), Collections.emptyList());
filterProjection.requiredGranularity(RowGranularity.DOC);
Projectors projectors = new Projectors(Arrays.asList(filterProjection, groupProjection), UUID.randomUUID(), CoordinatorTxnCtx.systemTransactionContext(), RamAccounting.NO_ACCOUNTING, memoryManager, projectorFactory);
assertThat(projectors.providesIndependentScroll(), is(true));
assertThat(projectors.projectors.size(), is(1));
assertThat(projectors.projectors.get(0), instanceOf(GroupingProjector.class));
}
use of io.crate.execution.dsl.projection.GroupProjection in project crate by crate.
the class DocValuesGroupByOptimizedIterator method tryOptimize.
@Nullable
static BatchIterator<Row> tryOptimize(Functions functions, IndexShard indexShard, DocTableInfo table, LuceneQueryBuilder luceneQueryBuilder, FieldTypeLookup fieldTypeLookup, DocInputFactory docInputFactory, RoutedCollectPhase collectPhase, CollectTask collectTask) {
if (Symbols.containsColumn(collectPhase.toCollect(), DocSysColumns.SCORE) || Symbols.containsColumn(collectPhase.where(), DocSysColumns.SCORE)) {
return null;
}
Collection<? extends Projection> shardProjections = shardProjections(collectPhase.projections());
GroupProjection groupProjection = getSinglePartialGroupProjection(shardProjections);
if (groupProjection == null) {
return null;
}
ArrayList<Reference> columnKeyRefs = new ArrayList<>(groupProjection.keys().size());
for (var key : groupProjection.keys()) {
var docKeyRef = getKeyRef(collectPhase.toCollect(), key);
if (docKeyRef == null) {
// group by on non-reference
return null;
}
var columnKeyRef = (Reference) DocReferences.inverseSourceLookup(docKeyRef);
var keyFieldType = fieldTypeLookup.get(columnKeyRef.column().fqn());
if (keyFieldType == null || !keyFieldType.hasDocValues()) {
return null;
} else {
columnKeyRefs.add(columnKeyRef);
}
}
// noinspection rawtypes
List<DocValueAggregator> aggregators = DocValuesAggregates.createAggregators(functions, groupProjection.values(), collectPhase.toCollect(), collectTask.txnCtx().sessionSettings().searchPath(), table);
if (aggregators == null) {
return null;
}
ShardId shardId = indexShard.shardId();
SharedShardContext sharedShardContext = collectTask.sharedShardContexts().getOrCreateContext(shardId);
var searcher = sharedShardContext.acquireSearcher("group-by-doc-value-aggregates: " + formatSource(collectPhase));
collectTask.addSearcher(sharedShardContext.readerId(), searcher);
QueryShardContext queryShardContext = sharedShardContext.indexService().newQueryShardContext();
InputFactory.Context<? extends LuceneCollectorExpression<?>> docCtx = docInputFactory.getCtx(collectTask.txnCtx());
List<LuceneCollectorExpression<?>> keyExpressions = new ArrayList<>();
for (var keyRef : columnKeyRefs) {
keyExpressions.add((LuceneCollectorExpression<?>) docCtx.add(keyRef));
}
LuceneQueryBuilder.Context queryContext = luceneQueryBuilder.convert(collectPhase.where(), collectTask.txnCtx(), indexShard.mapperService(), indexShard.shardId().getIndexName(), queryShardContext, table, sharedShardContext.indexService().cache());
if (columnKeyRefs.size() == 1) {
return GroupByIterator.forSingleKey(aggregators, searcher.item(), columnKeyRefs.get(0), keyExpressions, collectTask.getRamAccounting(), collectTask.memoryManager(), collectTask.minNodeVersion(), queryContext.query(), new CollectorContext(sharedShardContext.readerId()));
} else {
return GroupByIterator.forManyKeys(aggregators, searcher.item(), columnKeyRefs, keyExpressions, collectTask.getRamAccounting(), collectTask.memoryManager(), collectTask.minNodeVersion(), queryContext.query(), new CollectorContext(sharedShardContext.readerId()));
}
}
use of io.crate.execution.dsl.projection.GroupProjection in project crate by crate.
the class GroupByScalarPlannerTest method testGroupByWithScalarPlan.
@Test
public void testGroupByWithScalarPlan() throws Exception {
Merge merge = e.plan("select id + 1 from users group by id");
Collect collect = (Collect) merge.subPlan();
RoutedCollectPhase collectPhase = ((RoutedCollectPhase) collect.collectPhase());
assertEquals(DataTypes.LONG, collectPhase.outputTypes().get(0));
assertThat(collectPhase.maxRowGranularity(), is(RowGranularity.DOC));
assertThat(collectPhase.projections().size(), is(2));
assertThat(collectPhase.projections().get(0), instanceOf(GroupProjection.class));
assertThat(collectPhase.projections().get(0).requiredGranularity(), is(RowGranularity.SHARD));
assertThat(collectPhase.projections().get(1), instanceOf(EvalProjection.class));
assertThat(collectPhase.projections().get(1).outputs().get(0), instanceOf(Function.class));
assertThat(collectPhase.toCollect(), contains(isReference("id", DataTypes.LONG)));
GroupProjection groupProjection = (GroupProjection) collectPhase.projections().get(0);
assertThat(groupProjection.keys().get(0).valueType(), is(DataTypes.LONG));
assertThat(collectPhase.projections().get(1).outputs(), contains(isFunction("add")));
MergePhase mergePhase = merge.mergePhase();
assertEquals(DataTypes.LONG, mergePhase.inputTypes().iterator().next());
assertEquals(DataTypes.LONG, mergePhase.outputTypes().get(0));
}
Aggregations