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";

Reply via email to