You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by tl...@apache.org on 2021/08/31 13:09:41 UTC

[ignite-3] branch ignite-15212 updated: API review on call

This is an automated email from the ASF dual-hosted git repository.

tledkov pushed a commit to branch ignite-15212
in repository https://gitbox.apache.org/repos/asf/ignite-3.git


The following commit(s) were added to refs/heads/ignite-15212 by this push:
     new 6b9eca6  API review on call
6b9eca6 is described below

commit 6b9eca6e3d27ebe668ca6c5a35004ce4533e5465
Author: tledkov <tl...@gridgain.com>
AuthorDate: Tue Aug 31 16:09:28 2021 +0300

    API review on call
---
 .../org/apache/ignite/query/sql/IgniteSql.java     | 10 +++++
 .../{SqlResultSet.java => SqlMultiResultSet.java}  | 20 +++------
 .../sql/{SqlResultSet.java => SqlPrepared.java}    | 22 ++--------
 .../org/apache/ignite/query/sql/SqlResultSet.java  | 13 ++++++
 .../org/apache/ignite/query/sql/SqlSession.java    | 49 +++++++++------------
 .../ignite/query/sql/async/AsyncSqlSession.java    | 20 ++-------
 modules/sql/src/test/java/SqlTest.java             | 50 ++++++++++++++++++++--
 7 files changed, 104 insertions(+), 80 deletions(-)

diff --git a/modules/api/src/main/java/org/apache/ignite/query/sql/IgniteSql.java b/modules/api/src/main/java/org/apache/ignite/query/sql/IgniteSql.java
index 11c5947..fb8766b 100644
--- a/modules/api/src/main/java/org/apache/ignite/query/sql/IgniteSql.java
+++ b/modules/api/src/main/java/org/apache/ignite/query/sql/IgniteSql.java
@@ -18,6 +18,7 @@
 package org.apache.ignite.query.sql;
 
 import java.util.UUID;
+import org.jetbrains.annotations.NotNull;
 
 /**
  * Ignite SQL query facade.
@@ -32,6 +33,15 @@ public interface IgniteSql {
     SqlSession session();
 
     /**
+     * Creates prepared statement.
+     *
+     * @param sql SQL query template.
+     * @return Prepared statement.
+     * @throws SQLException If parsing failed.
+     */
+    SqlPrepared prepare(@NotNull String sql);
+
+    /**
      * Kills query by its' id.
      *
      * @param queryID Query id.
diff --git a/modules/api/src/main/java/org/apache/ignite/query/sql/SqlResultSet.java b/modules/api/src/main/java/org/apache/ignite/query/sql/SqlMultiResultSet.java
similarity index 67%
copy from modules/api/src/main/java/org/apache/ignite/query/sql/SqlResultSet.java
copy to modules/api/src/main/java/org/apache/ignite/query/sql/SqlMultiResultSet.java
index ea8003d..2158966 100644
--- a/modules/api/src/main/java/org/apache/ignite/query/sql/SqlResultSet.java
+++ b/modules/api/src/main/java/org/apache/ignite/query/sql/SqlMultiResultSet.java
@@ -19,19 +19,13 @@ package org.apache.ignite.query.sql;
 
 import java.util.UUID;
 
-/**
- * SQL result set provides methods to access SQL query resul represented as collection of {@link SqlRow}.
- *
- * All the rows in result set have the same structure described in {@link SqlResultSetMeta}.
- * ResultSet must be closed after usage to free resources.
- */
-public interface SqlResultSet extends Iterable<SqlRow>, AutoCloseable {
-    /**
-     * Returns metadata for the results.
-     *
-     * @return ResultSet metadata.
-     */
-    SqlResultSetMeta metadata();
+/** */
+public interface SqlMultiResultSet extends Iterable<SqlResultSet>, AutoCloseable {
+    /** */
+    void close();
+
+    /** */
+    void apply();
 
     /**
      * Returns query unique id.
diff --git a/modules/api/src/main/java/org/apache/ignite/query/sql/SqlResultSet.java b/modules/api/src/main/java/org/apache/ignite/query/sql/SqlPrepared.java
similarity index 59%
copy from modules/api/src/main/java/org/apache/ignite/query/sql/SqlResultSet.java
copy to modules/api/src/main/java/org/apache/ignite/query/sql/SqlPrepared.java
index ea8003d..aec58fb 100644
--- a/modules/api/src/main/java/org/apache/ignite/query/sql/SqlResultSet.java
+++ b/modules/api/src/main/java/org/apache/ignite/query/sql/SqlPrepared.java
@@ -17,26 +17,10 @@
 
 package org.apache.ignite.query.sql;
 
-import java.util.UUID;
+import org.apache.ignite.table.Tuple;
+
 
 /**
- * SQL result set provides methods to access SQL query resul represented as collection of {@link SqlRow}.
- *
- * All the rows in result set have the same structure described in {@link SqlResultSetMeta}.
- * ResultSet must be closed after usage to free resources.
  */
-public interface SqlResultSet extends Iterable<SqlRow>, AutoCloseable {
-    /**
-     * Returns metadata for the results.
-     *
-     * @return ResultSet metadata.
-     */
-    SqlResultSetMeta metadata();
-
-    /**
-     * Returns query unique id.
-     *
-     * @return Query id.
-     */
-    UUID queryId();
+public interface SqlPrepared  {
 }
diff --git a/modules/api/src/main/java/org/apache/ignite/query/sql/SqlResultSet.java b/modules/api/src/main/java/org/apache/ignite/query/sql/SqlResultSet.java
index ea8003d..d69c231 100644
--- a/modules/api/src/main/java/org/apache/ignite/query/sql/SqlResultSet.java
+++ b/modules/api/src/main/java/org/apache/ignite/query/sql/SqlResultSet.java
@@ -39,4 +39,17 @@ public interface SqlResultSet extends Iterable<SqlRow>, AutoCloseable {
      * @return Query id.
      */
     UUID queryId();
+
+    /** */
+    QueryType queryType();
+
+    /** */
+    int updateCount();
+
+    /** */
+    enum QueryType {
+        SELECT,
+        DML,
+        DDL
+    }
 }
diff --git a/modules/api/src/main/java/org/apache/ignite/query/sql/SqlSession.java b/modules/api/src/main/java/org/apache/ignite/query/sql/SqlSession.java
index 8f10010..b1bd8b2 100644
--- a/modules/api/src/main/java/org/apache/ignite/query/sql/SqlSession.java
+++ b/modules/api/src/main/java/org/apache/ignite/query/sql/SqlSession.java
@@ -17,7 +17,6 @@
 
 package org.apache.ignite.query.sql;
 
-import java.sql.PreparedStatement;
 import org.apache.ignite.query.sql.async.AsyncSqlSession;
 import org.apache.ignite.query.sql.reactive.ReactiveSqlSession;
 import org.apache.ignite.tx.Transaction;
@@ -28,46 +27,40 @@ import org.jetbrains.annotations.Nullable;
  * SQL Session provides methods for query execution.
  */
 public interface SqlSession extends AsyncSqlSession, ReactiveSqlSession {
+    /** */
+    SqlSession withTransaction(@Nullable Transaction tx);
+
+    /** */
+    SqlSession setTimeout(@NotNull int timeout);
+
+    /** */
+    SqlSession setQuota(@NotNull Object quota);
+
+    /** */
+    SqlSession setSchema(@NotNull String schema);
+
     /**
      * Executes SQL query.
      *
      * @param sql SQL query template.
-     * @param tx Transaction (optional).
      * @param args Arguments for template (optional).
-     * @return SQL query resultset.
+     * @return SQL query results set.
      * @throws SQLException If failed.
      */
-    SqlResultSet executeQuery(@NotNull String sql, @Nullable Transaction tx, Object... args);
-
-    /**
-     * Executes DML query.
-     *
-     * @param sql SQL statement template.
-     * @param tx Transaction (optional).
-     * @param args Agruments for template (optional).
-     * @return Number of updated rows.
-     */
-    int executeUpdate(@NotNull String sql, @Nullable Transaction tx, Object... args);
-    //TODO: useful for bulk DML query, when we don't care of results.
-    //TODO: in contrary, execute() method may return inserted rows IDs that looks useful if AutoIncrement ID column is used.
+    SqlResultSet execute(@NotNull String sql, Object... args);
 
-    /**
-     * Executes DDL query.
-     *
-     * @param sql SQL statement template.
-     * @param tx Transaction (optional).
-     * @param args Agruments for template (optional).
-     */
-    void execute(@NotNull String sql, @Nullable Transaction tx, Object... args);
+    /** */
+    SqlResultSet execute(@NotNull SqlPrepared prep);
 
     /**
-     * Creates prepared statement.
+     * Executes SQL query.
      *
      * @param sql SQL query template.
-     * @return Prepared statement.
-     * @throws SQLException If parsing failed.
+     * @param args Arguments for template (optional).
+     * @return SQL query results set.
+     * @throws SQLException If failed.
      */
-    PreparedStatement preparedStatement(@NotNull String sql);
+    SqlMultiResultSet executeMulti(@NotNull String sql, Object... args);
 
     /**
      * Sets query session parameter.
diff --git a/modules/api/src/main/java/org/apache/ignite/query/sql/async/AsyncSqlSession.java b/modules/api/src/main/java/org/apache/ignite/query/sql/async/AsyncSqlSession.java
index 58c7825..26e0ba8 100644
--- a/modules/api/src/main/java/org/apache/ignite/query/sql/async/AsyncSqlSession.java
+++ b/modules/api/src/main/java/org/apache/ignite/query/sql/async/AsyncSqlSession.java
@@ -19,6 +19,7 @@ package org.apache.ignite.query.sql.async;
 
 import java.util.concurrent.CompletableFuture;
 import org.apache.ignite.query.sql.SQLException;
+import org.apache.ignite.query.sql.SqlPrepared;
 import org.apache.ignite.query.sql.SqlResultSet;
 import org.apache.ignite.tx.Transaction;
 import org.jetbrains.annotations.Nullable;
@@ -31,32 +32,17 @@ public interface AsyncSqlSession {
      * Executes SQL query in async way.
      *
      * @param sql SQL query template.
-     * @param tx Transaction (optional).
      * @param args Arguments for template (optional).
      * @return Operation future.
      * @throws SQLException If failed.
      */
-    CompletableFuture<SqlResultSet> executeQueryAsync(String sql, @Nullable Transaction tx, Object... args);
-
-    /**
-     * Executes DML SQL query in async way.
-     *
-     * @param sql SQL query template.
-     * @param tx Transaction (optional).
-     * @param args Arguments for template (optional).
-     * @return Operation future.
-     * @throws SQLException If failed.
-     */
-    CompletableFuture<Integer> executeUpdateAsync(String sql, @Nullable Transaction tx, Object... args);
+    CompletableFuture<SqlResultSet> executeAsync(String sql, Object... args);
 
     /**
      * Executes DDL SQL query in async way.
      *
-     * @param sql SQL query template.
-     * @param tx Transaction (optional).
-     * @param args Arguments for template (optional).
      * @return Operation future.
      * @throws SQLException If failed.
      */
-    CompletableFuture<Boolean> executeAsync(String sql, @Nullable Transaction tx, Object... args);
+    CompletableFuture<SqlResultSet> executeAsync(SqlPrepared prep);
 }
diff --git a/modules/sql/src/test/java/SqlTest.java b/modules/sql/src/test/java/SqlTest.java
index e6f0156..4b1d1e1 100644
--- a/modules/sql/src/test/java/SqlTest.java
+++ b/modules/sql/src/test/java/SqlTest.java
@@ -15,9 +15,9 @@
  * limitations under the License.
  */
 
-import java.math.BigDecimal;
 import java.util.List;
 import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Flow;
 import java.util.function.Consumer;
 import org.apache.ignite.query.sql.IgniteSql;
@@ -68,6 +68,9 @@ public class SqlTest {
 //            sess.setParameter("forceJoinOrder", true);
 //            sess.setParameter("useIndexHint", "idx1"); TODO: Where to move query hints?
 
+
+            SqlResultSet rs = sess.executeQuery("INSERT INTO table VALUES (?, ?)", tx, 10, "str%");
+
             SqlResultSet rs = sess.executeQuery("SELECT id, val FROM table WHERE id < {} AND val LIKE {};", tx, 10, "str%");
 
             for (SqlRow r : rs) {
@@ -82,11 +85,52 @@ public class SqlTest {
     }
 
     @Test
-    public void testAsyncSql() {
+    public void testAsyncSql() throws ExecutionException, InterruptedException {
+        SqlSession sess = queryMgr.session();
+
+        Iterable<CompletableFuture<SqlResultSet>> f = sess.executeAsync(
+                "CREATE TABLE tbl(id INTEGER PRIMARY KEY, val VARCHAR);" +
+                    "INSERT INTO  tbl VALUES (1, 2);" +
+                    "INSERT INTO  tbl VALUES (1, 2);" +
+                    "INSERT INTO  tbl VALUES (1, 2);" +
+                    "INSERT INTO  tbl VALUES (1, 2);" +
+                    "INSERT INTO  tbl VALUES (1, 2);" +
+                    "INSERT INTO  tbl VALUES (1, 2);" +
+                    "INSERT INTO  tbl VALUES (1, 2);" +
+                    "CREATE INDEX IDX_0 ON tbl (val);" +
+
+                    "CREATE TABLE tbl2(id INTEGER PRIMARY KEY, val VARCHAR);" +
+//                    "SELECT id, val FROM tbl WHERE id == {};" +
+//                    "DROP TABLE tbl", tx, 10)
+
+
+                    "CREATE TABLE tbl(id INTEGER PRIMARY KEY, val VARCHAR);" +
+                    "INSERT INTO  tbl VALUES (1, 2)" +
+                    "SELECT id, val FROM tbl WHERE id == {};" +
+                    "DROP TABLE tbl", tx, 10)
+
+            .thenCompose(rs -> {
+                String str = rs.iterator().next().stringValue("val");
+
+                return sess.executeQueryAsync("SELECT val FROM table where val LIKE {};", tx, str);
+            })
+            .thenApply(ignore -> tx);
+
+        sess.setTimeout(1);
+
+        Iterable<SqlResultSet> itRes = f.get();
+        // CREATE TABLE - not planned
+        // SELECT - not planned
+        // DROP - not planned
+
         igniteTx.beginAsync().thenCompose(tx -> {
             SqlSession sess = queryMgr.session();
 
-            return sess.executeQueryAsync("SELECT id, val FROM table WHERE id == {};", tx, 10)
+            return sess.executeQueryAsync(
+                "CREATE TABLE tbl(id INTEGER PRI<ARY KEY, val VARCHAR);" +
+                    "SELECT id, val FROM tbl WHERE id == {};" +
+                    "DROP TABLE tbl", tx, 10)
+
                 .thenCompose(rs -> {
                     String str = rs.iterator().next().stringValue("val");