use of io.crate.execution.dsl.projection.ColumnIndexWriterProjection in project crate by crate.
the class InsertFromSubQueryPlanner method plan.
public static LogicalPlan plan(AnalyzedInsertStatement statement, PlannerContext plannerContext, LogicalPlanner logicalPlanner, SubqueryPlanner subqueryPlanner) {
if (statement.outputs() != null && !plannerContext.clusterState().getNodes().getMinNodeVersion().onOrAfter(Version.V_4_2_0)) {
throw new UnsupportedFeatureException(RETURNING_VERSION_ERROR_MSG);
}
List<Reference> targetColsExclPartitionCols = new ArrayList<>(statement.columns().size() - statement.tableInfo().partitionedBy().size());
for (Reference column : statement.columns()) {
if (statement.tableInfo().partitionedBy().contains(column.column())) {
continue;
}
targetColsExclPartitionCols.add(column);
}
List<Symbol> columnSymbols = InputColumns.create(targetColsExclPartitionCols, new InputColumns.SourceSymbols(statement.columns()));
// if fields are null default to number of rows imported
var outputs = statement.outputs() == null ? List.of(new InputColumn(0, DataTypes.LONG)) : statement.outputs();
ColumnIndexWriterProjection indexWriterProjection = new ColumnIndexWriterProjection(statement.tableInfo().ident(), null, statement.tableInfo().primaryKey(), statement.columns(), targetColsExclPartitionCols, columnSymbols, statement.isIgnoreDuplicateKeys(), statement.onDuplicateKeyAssignments(), statement.primaryKeySymbols(), statement.partitionedBySymbols(), statement.tableInfo().clusteredBy(), statement.clusteredBySymbol(), Settings.EMPTY, statement.tableInfo().isPartitioned(), outputs, statement.outputs() == null ? List.of() : statement.outputs());
LogicalPlan plannedSubQuery = logicalPlanner.plan(statement.subQueryRelation(), plannerContext, subqueryPlanner, true);
EvalProjection castOutputs = EvalProjection.castValues(Symbols.typeView(statement.columns()), plannedSubQuery.outputs());
return new Insert(plannedSubQuery, indexWriterProjection, castOutputs);
}
use of io.crate.execution.dsl.projection.ColumnIndexWriterProjection in project crate by crate.
the class InsertPlannerTest method testInsertFromSubQueryDistributedGroupByWithoutLimit.
@Test
public void testInsertFromSubQueryDistributedGroupByWithoutLimit() {
Merge planNode = e.plan("insert into users (id, name) (select name, count(*) from users group by name)");
Merge groupBy = (Merge) planNode.subPlan();
MergePhase mergePhase = groupBy.mergePhase();
assertThat(mergePhase.projections(), contains(instanceOf(GroupProjection.class), instanceOf(EvalProjection.class), instanceOf(ColumnIndexWriterProjection.class)));
ColumnIndexWriterProjection projection = (ColumnIndexWriterProjection) mergePhase.projections().get(2);
assertThat(projection.primaryKeys().size(), is(1));
assertThat(projection.primaryKeys().get(0).fqn(), is("id"));
assertThat(projection.columnReferencesExclPartition().size(), is(2));
assertThat(projection.columnReferencesExclPartition().get(0).column().fqn(), is("id"));
assertThat(projection.columnReferencesExclPartition().get(1).column().fqn(), is("name"));
assertNotNull(projection.clusteredByIdent());
assertThat(projection.clusteredByIdent().fqn(), is("id"));
assertThat(projection.tableIdent().fqn(), is("doc.users"));
assertThat(projection.partitionedBySymbols().isEmpty(), is(true));
MergePhase localMergeNode = planNode.mergePhase();
assertThat(localMergeNode.projections().size(), is(1));
assertThat(localMergeNode.projections().get(0), instanceOf(MergeCountProjection.class));
assertThat(localMergeNode.finalProjection().get().outputs().size(), is(1));
}
use of io.crate.execution.dsl.projection.ColumnIndexWriterProjection in project crate by crate.
the class InsertPlannerTest method testInsertFromSubQueryJoin.
@Test
public void testInsertFromSubQueryJoin() {
Join join = e.plan("insert into users (id, name) (select u1.id, u2.name from users u1 CROSS JOIN users u2)");
assertThat(join.joinPhase().projections(), contains(instanceOf(EvalProjection.class), instanceOf(ColumnIndexWriterProjection.class)));
ColumnIndexWriterProjection projection = (ColumnIndexWriterProjection) join.joinPhase().projections().get(1);
assertThat(projection.columnReferencesExclPartition().size(), is(2));
assertThat(projection.columnReferencesExclPartition().get(0).column().fqn(), is("id"));
assertThat(projection.columnReferencesExclPartition().get(1).column().fqn(), is("name"));
assertThat(((InputColumn) projection.ids().get(0)).index(), is(0));
assertThat(((InputColumn) projection.clusteredBy()).index(), is(0));
assertThat(projection.partitionedBySymbols().isEmpty(), is(true));
}
use of io.crate.execution.dsl.projection.ColumnIndexWriterProjection in project crate by crate.
the class InsertPlannerTest method testInsertFromSubQueryGlobalAggregate.
@Test
public void testInsertFromSubQueryGlobalAggregate() {
Merge globalAggregate = e.plan("insert into users (name, id) (select arbitrary(name), count(*) from users)");
MergePhase mergePhase = globalAggregate.mergePhase();
assertThat(mergePhase.projections(), contains(instanceOf(AggregationProjection.class), instanceOf(ColumnIndexWriterProjection.class)));
assertThat(mergePhase.projections().get(1), instanceOf(ColumnIndexWriterProjection.class));
ColumnIndexWriterProjection projection = (ColumnIndexWriterProjection) mergePhase.projections().get(1);
assertThat(projection.columnReferencesExclPartition().size(), is(2));
assertThat(projection.columnReferencesExclPartition().get(0).column().fqn(), is("name"));
assertThat(projection.columnReferencesExclPartition().get(1).column().fqn(), is("id"));
assertThat(projection.columnSymbolsExclPartition().size(), is(2));
assertThat(((InputColumn) projection.columnSymbolsExclPartition().get(0)).index(), is(0));
assertThat(((InputColumn) projection.columnSymbolsExclPartition().get(1)).index(), is(1));
assertNotNull(projection.clusteredByIdent());
assertThat(projection.clusteredByIdent().fqn(), is("id"));
assertThat(projection.tableIdent().fqn(), is("doc.users"));
assertThat(projection.partitionedBySymbols().isEmpty(), is(true));
}
use of io.crate.execution.dsl.projection.ColumnIndexWriterProjection in project crate by crate.
the class InsertPlannerTest method testInsertFromSubQueryReduceOnCollectorGroupByWithCast.
@Test
public void testInsertFromSubQueryReduceOnCollectorGroupByWithCast() {
Merge merge = e.plan("insert into users (id, name) (select id, count(*) from users group by id)");
Collect nonDistributedGroupBy = (Collect) merge.subPlan();
RoutedCollectPhase collectPhase = ((RoutedCollectPhase) nonDistributedGroupBy.collectPhase());
assertThat(collectPhase.projections(), contains(instanceOf(GroupProjection.class), instanceOf(EvalProjection.class), instanceOf(ColumnIndexWriterProjection.class)));
EvalProjection collectTopN = (EvalProjection) collectPhase.projections().get(1);
assertThat(collectTopN.outputs(), contains(isInputColumn(0), isFunction(ImplicitCastFunction.NAME, List.of(DataTypes.LONG, DataTypes.STRING))));
ColumnIndexWriterProjection columnIndexWriterProjection = (ColumnIndexWriterProjection) collectPhase.projections().get(2);
assertThat(columnIndexWriterProjection.columnReferencesExclPartition(), contains(isReference("id"), isReference("name")));
MergePhase mergePhase = merge.mergePhase();
assertThat(mergePhase.projections(), contains(instanceOf(MergeCountProjection.class)));
}
Aggregations