Repository: incubator-ignite Updated Branches: refs/heads/ignite-961 b6c68eb56 -> f7bb17cf5
#ignite-961: query rest tests. Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/f7bb17cf Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/f7bb17cf Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/f7bb17cf Branch: refs/heads/ignite-961 Commit: f7bb17cf5ddbd19b1c2bda51b176bdccc6677941 Parents: b6c68eb Author: ivasilinets <ivasilin...@gridgain.com> Authored: Fri Jul 17 16:37:43 2015 +0300 Committer: ivasilinets <ivasilin...@gridgain.com> Committed: Fri Jul 17 16:37:43 2015 +0300 ---------------------------------------------------------------------- .../JettyRestProcessorAbstractSelfTest.java | 263 +++++++++++++++++++ .../handlers/query/QueryCommandHandler.java | 3 + .../http/jetty/GridJettyRestHandler.java | 12 +- 3 files changed, 274 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/f7bb17cf/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAbstractSelfTest.java ---------------------------------------------------------------------- diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAbstractSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAbstractSelfTest.java index 38bfef5..09c0e13 100644 --- a/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAbstractSelfTest.java +++ b/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAbstractSelfTest.java @@ -20,13 +20,19 @@ package org.apache.ignite.internal.processors.rest; import net.sf.json.*; import org.apache.ignite.*; import org.apache.ignite.cache.*; +import org.apache.ignite.cache.query.*; +import org.apache.ignite.cache.query.annotations.*; import org.apache.ignite.cluster.*; +import org.apache.ignite.configuration.*; +import org.apache.ignite.internal.processors.rest.handlers.*; import org.apache.ignite.internal.util.typedef.*; +import org.apache.ignite.testframework.*; import java.io.*; import java.net.*; import java.nio.charset.*; import java.util.*; +import java.util.concurrent.*; import java.util.regex.*; import static org.apache.ignite.IgniteSystemProperties.*; @@ -1386,5 +1392,262 @@ abstract class JettyRestProcessorAbstractSelfTest extends AbstractRestProcessorS assertEquals(qryId0, qryId); } + /** + * @throws Exception If failed. + */ + public void testQueryArgsPost() throws Exception { + initCache(); + + String qry = "salary > ? and salary <= ?"; + + String ret = makePostRequest(F.asMap("cmd", "qryexecute", "type", "Person", "psz", "10", "cacheName", "person", + "qry", URLEncoder.encode(qry)), + "{\"arg\": [1000, 2000]}"); + + assertNotNull(ret); + assertTrue(!ret.isEmpty()); + + JSONObject json = JSONObject.fromObject(ret); + + List items = (List)((Map)json.get("response")).get("items"); + + assertEquals(2, items.size()); + + for (int i = 0; i < GRID_CNT; ++i) { + Map<GridRestCommand, GridRestCommandHandler> handlers = + GridTestUtils.getFieldValue(grid(i).context().rest(), "handlers"); + + GridRestCommandHandler qryHnd = handlers.get(GridRestCommand.CLOSE_SQL_QUERY); + + ConcurrentHashMap<Long, Iterator> its = GridTestUtils.getFieldValue(qryHnd, "curs"); + + assertEquals(0, its.size()); + } + } + + /** + * @throws Exception If failed. + */ + public void testQueryArgs() throws Exception { + initCache(); + + String qry = "salary > ? and salary <= ?"; + + Map<String, String> params = new HashMap<>(); + params.put("cmd", "qryexecute"); + params.put("type", "Person"); + params.put("psz", "10"); + params.put("cacheName", "person"); + params.put("qry", URLEncoder.encode(qry)); + params.put("arg1", "1000"); + params.put("arg2", "2000"); + + String ret = content(params); + + assertNotNull(ret); + assertTrue(!ret.isEmpty()); + + JSONObject json = JSONObject.fromObject(ret); + + List items = (List)((Map)json.get("response")).get("items"); + + assertEquals(2, items.size()); + + for (int i = 0; i < GRID_CNT; ++i) { + Map<GridRestCommand, GridRestCommandHandler> handlers = + GridTestUtils.getFieldValue(grid(i).context().rest(), "handlers"); + + GridRestCommandHandler qryHnd = handlers.get(GridRestCommand.CLOSE_SQL_QUERY); + + ConcurrentHashMap<Long, Iterator> its = GridTestUtils.getFieldValue(qryHnd, "curs"); + + assertEquals(0, its.size()); + } + } + + /** + * @throws Exception If failed. + */ + public void testQueryClose() throws Exception { + initCache(); + + String qry = "salary > ? and salary <= ?"; + + String ret = makePostRequest(F.asMap("cmd", "qryexecute", "type", "Person", "psz", "1", "cacheName", "person", + "qry", URLEncoder.encode(qry)), + "{\"arg\": [1000, 2000]}"); + + assertNotNull(ret); + assertTrue(!ret.isEmpty()); + + JSONObject json = JSONObject.fromObject(ret); + + List items = (List)((Map)json.get("response")).get("items"); + + assertEquals(1, items.size()); + + boolean found = false; + + for (int i = 0; i < GRID_CNT; ++i) { + Map<GridRestCommand, GridRestCommandHandler> handlers = + GridTestUtils.getFieldValue(grid(i).context().rest(), "handlers"); + + GridRestCommandHandler qryHnd = handlers.get(GridRestCommand.CLOSE_SQL_QUERY); + + ConcurrentHashMap<Long, Iterator> its = GridTestUtils.getFieldValue(qryHnd, "curs"); + + found |= its.size() != 0; + } + + assertTrue(found); + + Integer qryId = (Integer)((Map)json.get("response")).get("queryId"); + + assertNotNull(qryId); + + ret = content(F.asMap("cmd", "qryclose", "cacheName", "person", "qryId", String.valueOf(qryId))); + + assertNotNull(ret); + assertTrue(!ret.isEmpty()); + + found = false; + + for (int i = 0; i < GRID_CNT; ++i) { + Map<GridRestCommand, GridRestCommandHandler> handlers = + GridTestUtils.getFieldValue(grid(i).context().rest(), "handlers"); + + GridRestCommandHandler qryHnd = handlers.get(GridRestCommand.CLOSE_SQL_QUERY); + + ConcurrentHashMap<Long, Iterator> its = GridTestUtils.getFieldValue(qryHnd, "curs"); + + found |= its.size() != 0; + } + + assertFalse(found); + } + protected abstract String signature() throws Exception; + + + /** + * Init cache. + */ + private void initCache() { + CacheConfiguration<Integer, Person> personCacheCfg = new CacheConfiguration<>("person"); + personCacheCfg.setIndexedTypes(Integer.class, Person.class); + + IgniteCache<Integer, Person> personCache = grid(0).getOrCreateCache(personCacheCfg); + + personCache.clear(); + + Person p1 = new Person("John", "Doe", 2000); + Person p2 = new Person("Jane", "Doe", 1000); + Person p3 = new Person("John", "Smith", 1000); + Person p4 = new Person("Jane", "Smith", 2000); + + personCache.put(p1.getId(), p1); + personCache.put(p2.getId(), p2); + personCache.put(p3.getId(), p3); + personCache.put(p4.getId(), p4); + + SqlQuery<Integer, Person> qry = new SqlQuery<>(Person.class, "salary > ? and salary <= ?"); + + qry.setArgs(1000, 2000); + + assertEquals(2, personCache.query(qry).getAll().size()); + } + + /** + * Person class. + */ + public static class Person implements Serializable { + /** Person id. */ + private static int PERSON_ID = 0; + + /** Person ID (indexed). */ + @QuerySqlField(index = true) + private Integer id; + + /** First name (not-indexed). */ + @QuerySqlField + private String firstName; + + /** Last name (not indexed). */ + @QuerySqlField + private String lastName; + + /** Salary (indexed). */ + @QuerySqlField(index = true) + private double salary; + + /** + * @param firstName First name. + * @param lastName Last name. + * @param salary Salary. + */ + Person(String firstName, String lastName, double salary) { + id = PERSON_ID++; + + this.firstName = firstName; + this.lastName = lastName; + this.salary = salary; + } + + /** + * @param firstName First name. + */ + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + /** + * @return First name. + */ + public String getFirstName() { + return firstName; + } + + /** + * @param lastName Last name. + */ + public void setLastName(String lastName) { + this.lastName = lastName; + } + + /** + * @return Last name. + */ + public String getLastName() { + return lastName; + } + + /** + * @param id Id. + */ + public void setId(Integer id) { + this.id = id; + } + + /** + * @param salary Salary. + */ + public void setSalary(double salary) { + this.salary = salary; + } + + /** + * @return Salary. + */ + public double getSalary() { + + return salary; + } + + /** + * @return Id. + */ + public Integer getId() { + return id; + } + } } http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/f7bb17cf/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 e2118b6..6eb2e20 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 @@ -197,6 +197,9 @@ public class QueryCommandHandler extends GridRestCommandHandlerAdapter { cur.close(); + qryCurs.remove(req.queryId()); + curs.remove(req.queryId()); + return new GridRestResponse(true); } catch (Exception e) { http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/f7bb17cf/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 1acab51..2d8fa3e 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 @@ -640,12 +640,16 @@ public class GridJettyRestHandler extends AbstractHandler { case EXECUTE_SQL_FIELDS_QUERY: { RestSqlQueryRequest restReq0 = new RestSqlQueryRequest(); - restReq0.sqlQuery((String)params.get("qry")); + restReq0.sqlQuery((String) params.get("qry")); - Map o = parseRequest(req); - List args = (List)ctx.scripting().toJavaObject(o.get("arg")); + if (req.getHeader("Content-Type") != null && req.getHeader("Content-Type").contains("json")) { + Map o = parseRequest(req); + List args = (List) ctx.scripting().toJavaObject(o.get("arg")); + restReq0.arguments(args.toArray()); + } + else + restReq0.arguments(values("arg", params).toArray()); - restReq0.arguments(args.toArray()); restReq0.typeName((String)params.get("type")); restReq0.pageSize(Integer.parseInt((String) params.get("psz"))); restReq0.cacheName((String)params.get("cacheName"));