Repository: asterixdb Updated Branches: refs/heads/master faf9791d2 -> bc7a081cc
[NO ISSUE][API][MTD] Query service servlet refactoring - user model changes: no - storage format changes: no - interface changes: no Details: - Query service servlet refactoring. - Add ".regexjson" to TestExecutor to allow comparing JSON documents irrespective of the order of elements/fields Change-Id: Ie477ba08405d2e58cb4b27d5d160e7773fe12488 Reviewed-on: https://asterix-gerrit.ics.uci.edu/3108 Sonar-Qube: Jenkins <jenk...@fulliautomatix.ics.uci.edu> Tested-by: Jenkins <jenk...@fulliautomatix.ics.uci.edu> Integration-Tests: Jenkins <jenk...@fulliautomatix.ics.uci.edu> Contrib: Jenkins <jenk...@fulliautomatix.ics.uci.edu> Reviewed-by: Murtadha Hubail <mhub...@apache.org> Project: http://git-wip-us.apache.org/repos/asf/asterixdb/repo Commit: http://git-wip-us.apache.org/repos/asf/asterixdb/commit/bc7a081c Tree: http://git-wip-us.apache.org/repos/asf/asterixdb/tree/bc7a081c Diff: http://git-wip-us.apache.org/repos/asf/asterixdb/diff/bc7a081c Branch: refs/heads/master Commit: bc7a081cc4b6bbaca169cb8e22b4ade7cbf2043b Parents: faf9791 Author: Ali Alsuliman <ali.al.solai...@gmail.com> Authored: Wed Jan 9 12:04:25 2019 -0800 Committer: Ali Alsuliman <ali.al.solai...@gmail.com> Committed: Wed Jan 9 14:21:09 2019 -0800 ---------------------------------------------------------------------- .../api/http/server/QueryServiceServlet.java | 10 ++- .../asterix/test/common/TestExecutor.java | 11 +++ .../apache/asterix/test/common/TestHelper.java | 74 ++++++++++++++++++++ 3 files changed, 92 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/asterixdb/blob/bc7a081c/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceServlet.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceServlet.java index fce9365..7c42e5c 100644 --- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceServlet.java +++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceServlet.java @@ -532,9 +532,7 @@ public class QueryServiceServlet extends AbstractQueryApiServlet { printSignature(sessionOutput.out(), param); } printType(sessionOutput.out(), sessionOutput.config()); - if (param.getStatement() == null || param.getStatement().isEmpty()) { - throw new RuntimeDataException(ErrorCode.NO_STATEMENT_PROVIDED); - } + validateStatement(param.getStatement()); String statementsText = param.getStatement() + ";"; if (param.isParseOnly()) { ResultUtil.ParseOnlyResult parseOnlyResult = parseStatement(statementsText); @@ -577,6 +575,12 @@ public class QueryServiceServlet extends AbstractQueryApiServlet { } } + protected void validateStatement(String statement) throws RuntimeDataException { + if (statement == null || statement.isEmpty()) { + throw new RuntimeDataException(ErrorCode.NO_STATEMENT_PROVIDED); + } + } + protected ResultUtil.ParseOnlyResult parseStatement(String statementsText) throws CompilationException { IParserFactory factory = compilationProvider.getParserFactory(); IParser parser = factory.createParser(statementsText); http://git-wip-us.apache.org/repos/asf/asterixdb/blob/bc7a081c/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java index 3aa8807..4766639 100644 --- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java +++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java @@ -234,6 +234,17 @@ public class TestExecutor { } else if (actualFile.toString().endsWith(".regexadm")) { runScriptAndCompareWithResultRegexAdm(scriptFile, expectedFile, actualFile); return; + } else if (actualFile.toString().endsWith(".regexjson")) { + ObjectMapper OM = new ObjectMapper(); + JsonNode expectedJson = OM.readTree(readerExpected); + JsonNode actualJson = OM.readTree(readerActual); + if (expectedJson == null || actualJson == null) { + throw new NullPointerException("Error parsing expected or actual result file for " + scriptFile); + } + if (!TestHelper.equalJson(expectedJson, actualJson)) { + throw new ComparisonException("Result for " + scriptFile + " didn't match the expected JSON"); + } + return; } String lineExpected, lineActual; int num = 1; http://git-wip-us.apache.org/repos/asf/asterixdb/blob/bc7a081c/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestHelper.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestHelper.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestHelper.java index a7a7fce..53ee9c2 100644 --- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestHelper.java +++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestHelper.java @@ -23,9 +23,11 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.util.BitSet; import java.util.Collections; import java.util.Enumeration; import java.util.HashMap; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.zip.ZipEntry; @@ -44,6 +46,8 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.MapperFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.ObjectNode; import com.fasterxml.jackson.databind.node.TextNode; public final class TestHelper { @@ -137,6 +141,76 @@ public final class TestHelper { return RequestParameters.deserializeParameterValues(RequestParameters.serializeParameterValues(stmtParams)); } + public static boolean equalJson(JsonNode expectedJson, JsonNode actualJson) { + if (expectedJson == actualJson) { + return true; + } + // exactly one is null + if (expectedJson == null || actualJson == null) { + return false; + } + // both are not null + if (!isRegexField(expectedJson) && expectedJson.getNodeType() != actualJson.getNodeType()) { + return false; + } else if (expectedJson.isArray() && actualJson.isArray()) { + ArrayNode expectedArray = (ArrayNode) expectedJson; + ArrayNode actualArray = (ArrayNode) actualJson; + if (expectedArray.size() != actualArray.size()) { + return false; + } + boolean found; + BitSet alreadyMatched = new BitSet(actualArray.size()); + for (int i = 0; i < expectedArray.size(); i++) { + found = false; + for (int k = 0; k < actualArray.size(); k++) { + if (!alreadyMatched.get(k) && equalJson(expectedArray.get(i), actualArray.get(k))) { + alreadyMatched.set(k); + found = true; + break; + } + } + if (!found) { + return false; + } + } + return true; + } else if (expectedJson.isObject() && actualJson.isObject()) { + // assumes no duplicates in field names + ObjectNode expectedObject = (ObjectNode) expectedJson; + ObjectNode actualObject = (ObjectNode) actualJson; + if (expectedObject.size() != actualObject.size()) { + return false; + } + Iterator<Map.Entry<String, JsonNode>> expectedFields = expectedObject.fields(); + Map.Entry<String, JsonNode> expectedField; + JsonNode actualFieldValue; + while (expectedFields.hasNext()) { + expectedField = expectedFields.next(); + actualFieldValue = actualObject.get(expectedField.getKey()); + if (actualFieldValue == null || !equalJson(expectedField.getValue(), actualFieldValue)) { + return false; + } + } + return true; + } + // value node + String expectedAsString = expectedJson.asText(); + String actualAsString = actualJson.asText(); + if (expectedAsString.startsWith("R{")) { + expectedAsString = expectedAsString.substring(2, expectedAsString.length() - 1); + return actualAsString.matches(expectedAsString); + } + return expectedAsString.equals(actualAsString); + } + + private static boolean isRegexField(JsonNode expectedJson) { + if (expectedJson.isTextual()) { + String regexValue = expectedJson.asText(); + return regexValue.startsWith("R{"); + } + return false; + } + private static ObjectMapper createObjectMapper() { ObjectMapper objectMapper = new ObjectMapper(); objectMapper.enable(SerializationFeature.INDENT_OUTPUT);