Search in sources :

Example 66 with ArrayType

use of io.crate.types.ArrayType in project crate by crate.

the class JoinPhaseTest method testNestedLoopSerialization.

@Test
public void testNestedLoopSerialization() throws Exception {
    NestedLoopPhase node = new NestedLoopPhase(jobId, 1, "nestedLoop", List.of(topNProjection), mp1, mp2, 2, 3, Set.of("node1", "node2"), JoinType.FULL, joinCondition, List.of(DataTypes.LONG, DataTypes.STRING, new ArrayType<>(DataTypes.INTEGER)), 32L, 100_000, true);
    BytesStreamOutput output = new BytesStreamOutput();
    node.writeTo(output);
    StreamInput input = output.bytes().streamInput();
    NestedLoopPhase node2 = new NestedLoopPhase(input);
    assertThat(node.nodeIds(), is(node2.nodeIds()));
    assertThat(node.jobId(), is(node2.jobId()));
    assertThat(node.joinCondition(), is(node2.joinCondition()));
    assertThat(node.type(), is(node2.type()));
    assertThat(node.nodeIds(), is(node2.nodeIds()));
    assertThat(node.jobId(), is(node2.jobId()));
    assertThat(node.name(), is(node2.name()));
    assertThat(node.outputTypes(), is(node2.outputTypes()));
    assertThat(node.joinType(), is(node2.joinType()));
    assertThat(node.joinCondition(), is(node2.joinCondition()));
    assertThat(node.estimatedRowsSizeLeft, is(32L));
    assertThat(node.estimatedNumberOfRowsLeft, is(100_000L));
    assertThat(node.blockNestedLoop, is(true));
}
Also used : ArrayType(io.crate.types.ArrayType) StreamInput(org.elasticsearch.common.io.stream.StreamInput) NestedLoopPhase(io.crate.execution.dsl.phases.NestedLoopPhase) BytesStreamOutput(org.elasticsearch.common.io.stream.BytesStreamOutput) Test(org.junit.Test)

Example 67 with ArrayType

use of io.crate.types.ArrayType in project crate by crate.

the class RelationAnalyzer method visitValues.

@Override
public AnalyzedRelation visitValues(Values values, StatementAnalysisContext context) {
    var expressionAnalyzer = new ExpressionAnalyzer(context.transactionContext(), nodeCtx, context.paramTyeHints(), FieldProvider.UNSUPPORTED, new SubqueryAnalyzer(this, context));
    var expressionAnalysisContext = new ExpressionAnalysisContext(context.sessionContext());
    // prevent normalization of the values array, otherwise the value literals are converted to an array literal
    // and a special per-value-literal casting logic won't be executed (e.g. FloatLiteral.cast())
    expressionAnalysisContext.allowEagerNormalize(false);
    java.util.function.Function<Expression, Symbol> expressionToSymbol = e -> expressionAnalyzer.convert(e, expressionAnalysisContext);
    // There is a first pass to convert expressions from row oriented format:
    // `[[1, a], [2, b]]` to columns `[[1, 2], [a, b]]`
    // 
    // At the same time we determine the column type with the highest precedence,
    // so that we don't fail with slight type miss-matches (long vs. int)
    List<ValuesList> rows = values.rows();
    assert rows.size() > 0 : "Parser grammar enforces at least 1 row";
    ValuesList firstRow = rows.get(0);
    int numColumns = firstRow.values().size();
    ArrayList<List<Symbol>> columns = new ArrayList<>();
    ArrayList<DataType<?>> targetTypes = new ArrayList<>(numColumns);
    var parentOutputColumns = context.parentOutputColumns();
    for (int c = 0; c < numColumns; c++) {
        ArrayList<Symbol> columnValues = new ArrayList<>();
        DataType<?> targetType;
        boolean usePrecedence = true;
        if (parentOutputColumns.size() > c) {
            targetType = parentOutputColumns.get(c).valueType();
            usePrecedence = false;
        } else {
            targetType = DataTypes.UNDEFINED;
        }
        for (int r = 0; r < rows.size(); r++) {
            List<Expression> row = rows.get(r).values();
            if (row.size() != numColumns) {
                throw new IllegalArgumentException("VALUES lists must all be the same length. " + "Found row with " + numColumns + " items and another with " + columns.size() + " items");
            }
            Symbol cell = expressionToSymbol.apply(row.get(c));
            columnValues.add(cell);
            var cellType = cell.valueType();
            if (// skip first cell, we don't have to check for self-conversion
            r > 0 && !cellType.isConvertableTo(targetType, false) && targetType.id() != DataTypes.UNDEFINED.id()) {
                throw new IllegalArgumentException("The types of the columns within VALUES lists must match. " + "Found `" + targetType + "` and `" + cellType + "` at position: " + c);
            }
            if (usePrecedence && cellType.precedes(targetType)) {
                targetType = cellType;
            } else if (targetType == DataTypes.UNDEFINED) {
                targetType = cellType;
            }
        }
        targetTypes.add(targetType);
        columns.add(columnValues);
    }
    var normalizer = EvaluatingNormalizer.functionOnlyNormalizer(nodeCtx, f -> f.isDeterministic());
    ArrayList<Symbol> arrays = new ArrayList<>(columns.size());
    for (int c = 0; c < numColumns; c++) {
        DataType<?> targetType = targetTypes.get(c);
        ArrayType<?> arrayType = new ArrayType<>(targetType);
        List<Symbol> columnValues = Lists2.map(columns.get(c), s -> normalizer.normalize(s.cast(targetType), context.transactionContext()));
        arrays.add(new Function(ArrayFunction.SIGNATURE, columnValues, arrayType));
    }
    FunctionImplementation implementation = nodeCtx.functions().getQualified(ValuesFunction.SIGNATURE, Symbols.typeView(arrays), RowType.EMPTY);
    Function function = new Function(implementation.signature(), arrays, RowType.EMPTY);
    TableFunctionImplementation<?> tableFunc = TableFunctionFactory.from(implementation);
    TableFunctionRelation relation = new TableFunctionRelation(tableFunc, function);
    context.startRelation();
    context.currentRelationContext().addSourceRelation(relation);
    context.endRelation();
    return relation;
}
Also used : ParamTypeHints(io.crate.analyze.ParamTypeHints) JoinCriteria(io.crate.sql.tree.JoinCriteria) UnsupportedFeatureException(io.crate.exceptions.UnsupportedFeatureException) RelationName(io.crate.metadata.RelationName) RowType(io.crate.types.RowType) DefaultTraversalVisitor(io.crate.sql.tree.DefaultTraversalVisitor) EvaluatingNormalizer(io.crate.expression.eval.EvaluatingNormalizer) Node(io.crate.sql.tree.Node) ArrayType(io.crate.types.ArrayType) JoinType(io.crate.planner.node.dql.join.JoinType) JoinOn(io.crate.sql.tree.JoinOn) Locale(java.util.Locale) Map(java.util.Map) SelectAnalysis(io.crate.analyze.relations.select.SelectAnalysis) ValuesList(io.crate.sql.tree.ValuesList) Union(io.crate.sql.tree.Union) DocTableInfo(io.crate.metadata.doc.DocTableInfo) TableInfo(io.crate.metadata.table.TableInfo) NodeContext(io.crate.metadata.NodeContext) SortItem(io.crate.sql.tree.SortItem) Collection(java.util.Collection) QuerySpecification(io.crate.sql.tree.QuerySpecification) TableSubquery(io.crate.sql.tree.TableSubquery) Set(java.util.Set) SelectAnalyzer(io.crate.analyze.relations.select.SelectAnalyzer) Intersect(io.crate.sql.tree.Intersect) WhereClauseValidator(io.crate.analyze.where.WhereClauseValidator) Iterables(io.crate.common.collections.Iterables) Lists2(io.crate.common.collections.Lists2) Relation(io.crate.sql.tree.Relation) List(java.util.List) OrderBy(io.crate.analyze.OrderBy) Symbol(io.crate.expression.symbol.Symbol) FunctionImplementation(io.crate.metadata.FunctionImplementation) DataTypes(io.crate.types.DataTypes) Singleton(org.elasticsearch.common.inject.Singleton) Values(io.crate.sql.tree.Values) Optional(java.util.Optional) Expression(io.crate.sql.tree.Expression) CoordinatorTxnCtx(io.crate.metadata.CoordinatorTxnCtx) ExpressionAnalyzer(io.crate.analyze.expressions.ExpressionAnalyzer) SemanticSortValidator(io.crate.analyze.validator.SemanticSortValidator) AmbiguousColumnAliasException(io.crate.exceptions.AmbiguousColumnAliasException) Tuple(io.crate.common.collections.Tuple) SubqueryAnalyzer(io.crate.analyze.expressions.SubqueryAnalyzer) FunctionCall(io.crate.sql.tree.FunctionCall) QualifiedNameReference(io.crate.sql.tree.QualifiedNameReference) QueriedSelectRelation(io.crate.analyze.QueriedSelectRelation) SearchPath(io.crate.metadata.SearchPath) Operation(io.crate.metadata.table.Operation) HavingSymbolValidator(io.crate.analyze.validator.HavingSymbolValidator) AliasedRelation(io.crate.sql.tree.AliasedRelation) Inject(org.elasticsearch.common.inject.Inject) ArrayList(java.util.ArrayList) ValuesFunction(io.crate.expression.tablefunctions.ValuesFunction) Join(io.crate.sql.tree.Join) Symbols(io.crate.expression.symbol.Symbols) SqlParser(io.crate.sql.parser.SqlParser) Query(io.crate.sql.tree.Query) QualifiedName(io.crate.sql.tree.QualifiedName) TableFunction(io.crate.sql.tree.TableFunction) Nullable(javax.annotation.Nullable) RelationValidationException(io.crate.exceptions.RelationValidationException) ArrayFunction(io.crate.expression.scalar.arithmetic.ArrayFunction) OrderByWithAggregationValidator(io.crate.planner.consumer.OrderByWithAggregationValidator) ViewMetadata(io.crate.metadata.view.ViewMetadata) ExpressionAnalysisContext(io.crate.analyze.expressions.ExpressionAnalysisContext) TableFunctionFactory(io.crate.expression.tablefunctions.TableFunctionFactory) Table(io.crate.sql.tree.Table) DataType(io.crate.types.DataType) Function(io.crate.expression.symbol.Function) GroupAndAggregateSemantics(io.crate.expression.symbol.GroupAndAggregateSemantics) JoinUsing(io.crate.sql.tree.JoinUsing) TableFunctionImplementation(io.crate.metadata.tablefunctions.TableFunctionImplementation) Except(io.crate.sql.tree.Except) Literal(io.crate.expression.symbol.Literal) GroupBySymbolValidator(io.crate.analyze.validator.GroupBySymbolValidator) ColumnUnknownException(io.crate.exceptions.ColumnUnknownException) Schemas(io.crate.metadata.Schemas) RelationUnknown(io.crate.exceptions.RelationUnknown) Collections(java.util.Collections) ExpressionAnalysisContext(io.crate.analyze.expressions.ExpressionAnalysisContext) Symbol(io.crate.expression.symbol.Symbol) ExpressionAnalyzer(io.crate.analyze.expressions.ExpressionAnalyzer) ArrayList(java.util.ArrayList) ArrayType(io.crate.types.ArrayType) ValuesFunction(io.crate.expression.tablefunctions.ValuesFunction) TableFunction(io.crate.sql.tree.TableFunction) ArrayFunction(io.crate.expression.scalar.arithmetic.ArrayFunction) Function(io.crate.expression.symbol.Function) DataType(io.crate.types.DataType) ValuesList(io.crate.sql.tree.ValuesList) List(java.util.List) ArrayList(java.util.ArrayList) FunctionImplementation(io.crate.metadata.FunctionImplementation) TableFunctionImplementation(io.crate.metadata.tablefunctions.TableFunctionImplementation) ValuesList(io.crate.sql.tree.ValuesList) Expression(io.crate.sql.tree.Expression) SubqueryAnalyzer(io.crate.analyze.expressions.SubqueryAnalyzer)

Example 68 with ArrayType

use of io.crate.types.ArrayType in project crate by crate.

the class ReferenceTest method testEquals.

@Test
public void testEquals() {
    RelationName relationName = new RelationName("doc", "test");
    ReferenceIdent referenceIdent = new ReferenceIdent(relationName, "object_column");
    DataType<?> dataType1 = new ArrayType<>(DataTypes.UNTYPED_OBJECT);
    DataType<?> dataType2 = new ArrayType<>(DataTypes.UNTYPED_OBJECT);
    Symbol defaultExpression1 = Literal.of(Map.of("f", 10));
    Symbol defaultExpression2 = Literal.of(Map.of("f", 10));
    Reference reference1 = new Reference(referenceIdent, RowGranularity.DOC, dataType1, 1, defaultExpression1);
    Reference reference2 = new Reference(referenceIdent, RowGranularity.DOC, dataType2, 1, defaultExpression2);
    assertThat(reference1, is(reference2));
}
Also used : ArrayType(io.crate.types.ArrayType) Symbol(io.crate.expression.symbol.Symbol) Test(org.junit.Test)

Example 69 with ArrayType

use of io.crate.types.ArrayType in project crate by crate.

the class ArrayLengthQueryTest method testArrayLengthWithAllSupportedTypes.

@Test
public void testArrayLengthWithAllSupportedTypes() throws Exception {
    for (DataType<?> type : DataTypeTesting.ALL_TYPES_EXCEPT_ARRAYS) {
        // This is temporary as long as interval is not fully implemented
        if (type.storageSupport() == null) {
            continue;
        }
        Supplier dataGenerator = DataTypeTesting.getDataGenerator(type);
        Object val1 = dataGenerator.get();
        Object val2 = dataGenerator.get();
        Object[] arr = { val1, val2 };
        Object[] values = new Object[] { arr };
        // ensure the test is operating on a fresh, empty cluster state (no tables)
        resetClusterService();
        try (QueryTester tester = new QueryTester.Builder(createTempDir(), THREAD_POOL, clusterService, Version.CURRENT, "create table \"t_" + type.getName() + "\" (xs array(\"" + type.getName() + "\"))").indexValues("xs", values).build()) {
            System.out.println(type);
            List<Object> result = tester.runQuery("xs", "array_length(xs, 1) >= 2");
            assertThat(result.size(), is(1));
            ArrayType arrayType = new ArrayType<>(type);
            // having the result size check should be sufficient anyway
            if (type.id() != ObjectType.ID) {
                assertThat(arrayType.compare((List) result.get(0), Arrays.asList(arr)), is(0));
            }
        }
    }
}
Also used : ArrayType(io.crate.types.ArrayType) QueryTester(io.crate.testing.QueryTester) Supplier(java.util.function.Supplier) List(java.util.List) Test(org.junit.Test) CrateDummyClusterServiceUnitTest(io.crate.test.integration.CrateDummyClusterServiceUnitTest)

Example 70 with ArrayType

use of io.crate.types.ArrayType in project crate by crate.

the class PGTypesTest method testCrateCollection2PgType.

@Test
public void testCrateCollection2PgType() {
    for (DataType type : PRIMITIVE_TYPES) {
        assertThat(PGTypes.get(new ArrayType(type)), instanceOf(PGArray.class));
    }
    assertThat(PGTypes.get(new ArrayType(GEO_POINT)), instanceOf(PGArray.class));
    assertThat(PGTypes.get(new ArrayType(GEO_SHAPE)), instanceOf(PGArray.class));
}
Also used : ArrayType(io.crate.types.ArrayType) DataType(io.crate.types.DataType) Test(org.junit.Test)

Aggregations

ArrayType (io.crate.types.ArrayType)76 Test (org.junit.Test)53 DataType (io.crate.types.DataType)35 CrateUnitTest (io.crate.test.integration.CrateUnitTest)20 CrateDummyClusterServiceUnitTest (io.crate.test.integration.CrateDummyClusterServiceUnitTest)15 Symbol (io.crate.expression.symbol.Symbol)9 ArrayList (java.util.ArrayList)8 List (java.util.List)8 BytesRef (org.apache.lucene.util.BytesRef)8 DocTableInfo (io.crate.metadata.doc.DocTableInfo)7 Literal (io.crate.analyze.symbol.Literal)6 Literal (io.crate.expression.symbol.Literal)6 ColumnIdent (io.crate.metadata.ColumnIdent)6 Input (io.crate.data.Input)5 HashMap (java.util.HashMap)5 Function (io.crate.analyze.symbol.Function)4 Reference (io.crate.metadata.Reference)4 DataTypes (io.crate.types.DataTypes)4 AnalyzedRelation (io.crate.analyze.relations.AnalyzedRelation)3 TransactionContext (io.crate.metadata.TransactionContext)3