Search in sources :

Example 6 with QueriedDocTable

use of io.crate.analyze.relations.QueriedDocTable in project crate by crate.

the class QueriedDocTableFetchPushDownTest method testNoPushDownWithOrder.

@Test
public void testNoPushDownWithOrder() throws Exception {
    QuerySpec qs = new QuerySpec();
    qs.outputs(Lists.newArrayList(REF_I));
    qs.orderBy(new OrderBy(ImmutableList.of(REF_I), new boolean[] { true }, new Boolean[] { false }));
    QueriedDocTableFetchPushDown pd = new QueriedDocTableFetchPushDown(new QueriedDocTable(TABLE_REL, qs));
    assertNull(pd.pushDown());
    assertThat(qs, isSQL("SELECT s.t.i ORDER BY s.t.i DESC NULLS LAST"));
}
Also used : OrderBy(io.crate.analyze.OrderBy) QueriedDocTable(io.crate.analyze.relations.QueriedDocTable) QuerySpec(io.crate.analyze.QuerySpec) Test(org.junit.Test)

Example 7 with QueriedDocTable

use of io.crate.analyze.relations.QueriedDocTable in project crate by crate.

the class QueriedDocTableFetchPushDownTest method testLimitIsPushedDown.

@Test
public void testLimitIsPushedDown() throws Exception {
    QuerySpec qs = new QuerySpec();
    qs.outputs(Lists.newArrayList(REF_I, REF_A));
    qs.limit(Optional.of(Literal.of(10)));
    qs.offset(Optional.of(Literal.of(100)));
    QueriedDocTableFetchPushDown pd = new QueriedDocTableFetchPushDown(new QueriedDocTable(TABLE_REL, qs));
    QueriedDocTable sub = pd.pushDown();
    assertThat(sub.querySpec().limit().get(), is(Literal.of(10)));
    assertThat(sub.querySpec().offset().get(), is(Literal.of(100)));
    assertThat(qs.limit().get(), is(Literal.of(10)));
    assertThat(qs.offset().get(), is(Literal.of(100)));
}
Also used : QueriedDocTable(io.crate.analyze.relations.QueriedDocTable) QuerySpec(io.crate.analyze.QuerySpec) Test(org.junit.Test)

Example 8 with QueriedDocTable

use of io.crate.analyze.relations.QueriedDocTable in project crate by crate.

the class QueriedDocTableFetchPushDownTest method testWhereIsPushedDown.

@Test
public void testWhereIsPushedDown() throws Exception {
    QuerySpec qs = new QuerySpec();
    qs.outputs(Lists.newArrayList(REF_I, REF_A));
    qs.where(WhereClause.NO_MATCH);
    QueriedDocTableFetchPushDown pd = new QueriedDocTableFetchPushDown(new QueriedDocTable(TABLE_REL, qs));
    QueriedDocTable sub = pd.pushDown();
    assertThat(sub.querySpec().where(), is(WhereClause.NO_MATCH));
    assertThat(qs.where(), is(WhereClause.MATCH_ALL));
}
Also used : QueriedDocTable(io.crate.analyze.relations.QueriedDocTable) QuerySpec(io.crate.analyze.QuerySpec) Test(org.junit.Test)

Example 9 with QueriedDocTable

use of io.crate.analyze.relations.QueriedDocTable in project crate by crate.

the class QueriedDocTableFetchPushDownTest method testPushDownWithoutOrder.

@Test
public void testPushDownWithoutOrder() throws Exception {
    QuerySpec qs = new QuerySpec();
    qs.outputs(Lists.newArrayList(REF_A, REF_I));
    QueriedDocTableFetchPushDown pd = new QueriedDocTableFetchPushDown(new QueriedDocTable(TABLE_REL, qs));
    QueriedDocTable sub = pd.pushDown();
    assertThat(qs, isSQL("SELECT FETCH(INPUT(0), s.t._doc['a']), FETCH(INPUT(0), s.t._doc['i'])"));
    assertThat(sub.querySpec(), isSQL("SELECT s.t._fetchid"));
}
Also used : QueriedDocTable(io.crate.analyze.relations.QueriedDocTable) QuerySpec(io.crate.analyze.QuerySpec) Test(org.junit.Test)

Example 10 with QueriedDocTable

use of io.crate.analyze.relations.QueriedDocTable in project crate by crate.

the class QueriedDocTableFetchPushDown method pushDown.

@Nullable
QueriedDocTable pushDown() {
    if (querySpec.groupBy().isPresent() || querySpec.having().isPresent() || querySpec.hasAggregates()) {
        return null;
    }
    Optional<OrderBy> orderBy = querySpec.orderBy();
    FetchRequiredVisitor.Context context;
    if (orderBy.isPresent()) {
        context = new FetchRequiredVisitor.Context(new LinkedHashSet<>(orderBy.get().orderBySymbols()));
    } else {
        context = new FetchRequiredVisitor.Context();
    }
    boolean fetchRequired = FetchRequiredVisitor.INSTANCE.process(querySpec.outputs(), context);
    if (!fetchRequired)
        return null;
    // build the subquery
    QuerySpec sub = new QuerySpec();
    Reference docIdReference = DocSysColumns.forTable(tableRelation.tableInfo().ident(), DocSysColumns.FETCHID);
    List<Symbol> outputs = new ArrayList<>();
    if (orderBy.isPresent()) {
        sub.orderBy(orderBy.get());
        outputs.add(docIdReference);
        outputs.addAll(context.querySymbols());
    } else {
        outputs.add(docIdReference);
    }
    for (Symbol symbol : querySpec.outputs()) {
        if (Symbols.containsColumn(symbol, DocSysColumns.SCORE) && !outputs.contains(symbol)) {
            outputs.add(symbol);
        }
    }
    sub.outputs(outputs);
    QueriedDocTable subRelation = new QueriedDocTable(tableRelation, sub);
    HashMap<Symbol, InputColumn> symbolMap = new HashMap<>(sub.outputs().size());
    int index = 0;
    for (Symbol symbol : sub.outputs()) {
        symbolMap.put(symbol, new InputColumn(index++, symbol.valueType()));
    }
    // push down the where clause
    sub.where(querySpec.where());
    querySpec.where(null);
    ToFetchReferenceVisitor toFetchReferenceVisitor = new ToFetchReferenceVisitor();
    toFetchReferenceVisitor.processInplace(querySpec.outputs(), symbolMap);
    if (orderBy.isPresent()) {
        // replace order by symbols with input columns, we need to copy the order by since it was pushed down to the
        // subquery before
        List<Symbol> newOrderBySymbols = MappingSymbolVisitor.copying().process(orderBy.get().orderBySymbols(), symbolMap);
        querySpec.orderBy(new OrderBy(newOrderBySymbols, orderBy.get().reverseFlags(), orderBy.get().nullsFirst()));
    }
    sub.limit(querySpec.limit());
    sub.offset(querySpec.offset());
    return subRelation;
}
Also used : OrderBy(io.crate.analyze.OrderBy) Reference(io.crate.metadata.Reference) QueriedDocTable(io.crate.analyze.relations.QueriedDocTable) QuerySpec(io.crate.analyze.QuerySpec) Nullable(javax.annotation.Nullable)

Aggregations

QueriedDocTable (io.crate.analyze.relations.QueriedDocTable)16 Test (org.junit.Test)14 QuerySpec (io.crate.analyze.QuerySpec)11 OrderBy (io.crate.analyze.OrderBy)8 CrateUnitTest (io.crate.test.integration.CrateUnitTest)4 Function (io.crate.analyze.symbol.Function)2 AbsFunction (io.crate.operation.scalar.arithmetic.AbsFunction)2 ExpressionAnalysisContext (io.crate.analyze.expressions.ExpressionAnalysisContext)1 ExpressionAnalyzer (io.crate.analyze.expressions.ExpressionAnalyzer)1 DocTableRelation (io.crate.analyze.relations.DocTableRelation)1 Symbol (io.crate.analyze.symbol.Symbol)1 UnsupportedFeatureException (io.crate.exceptions.UnsupportedFeatureException)1 Reference (io.crate.metadata.Reference)1 DocTableInfo (io.crate.metadata.doc.DocTableInfo)1 TableInfo (io.crate.metadata.table.TableInfo)1 WriterProjection (io.crate.planner.projection.WriterProjection)1 Nullable (javax.annotation.Nullable)1 Settings (org.elasticsearch.common.settings.Settings)1