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