Repository: incubator-ignite Updated Branches: refs/heads/ignite-964 fb182ab17 -> ed7dd30ed
#ignite-964: Query "select * from String" works for nodejs. Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/967ea548 Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/967ea548 Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/967ea548 Branch: refs/heads/ignite-964 Commit: 967ea5488fa8ff096a86f534fbb875fc434dba24 Parents: fb182ab Author: ivasilinets <ivasilin...@gridgain.com> Authored: Fri Jun 26 16:39:00 2015 +0300 Committer: ivasilinets <ivasilin...@gridgain.com> Committed: Fri Jun 26 16:39:00 2015 +0300 ---------------------------------------------------------------------- .../processors/rest/GridRestProcessor.java | 2 + .../handlers/query/QueryCommandHandler.java | 13 +++- .../rest/request/RestSqlQueryRequest.java | 40 +++++++++++- modules/nodejs/pom.xml | 6 ++ modules/nodejs/src/main/js/apache-ignite.js | 3 +- modules/nodejs/src/main/js/cache.js | 22 +++++-- modules/nodejs/src/main/js/compute.js | 20 ++---- modules/nodejs/src/main/js/server.js | 64 +++++++++++-------- modules/nodejs/src/main/js/sql-query.js | 65 ++++++++++++++++++++ .../ignite/internal/NodeJsAbstractTest.java | 1 + .../apache/ignite/internal/NodeJsSqlQuery.java | 47 ++++++++++++++ modules/nodejs/src/test/js/test-query.js | 53 ++++++++++++++++ .../http/jetty/GridJettyRestHandler.java | 4 +- 13 files changed, 288 insertions(+), 52 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/967ea548/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/GridRestProcessor.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/GridRestProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/GridRestProcessor.java index 5d886fc..bcc6496 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/GridRestProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/GridRestProcessor.java @@ -24,6 +24,7 @@ import org.apache.ignite.internal.processors.*; import org.apache.ignite.internal.processors.rest.client.message.*; import org.apache.ignite.internal.processors.rest.handlers.*; import org.apache.ignite.internal.processors.rest.handlers.cache.*; +import org.apache.ignite.internal.processors.rest.handlers.query.*; import org.apache.ignite.internal.processors.rest.handlers.scripting.*; import org.apache.ignite.internal.processors.rest.handlers.datastructures.*; import org.apache.ignite.internal.processors.rest.handlers.task.*; @@ -290,6 +291,7 @@ public class GridRestProcessor extends GridProcessorAdapter { addHandler(new GridVersionCommandHandler(ctx)); addHandler(new DataStructuresCommandHandler(ctx)); addHandler(new IgniteScriptingCommandHandler(ctx)); + addHandler(new QueryCommandHandler(ctx)); } } http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/967ea548/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/query/QueryCommandHandler.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/query/QueryCommandHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/query/QueryCommandHandler.java index 3f5c8bb..c866933 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/query/QueryCommandHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/query/QueryCommandHandler.java @@ -17,6 +17,8 @@ package org.apache.ignite.internal.processors.rest.handlers.query; +import org.apache.ignite.*; +import org.apache.ignite.cache.query.*; import org.apache.ignite.internal.*; import org.apache.ignite.internal.processors.rest.*; import org.apache.ignite.internal.processors.rest.handlers.*; @@ -25,6 +27,7 @@ import org.apache.ignite.internal.util.future.*; import org.apache.ignite.internal.util.typedef.internal.*; import org.apache.ignite.lang.*; +import javax.cache.*; import java.util.*; import static org.apache.ignite.internal.processors.rest.GridRestCommand.*; @@ -59,9 +62,15 @@ public class QueryCommandHandler extends GridRestCommandHandlerAdapter { assert req instanceof RestSqlQueryRequest : "Invalid type of query request."; return ctx.closure().callAsync(new IgniteClosure<RestSqlQueryRequest, GridRestResponse>() { - @Override public GridRestResponse apply(RestSqlQueryRequest req) { + @Override public GridRestResponse apply(RestSqlQueryRequest req0) { try { - return new GridRestResponse(); //TODO + SqlQuery<String, String> qry = new SqlQuery(String.class, req0.sqlQuery()); + + IgniteCache<Object, Object> cache = ctx.grid().cache(req0.cacheName()); + + List<Cache.Entry<String, String>> res = cache.query(qry).getAll(); + + return new GridRestResponse("Page size " + res); } catch (Exception e) { return new GridRestResponse(GridRestResponse.STATUS_FAILED, e.getMessage()); http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/967ea548/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/RestSqlQueryRequest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/RestSqlQueryRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/RestSqlQueryRequest.java index 4d74626..5731a03 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/RestSqlQueryRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/RestSqlQueryRequest.java @@ -25,7 +25,13 @@ public class RestSqlQueryRequest extends GridRestRequest { private String sqlQry; /** Sql query arguments. */ - private Object[] args; + private Object args; + + /** Page size. */ + private Integer pageSz; + + /** Cache name. */ + private String cacheName; /** * @param sqlQry Sql query. @@ -44,14 +50,42 @@ public class RestSqlQueryRequest extends GridRestRequest { /** * @param args Sql query arguments. */ - public void arguments(Object[] args) { + public void arguments(Object args) { this.args = args; } /** * @return Sql query arguments. */ - public Object[] arguments() { + public Object arguments() { return args; } + + /** + * @param pageSz Page size. + */ + public void pageSize(Integer pageSz) { + this.pageSz = pageSz; + } + + /** + * @return Page size. + */ + public int pageSize() { + return pageSz; + } + + /** + * @param cacheName Cache name. + */ + public void cacheName(String cacheName) { + this.cacheName = cacheName; + } + + /** + * @return Cache name. + */ + public String cacheName() { + return cacheName; + } } http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/967ea548/modules/nodejs/pom.xml ---------------------------------------------------------------------- diff --git a/modules/nodejs/pom.xml b/modules/nodejs/pom.xml index dcd3471..c9752b1 100644 --- a/modules/nodejs/pom.xml +++ b/modules/nodejs/pom.xml @@ -54,6 +54,12 @@ <dependency> <groupId>org.apache.ignite</groupId> + <artifactId>ignite-indexing</artifactId> + <version>${project.version}</version> + </dependency> + + <dependency> + <groupId>org.apache.ignite</groupId> <artifactId>ignite-rest-http</artifactId> <version>${project.version}</version> </dependency> http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/967ea548/modules/nodejs/src/main/js/apache-ignite.js ---------------------------------------------------------------------- diff --git a/modules/nodejs/src/main/js/apache-ignite.js b/modules/nodejs/src/main/js/apache-ignite.js index e8252fc..c65c49d 100644 --- a/modules/nodejs/src/main/js/apache-ignite.js +++ b/modules/nodejs/src/main/js/apache-ignite.js @@ -20,5 +20,6 @@ module.exports = { Ignition : require('./ignition.js').Ignition, Server : require('./server.js').Server, Ignite : require('./ignite.js').Ignite, - Compute : require('./compute.js').Compute + Compute : require('./compute.js').Compute, + SqlQuery : require('./sql-query.js').SqlQuery } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/967ea548/modules/nodejs/src/main/js/cache.js ---------------------------------------------------------------------- diff --git a/modules/nodejs/src/main/js/cache.js b/modules/nodejs/src/main/js/cache.js index 9333254..fcb3d49 100644 --- a/modules/nodejs/src/main/js/cache.js +++ b/modules/nodejs/src/main/js/cache.js @@ -131,12 +131,24 @@ Cache.prototype.getAll = function(keys, callback) { /** * Execute sql query * - * @param {string} qry Query - * @param {string[]} arg Arguments - * @param {onGet} callback Callback. + * @param {SqlQuery} qry Query */ -Cache.prototype.query = function(qry, arg, callback) { - this._server.runCommand("sqlqry", [Server.pair("qry", qry), Server.pair("arg", arg)], callback); +Cache.prototype.query = function(qry) { + function onQuery(qry, error, res) { + if (error) { + qry.error(error); + + return; + } + + qry.end(res); + } + + this._server.runCommand("sqlqry", [ + Server.pair("cacheName", this._cacheName), + Server.pair("qry", qry.query()), + Server.pair("arg", qry.arguments()), + Server.pair("psz", qry.pageSize())], onQuery.bind(null, qry)); } /** http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/967ea548/modules/nodejs/src/main/js/compute.js ---------------------------------------------------------------------- diff --git a/modules/nodejs/src/main/js/compute.js b/modules/nodejs/src/main/js/compute.js index 9aef39e..5789528 100644 --- a/modules/nodejs/src/main/js/compute.js +++ b/modules/nodejs/src/main/js/compute.js @@ -33,8 +33,8 @@ function Compute(server) { * @param {onGet} callback Callback */ Compute.prototype.runScript = function(runnable, args, callback) { - this._server.runCommand("runscript", [Server.pair("func", this._escape(runnable)), - Server.pair("arg", this._escape(args))], callback); + this._server.runCommand("runscript", [Server.pair("func", runnable), + Server.pair("arg", args)], callback); } /** @@ -47,24 +47,14 @@ Compute.prototype.runScript = function(runnable, args, callback) { Compute.prototype.execute = function(map, reduce, arg, callback) { var params = []; - params.push(Server.pair("map", this._escape(map))); - params.push(Server.pair("reduce", this._escape(reduce))); - params.push(Server.pair("arg", this._escape(arg))); + params.push(Server.pair("map", map)); + params.push(Server.pair("reduce", reduce)); + params.push(Server.pair("arg", arg)); this._server.runCommand("excmapreduce", params, callback); } /** - * @param {noValue} f Function - * @returns {string} Encoding function - */ -Compute.prototype._escape = function(f) { - var qs = require('querystring'); - - return qs.escape(f.toString()); -} - -/** * @name EmitFunction * @function * @param {function} func Remote job http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/967ea548/modules/nodejs/src/main/js/server.js ---------------------------------------------------------------------- diff --git a/modules/nodejs/src/main/js/server.js b/modules/nodejs/src/main/js/server.js index 2bd0b4e..376e981 100644 --- a/modules/nodejs/src/main/js/server.js +++ b/modules/nodejs/src/main/js/server.js @@ -87,33 +87,37 @@ Server.prototype.runCommand = function(cmdName, params, callback) { }); response.on('end', function () { - if (response.statusCode !== 200) { - if (response.statusCode === 401) { - callback.call(null, "Authentication failed. Status code 401."); + console.log("END " + response); + console.log("End status code " + response.statusCode); + console.log("Full response " + fullResponseString); + + if (response.statusCode !== 200) { + if (response.statusCode === 401) { + callback.call(null, "Authentication failed. Status code 401."); + } + else { + callback.call(null, "Request failed. Status code " + response.statusCode); + } + + return; } - else { - callback.call(null, "Request failed. Status code " + response.statusCode); + + var igniteResponse; + + try { + igniteResponse = JSON.parse(fullResponseString); + } + catch (e) { + callback.call(null, e, null); + return; } - return; - } - - var igniteResponse; - - try { - igniteResponse = JSON.parse(fullResponseString); - } - catch (e) { - callback.call(null, e, null); - return; - } - - if (igniteResponse.successStatus) { - callback.call(null, igniteResponse.error, null) - } - else { - callback.call(null, null, igniteResponse.response); - } + if (igniteResponse.successStatus) { + callback.call(null, igniteResponse.error, null) + } + else { + callback.call(null, null, igniteResponse.response); + } }); } @@ -144,7 +148,7 @@ Server.prototype.checkConnection = function(callback) { * @returns Pair of strings */ Server.pair = function(key, value) { - return {key: key, value: value} + return {key: Server._escape(key), value: Server._escape(value)} } /** @@ -175,4 +179,14 @@ Server.prototype._signature = function() { return {"X-Signature" : key}; } +/** + * @param {noValue} f Function + * @returns {string} Encoding function + */ +Server._escape = function(f) { + var qs = require('querystring'); + + return qs.escape(f.toString()); +} + exports.Server = Server; \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/967ea548/modules/nodejs/src/main/js/sql-query.js ---------------------------------------------------------------------- diff --git a/modules/nodejs/src/main/js/sql-query.js b/modules/nodejs/src/main/js/sql-query.js new file mode 100644 index 0000000..ea3b23b --- /dev/null +++ b/modules/nodejs/src/main/js/sql-query.js @@ -0,0 +1,65 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @this {SqlQuery} + * @param {string} Sql query + */ +function SqlQuery(sql) { + this._sql = sql; + this._arg = []; + this._pageSz = 0; + this._endFunc = function(res) {console.log("Empty end function is called [res=" + res + "]")}; + this._errFunc = function(err) {console.log("Empty error function is called [err=" + err + "]")} +} + +SqlQuery.prototype.on = function(code, f) { + switch(code) { + case "end": + this._endFunc = f; + + break; + case "error" : + this._errFunc = f; + + break; + default : + throw "Sql do not have method " + code; + } +} + +SqlQuery.prototype.end = function(res) { + return this._endFunc(res); +} + +SqlQuery.prototype.error = function(err) { + return this._errFunc(err); +} + +SqlQuery.prototype.query = function() { + return this._sql; +} + +SqlQuery.prototype.arguments = function() { + return this._arg; +} + +SqlQuery.prototype.pageSize = function() { + return this._pageSz; +} + +exports.SqlQuery = SqlQuery; \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/967ea548/modules/nodejs/src/test/java/org/apache/ignite/internal/NodeJsAbstractTest.java ---------------------------------------------------------------------- diff --git a/modules/nodejs/src/test/java/org/apache/ignite/internal/NodeJsAbstractTest.java b/modules/nodejs/src/test/java/org/apache/ignite/internal/NodeJsAbstractTest.java index 79ae908..47152e9 100644 --- a/modules/nodejs/src/test/java/org/apache/ignite/internal/NodeJsAbstractTest.java +++ b/modules/nodejs/src/test/java/org/apache/ignite/internal/NodeJsAbstractTest.java @@ -87,6 +87,7 @@ public class NodeJsAbstractTest extends GridCommonAbstractTest { ccfg.setName(CACHE_NAME); ccfg.setAtomicityMode(CacheAtomicityMode.ATOMIC); + ccfg.setIndexedTypes(String.class, String.class); return ccfg; } http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/967ea548/modules/nodejs/src/test/java/org/apache/ignite/internal/NodeJsSqlQuery.java ---------------------------------------------------------------------- diff --git a/modules/nodejs/src/test/java/org/apache/ignite/internal/NodeJsSqlQuery.java b/modules/nodejs/src/test/java/org/apache/ignite/internal/NodeJsSqlQuery.java new file mode 100644 index 0000000..54d6395 --- /dev/null +++ b/modules/nodejs/src/test/java/org/apache/ignite/internal/NodeJsSqlQuery.java @@ -0,0 +1,47 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal; + +/** + * Node js sql query test. + */ +public class NodeJsSqlQuery extends NodeJsAbstractTest { + /** + * Constructor. + */ + public NodeJsSqlQuery() { + super("test-query.js"); + } + + /** {@inheritDoc} */ + @Override protected void beforeTestsStarted() throws Exception { + startGrid(0); + } + + /** {@inheritDoc} */ + @Override protected void afterTestsStopped() throws Exception { + stopAllGrids(); + } + + /** + * @throws Exception If failed. + */ + public void testSqlQuery() throws Exception { + runJsScript("testSqlQuery"); + } +} http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/967ea548/modules/nodejs/src/test/js/test-query.js ---------------------------------------------------------------------- diff --git a/modules/nodejs/src/test/js/test-query.js b/modules/nodejs/src/test/js/test-query.js new file mode 100644 index 0000000..cb861fc --- /dev/null +++ b/modules/nodejs/src/test/js/test-query.js @@ -0,0 +1,53 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +var TestUtils = require("./test-utils").TestUtils; + +var assert = require("assert"); + +var Ignite = require(TestUtils.scriptPath()); +var SqlQuery = Ignite.SqlQuery; + +testSqlQuery = function() { + function sqlQuery(ignite, error) { + assert(error == null, "error on sql query [err=" + error + "]"); + + var qry = new SqlQuery("select * from String"); + + qry.on("error", function(err) { + console.log("!!!!!!!!!!!!Error: " + err); + + TestUtils.testFails(); + }); + + qry.on("end", function(res) { + console.log("!!!!!!!!!!!Result: " + res); + + TestUtils.testDone(); + }); + + ignite.cache("mycache").query(qry); + } + + function put(error, ignite) { + assert(error == null, "error on put [err=" + error + "]"); + + ignite.cache("mycache").put("key", "val", sqlQuery.bind(null, ignite)) + } + + TestUtils.startIgniteNode(put); +} http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/967ea548/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyRestHandler.java ---------------------------------------------------------------------- diff --git a/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyRestHandler.java b/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyRestHandler.java index 65eaa3c..c188439 100644 --- a/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyRestHandler.java +++ b/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyRestHandler.java @@ -475,7 +475,9 @@ public class GridJettyRestHandler extends AbstractHandler { RestSqlQueryRequest restReq0 = new RestSqlQueryRequest(); restReq0.sqlQuery((String)params.get("qry")); - restReq0.arguments((Object[]) params.get("arg")); + restReq0.arguments(params.get("arg")); + restReq0.pageSize(Integer.parseInt((String) params.get("psz"))); + restReq0.cacheName((String)params.get("cacheName")); restReq = restReq0;