ignite-sql-tests - parser fixes + UDFs moved to DB level
Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/8f3ee109 Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/8f3ee109 Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/8f3ee109 Branch: refs/heads/ignite-sql-tests Commit: 8f3ee1097c23757b3c635e4e26fcb6538c8ab06d Parents: 505e2fc Author: S.Vladykin <[email protected]> Authored: Sun Feb 8 20:23:27 2015 +0300 Committer: S.Vladykin <[email protected]> Committed: Sun Feb 8 20:23:27 2015 +0300 ---------------------------------------------------------------------- .../processors/query/h2/IgniteH2Indexing.java | 26 +++----------- .../query/h2/sql/GridSqlFunction.java | 3 +- .../processors/query/h2/sql/GridSqlJoin.java | 37 ++++++++++++++------ .../query/h2/sql/GridSqlQueryParser.java | 22 +++++++----- .../query/h2/sql/GridQueryParsingTest.java | 32 +++++++++++++++-- 5 files changed, 76 insertions(+), 44 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/8f3ee109/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java index 9375e9c..0359334 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java @@ -94,11 +94,8 @@ import static org.h2.result.SortOrder.*; @SuppressWarnings({"UnnecessaryFullyQualifiedName", "NonFinalStaticVariableUsedInClassInitialization"}) public class IgniteH2Indexing implements GridQueryIndexing { /** Default DB options. */ - private static final String DFLT_DB_OPTIONS = ";LOCK_MODE=3;MULTI_THREADED=1;DB_CLOSE_ON_EXIT=FALSE" + - ";DEFAULT_LOCK_TIMEOUT=10000"; - - /** Options for optimized mode to work properly. */ - private static final String OPTIMIZED_DB_OPTIONS = ";OPTIMIZE_REUSE_RESULTS=0;QUERY_CACHE_SIZE=0;" + + private static final String DB_OPTIONS = ";LOCK_MODE=3;MULTI_THREADED=1;DB_CLOSE_ON_EXIT=FALSE" + + ";DEFAULT_LOCK_TIMEOUT=10000;FUNCTIONS_IN_SCHEMA=false;OPTIMIZE_REUSE_RESULTS=0;QUERY_CACHE_SIZE=0;" + "RECOMPILE_ALWAYS=1;MAX_OPERATION_MEMORY=0"; /** Field name for key. */ @@ -1200,13 +1197,9 @@ public class IgniteH2Indexing implements GridQueryIndexing { offheap = new GridUnsafeMemory(maxOffHeapMemory); } - SB opt = new SB(); - - opt.a(DFLT_DB_OPTIONS).a(OPTIMIZED_DB_OPTIONS); - String dbName = UUID.randomUUID().toString(); - dbUrl = "jdbc:h2:mem:" + dbName + opt; + dbUrl = "jdbc:h2:mem:" + dbName + DB_OPTIONS; try { Class.forName("org.h2.Driver"); @@ -1306,19 +1299,10 @@ public class IgniteH2Indexing implements GridQueryIndexing { String clause = "CREATE ALIAS " + alias + (ann.deterministic() ? " DETERMINISTIC FOR \"" : " FOR \"") + cls.getName() + '.' + m.getName() + '"'; - Collection<String> schemas = new ArrayList<>(schemaNames); - - if (!schemaNames.contains(schema(null))) - schemas.add(schema(null)); - - for (String schema : schemas) { - Connection c = connectionForThread(schema); - - Statement s = c.createStatement(); + Connection c = connectionForThread(schema(null)); + try (Statement s = c.createStatement()) { s.execute(clause); - - s.close(); } } } http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/8f3ee109/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlFunction.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlFunction.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlFunction.java index 6734464..a5111fb 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlFunction.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlFunction.java @@ -18,6 +18,7 @@ package org.apache.ignite.internal.processors.query.h2.sql; import org.apache.ignite.internal.util.typedef.*; +import org.h2.command.*; import org.h2.util.*; import org.h2.value.*; @@ -90,7 +91,7 @@ public class GridSqlFunction extends GridSqlElement { /** {@inheritDoc} */ @Override public String getSQL() { - StatementBuilder buff = new StatementBuilder(name); + StatementBuilder buff = new StatementBuilder(Parser.quoteIdentifier(name)); if (type == CASE) { if (!children.isEmpty()) http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/8f3ee109/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlJoin.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlJoin.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlJoin.java index 4cb64db..dce3a69 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlJoin.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlJoin.java @@ -24,13 +24,23 @@ import org.jetbrains.annotations.*; * Join of two tables or subqueries. */ public class GridSqlJoin extends GridSqlElement { + /** */ + private boolean leftOuter; + /** * @param leftTbl Left table. * @param rightTbl Right table. + * @param leftOuter Left outer join. + * @param on Join condition. */ - public GridSqlJoin(GridSqlElement leftTbl, GridSqlElement rightTbl) { + public GridSqlJoin(GridSqlElement leftTbl, GridSqlElement rightTbl, boolean leftOuter, @Nullable GridSqlElement on) { addChild(leftTbl); addChild(rightTbl); + + if (on != null) + addChild(on); + + this.leftOuter = leftOuter; } /** @@ -48,17 +58,10 @@ public class GridSqlJoin extends GridSqlElement { } /** - * @return {@code ON} Condition. + * @return {@code JOIN ON} condition. */ @Nullable public GridSqlElement on() { - return child(2); - } - - /** - * @return {@code true} If it is a {@code LEFT JOIN}. - */ - public boolean leftJoin() { - return false; // TODO + return children.size() < 3 ? null : child(2); } /** {@inheritDoc} */ @@ -67,10 +70,22 @@ public class GridSqlJoin extends GridSqlElement { buff.append(leftTable().getSQL()); - buff.append(leftJoin() ? " \n LEFT JOIN " : " \n INNER JOIN "); + buff.append(leftOuter ? " \n LEFT OUTER JOIN " : " \n INNER JOIN "); buff.append(rightTable().getSQL()); + GridSqlElement on = on(); + + if (on != null) { + String onSql = on.getSQL(); + + // This is needed for parsing tests to work correctly. + if (onSql.charAt(0) == '(' && onSql.charAt(onSql.length() - 1) == ')') + onSql = onSql.substring(1, onSql.length() - 1); + + buff.append(" \n ON ").append(onSql); + } + return buff.toString(); } } http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/8f3ee109/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlQueryParser.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlQueryParser.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlQueryParser.java index 1b8af8d..f02822b 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlQueryParser.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlQueryParser.java @@ -144,6 +144,9 @@ public class GridSqlQueryParser { private static final Getter<RangeTable, Expression> RANGE_MAX = getter(RangeTable.class, "max"); /** */ + private static final Getter<FunctionTable, Expression> FUNC_EXPR = getter(FunctionTable.class, "functionExpr"); + + /** */ private final IdentityHashMap<Object, Object> h2ObjToGridObj = new IdentityHashMap<>(); /** @@ -160,7 +163,7 @@ public class GridSqlQueryParser { /** * @param filter Filter. */ - private GridSqlElement parse(TableFilter filter) { + private GridSqlElement parseTable(TableFilter filter) { GridSqlElement res = (GridSqlElement)h2ObjToGridObj.get(filter); if (res == null) { @@ -175,6 +178,9 @@ public class GridSqlQueryParser { res = new GridSqlSubquery(parse((Select)qry)); } + else if (tbl instanceof FunctionTable) { + res = parseExpression(FUNC_EXPR.get((FunctionTable)tbl)); + } else if (tbl instanceof RangeTable) { res = new GridSqlFunction("SYSTEM_RANGE"); @@ -182,7 +188,7 @@ public class GridSqlQueryParser { res.addChild(parseExpression(RANGE_MAX.get((RangeTable)tbl))); } else - throw new IgniteException("Unsupported query: " + filter); + assert0(false, filter.getSelect().getSQL()); String alias = ALIAS.get(filter); @@ -218,17 +224,15 @@ public class GridSqlQueryParser { GridSqlElement from = null; TableFilter filter = select.getTopTableFilter(); + do { assert0(filter != null, select); - assert0(!filter.isJoinOuter(), select); // TODO 3 - assert0(!filter.isJoinOuterIndirect(), select); assert0(filter.getNestedJoin() == null, select); - assert0(filter.getJoinCondition() == null, select); // TODO 1 - assert0(filter.getFilterCondition() == null, select); // TODO 2 - GridSqlElement gridFilter = parse(filter); + GridSqlElement gridFilter = parseTable(filter); - from = from == null ? gridFilter : new GridSqlJoin(from, gridFilter); + from = from == null ? gridFilter : new GridSqlJoin(from, gridFilter, filter.isJoinOuter(), + parseExpression(filter.getJoinCondition())); allFilters.remove(filter); @@ -313,7 +317,7 @@ public class GridSqlQueryParser { if (expression instanceof ExpressionColumn) { TableFilter tblFilter = ((ExpressionColumn)expression).getTableFilter(); - GridSqlElement gridTblFilter = parse(tblFilter); + GridSqlElement gridTblFilter = parseTable(tblFilter); return new GridSqlColumn(gridTblFilter, expression.getColumnName(), expression.getSQL()); } http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/8f3ee109/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/sql/GridQueryParsingTest.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/sql/GridQueryParsingTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/sql/GridQueryParsingTest.java index e525937..0b3ea80 100644 --- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/sql/GridQueryParsingTest.java +++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/sql/GridQueryParsingTest.java @@ -36,7 +36,7 @@ import org.h2.engine.*; import org.h2.jdbc.*; import java.io.*; -import java.util.*; +import java.sql.*; import static org.apache.ignite.cache.CacheDistributionMode.*; import static org.apache.ignite.cache.CachePreloadMode.*; @@ -65,6 +65,8 @@ public class GridQueryParsingTest extends GridCommonAbstractTest { QueryConfiguration idxCfg = new QueryConfiguration(); + idxCfg.setIndexCustomFunctionClasses(GridQueryParsingTest.class); + c.setQueryConfiguration(idxCfg); c.setMarshaller(new OptimizedMarshaller(true)); @@ -107,6 +109,22 @@ public class GridQueryParsingTest extends GridCommonAbstractTest { * */ public void testAllExampless() throws Exception { + checkQuery("select cool1()"); + checkQuery("select cool1() z"); + + checkQuery("select b,a from table0('aaa', 100)"); + checkQuery("select * from table0('aaa', 100)"); + checkQuery("select * from table0('aaa', 100) t0"); + + checkQuery("select avg(old) from Person left join Address on Person.addrId = Address.id " + + "where lower(Address.street) = lower(?)"); + + checkQuery("select avg(old) from Person join Address on Person.addrId = Address.id " + + "where lower(Address.street) = lower(?)"); + + checkQuery("select avg(old) from Person left join Address where Person.addrId = Address.id " + + "and lower(Address.street) = lower(?)"); + checkQuery("select avg(old) from Person, Address where Person.addrId = Address.id " + "and lower(Address.street) = lower(?)"); @@ -265,12 +283,22 @@ public class GridQueryParsingTest extends GridCommonAbstractTest { System.out.println(normalizeSql(res)); } + @QuerySqlFunction + public static int cool1() { + return 1; + } + + @QuerySqlFunction + public static ResultSet table0(Connection c, String a, int b) throws SQLException { + return c.createStatement().executeQuery("select '" + a + "' as a, " + b + " as b"); + } + /** * */ public static class Person implements Serializable { @QuerySqlField(index = true) - public Date date = new Date(); + public Date date = new Date(System.currentTimeMillis()); @QuerySqlField(index = true) public String name = "Ivan";
