Repository: incubator-ignite Updated Branches: refs/heads/master 5304e6ee4 -> a12775621
#ignite-961: Add sql fields metadata to rest query response. Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/201e208e Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/201e208e Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/201e208e Branch: refs/heads/master Commit: 201e208e82b0d0c8f8fdb16747d703eedc7f95db Parents: f22de3e Author: ivasilinets <ivasilin...@gridgain.com> Authored: Mon Jul 27 13:58:37 2015 +0300 Committer: ivasilinets <ivasilin...@gridgain.com> Committed: Mon Jul 27 13:58:37 2015 +0300 ---------------------------------------------------------------------- .../JettyRestProcessorAbstractSelfTest.java | 41 +++++- .../query/CacheQueryFieldsMetaResult.java | 133 +++++++++++++++++++ .../rest/handlers/query/CacheQueryResult.java | 19 +++ .../handlers/query/QueryCommandHandler.java | 21 +++ 4 files changed, 212 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/201e208e/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 160046c..8ce070f 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 @@ -650,7 +650,7 @@ public abstract class JettyRestProcessorAbstractSelfTest extends AbstractRestPro jsonEquals(ret, cacheBulkPattern(true, true)); - ret = content(F.asMap("cmd", "rmvall")); + ret = content(F.asMap("cmd", GridRestCommand.CACHE_REMOVE_ALL.key())); assertNotNull(ret); assertTrue(!ret.isEmpty()); @@ -1001,7 +1001,7 @@ public abstract class JettyRestProcessorAbstractSelfTest extends AbstractRestPro * @throws Exception If failed. */ public void testVersion() throws Exception { - String ret = content(F.asMap("cmd", "version")); + String ret = content(F.asMap("cmd", GridRestCommand.VERSION.key())); assertNotNull(ret); assertTrue(!ret.isEmpty()); @@ -1119,6 +1119,43 @@ public abstract class JettyRestProcessorAbstractSelfTest extends AbstractRestPro /** * @throws Exception If failed. */ + public void testSqlFieldsMetadataQuery() throws Exception { + String qry = "select firstName, lastName from Person"; + + Map<String, String> params = new HashMap<>(); + params.put("cmd", GridRestCommand.EXECUTE_SQL_FIELDS_QUERY.key()); + params.put("psz", "10"); + params.put("cacheName", "person"); + params.put("qry", URLEncoder.encode(qry)); + + String ret = content(params); + + assertNotNull(ret); + assertTrue(!ret.isEmpty()); + + JSONObject json = JSONObject.fromObject(ret); + + List items = (List)((Map)json.get("response")).get("items"); + + List meta = (List)((Map)json.get("response")).get("fieldsMetadata"); + + assertEquals(4, items.size()); + + assertEquals(2, meta.size()); + + JSONObject o = (JSONObject)meta.get(0); + + assertEquals("FIRSTNAME", o.get("fieldName")); + assertEquals("java.lang.String", o.get("fieldTypeName")); + assertEquals("person", o.get("schemaName")); + assertEquals("PERSON", o.get("typeName")); + + assertFalse(queryCursorFound()); + } + + /** + * @throws Exception If failed. + */ public void testQueryClose() throws Exception { String qry = "salary > ? and salary <= ?"; http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/201e208e/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/query/CacheQueryFieldsMetaResult.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/query/CacheQueryFieldsMetaResult.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/query/CacheQueryFieldsMetaResult.java new file mode 100644 index 0000000..8c4ddb0 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/query/CacheQueryFieldsMetaResult.java @@ -0,0 +1,133 @@ +/* + * 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.processors.rest.handlers.query; + +import org.apache.ignite.internal.processors.query.*; +import org.apache.ignite.internal.util.typedef.internal.*; + +import java.io.*; + +/** + * Cache query fields metadata. + */ +public class CacheQueryFieldsMetaResult implements Externalizable { + /** */ + private static final long serialVersionUID = 0L; + + /** Schema name. */ + private String schemaName; + + /** Type name. */ + private String typeName; + + /** Name. */ + private String fieldName; + + /** Type. */ + private String fieldTypeName; + + /** + * Empty constructor for Externalizable. + */ + public CacheQueryFieldsMetaResult() { + // No-op. + } + + /** + * @param meta Metadata + */ + public CacheQueryFieldsMetaResult(GridQueryFieldMetadata meta) { + schemaName = meta.schemaName(); + typeName = meta.typeName(); + fieldName = meta.fieldName(); + fieldTypeName = meta.fieldTypeName(); + } + + /** + * @return Schema name. + */ + public String getSchemaName() { + return schemaName; + } + + /** + * @param schemaName Schema name. + */ + public void setSchemaName(String schemaName) { + this.schemaName = schemaName; + } + + /** + * @return Type name. + */ + public String getTypeName() { + return typeName; + } + + /** + * @param typeName Type name. + */ + public void setTypeName(String typeName) { + this.typeName = typeName; + } + + /** + * @return Field name. + */ + public String getFieldName() { + return fieldName; + } + + /** + * @param fieldName Field name. + */ + public void setFieldName(String fieldName) { + this.fieldName = fieldName; + } + + + /** + * @return Field type name. + */ + public String getFieldTypeName() { + return fieldTypeName; + } + + /** + * @param fieldName Field name. + */ + public void setFieldTypeName(String fieldName) { + this.fieldName = fieldName; + } + + /** {@inheritDoc} */ + @Override public void writeExternal(ObjectOutput out) throws IOException { + U.writeString(out, schemaName); + U.writeString(out, typeName); + U.writeString(out, fieldName); + U.writeString(out, fieldTypeName); + } + + /** {@inheritDoc} */ + @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { + schemaName = U.readString(in); + typeName = U.readString(in); + fieldName = U.readString(in); + fieldTypeName = U.readString(in); + } +} http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/201e208e/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/query/CacheQueryResult.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/query/CacheQueryResult.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/query/CacheQueryResult.java index 3e49576..544a094 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/query/CacheQueryResult.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/query/CacheQueryResult.java @@ -35,6 +35,9 @@ public class CacheQueryResult implements Externalizable { /** Result items. */ private Collection<?> items; + /** Fields metadata. */ + private Collection<?> fieldsMeta; + /** Last flag. */ private boolean last; @@ -67,6 +70,20 @@ public class CacheQueryResult implements Externalizable { } /** + * @param fieldsMeta Fields metadata. + */ + public void setFieldsMetadata(Collection<?> fieldsMeta) { + this.fieldsMeta = fieldsMeta; + } + + /** + * @return Fields metadata. + */ + public Collection<?> getFieldsMetadata() { + return fieldsMeta; + } + + /** * @return Last flag. */ public boolean getLast() { @@ -90,6 +107,7 @@ public class CacheQueryResult implements Externalizable { out.writeBoolean(last); out.writeLong(qryId); U.writeCollection(out, items); + U.writeCollection(out, fieldsMeta); } /** {@inheritDoc} */ @@ -97,5 +115,6 @@ public class CacheQueryResult implements Externalizable { last = in.readBoolean(); qryId = in.readLong(); items = U.readCollection(in); + fieldsMeta = U.readCollection(in); } } http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/201e208e/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 defca37..59f95c9 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 @@ -20,6 +20,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.cache.*; +import org.apache.ignite.internal.processors.query.*; import org.apache.ignite.internal.processors.rest.*; import org.apache.ignite.internal.processors.rest.handlers.*; import org.apache.ignite.internal.processors.rest.request.*; @@ -146,6 +148,10 @@ public class QueryCommandHandler extends GridRestCommandHandlerAdapter { CacheQueryResult res = createQueryResult(qryCurs, cur, req, qryId); + List<GridQueryFieldMetadata> fieldsMeta = ((QueryCursorImpl<?>) qryCur).fieldsMeta(); + + res.setFieldsMetadata(convertMetadata(fieldsMeta)); + return new GridRestResponse(res); } catch (Exception e) { @@ -154,6 +160,21 @@ public class QueryCommandHandler extends GridRestCommandHandlerAdapter { return new GridRestResponse(GridRestResponse.STATUS_FAILED, e.getMessage()); } } + + /** + * @param meta Internal query field metadata. + * @return Rest query field metadata. + */ + private Collection<CacheQueryFieldsMetaResult> convertMetadata(Collection<GridQueryFieldMetadata> meta) { + List<CacheQueryFieldsMetaResult> res = new ArrayList<>(); + + if (meta != null) { + for (GridQueryFieldMetadata info : meta) + res.add(new CacheQueryFieldsMetaResult(info)); + } + + return res; + } } /**