Return-Path: X-Original-To: apmail-asterixdb-commits-archive@minotaur.apache.org Delivered-To: apmail-asterixdb-commits-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 0733417B10 for ; Fri, 8 May 2015 19:24:22 +0000 (UTC) Received: (qmail 8203 invoked by uid 500); 8 May 2015 19:24:21 -0000 Delivered-To: apmail-asterixdb-commits-archive@asterixdb.apache.org Received: (qmail 8171 invoked by uid 500); 8 May 2015 19:24:21 -0000 Mailing-List: contact commits-help@asterixdb.incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@asterixdb.incubator.apache.org Delivered-To: mailing list commits@asterixdb.incubator.apache.org Received: (qmail 8162 invoked by uid 99); 8 May 2015 19:24:21 -0000 Received: from Unknown (HELO spamd4-us-west.apache.org) (209.188.14.142) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 08 May 2015 19:24:21 +0000 Received: from localhost (localhost [127.0.0.1]) by spamd4-us-west.apache.org (ASF Mail Server at spamd4-us-west.apache.org) with ESMTP id 31EB8C12C9 for ; Fri, 8 May 2015 19:24:21 +0000 (UTC) X-Virus-Scanned: Debian amavisd-new at spamd4-us-west.apache.org X-Spam-Flag: NO X-Spam-Score: 1.771 X-Spam-Level: * X-Spam-Status: No, score=1.771 tagged_above=-999 required=6.31 tests=[KAM_ASCII_DIVIDERS=0.8, KAM_LAZY_DOMAIN_SECURITY=1, RCVD_IN_MSPIKE_H3=-0.01, RCVD_IN_MSPIKE_WL=-0.01, T_RP_MATCHES_RCVD=-0.01, URIBL_BLOCKED=0.001] autolearn=disabled Received: from mx1-us-east.apache.org ([10.40.0.8]) by localhost (spamd4-us-west.apache.org [10.40.0.11]) (amavisd-new, port 10024) with ESMTP id VARbfJFPikud for ; Fri, 8 May 2015 19:24:06 +0000 (UTC) Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by mx1-us-east.apache.org (ASF Mail Server at mx1-us-east.apache.org) with SMTP id 3F30643DE9 for ; Fri, 8 May 2015 19:24:05 +0000 (UTC) Received: (qmail 7440 invoked by uid 99); 8 May 2015 19:24:04 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 08 May 2015 19:24:04 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id AF17BE41A5; Fri, 8 May 2015 19:24:04 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: imaxon@apache.org To: commits@asterixdb.incubator.apache.org Date: Fri, 08 May 2015 19:24:05 -0000 Message-Id: <5fbd990165c641289619ebf5d306c519@git.apache.org> In-Reply-To: <8a5b7a5b81734dc4832eb7a0707b273d@git.apache.org> References: <8a5b7a5b81734dc4832eb7a0707b273d@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [2/2] incubator-asterixdb git commit: Range connector update with order by hint. Range connector update with order by hint. Change-Id: I1b36f6dea801950c39bf63f27a0ec70d3584c5b7 Reviewed-on: https://asterix-gerrit.ics.uci.edu/254 Reviewed-by: Ildar Absalyamov Tested-by: Jenkins Reviewed-by: Steven Jacobs Project: http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/commit/d2d78adc Tree: http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/tree/d2d78adc Diff: http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/diff/d2d78adc Branch: refs/heads/master Commit: d2d78adcffb2d90c690eb3685e7495ee276a6996 Parents: 561a8d4 Author: Eldon Carman Authored: Thu May 7 16:23:41 2015 -0700 Committer: Ian Maxon Committed: Fri May 8 10:28:25 2015 -0700 ---------------------------------------------------------------------- .../AqlExpressionToPlanTranslator.java | 8 +- .../asterix/aql/translator/AqlTranslator.java | 13 +- .../sort-hint-on-closed-numeric-desc.aql | 27 ++ .../sort-hint-on-closed-numeric.aql | 27 ++ .../sort-hint-on-closed-string-desc.aql | 27 ++ .../sort-hint-on-closed-string.aql | 27 ++ .../sort-hint-on-closed-numeric-desc.plan | 12 + .../sort-hint-on-closed-numeric.plan | 12 + .../sort-hint-on-closed-string-desc.plan | 9 + .../sort-hint-on-closed-string.plan | 7 + .../order-by-exception_01.1.ddl.aql | 12 + .../order-by-exception_01.2.ddl.aql | 5 + .../order-by-exception_01.3.update.aql | 5 + .../order-by-exception_01.4.query.aql | 6 + .../order-by-exception_02.1.ddl.aql | 12 + .../order-by-exception_02.2.ddl.aql | 5 + .../order-by-exception_02.3.update.aql | 5 + .../order-by-exception_02.4.query.aql | 6 + .../range-hints/order-by/order-by.1.ddl.aql | 12 + .../range-hints/order-by/order-by.2.ddl.aql | 5 + .../range-hints/order-by/order-by.3.update.aql | 5 + .../range-hints/order-by/order-by.4.query.aql | 6 + .../range-hints/order-by/order-by.5.query.aql | 6 + .../range-hints/order-by/order-by.6.query.aql | 6 + .../range-hints/order-by/order-by.7.query.aql | 6 + .../results/range-hints/order-by/order-by.4.adm | 5 + .../results/range-hints/order-by/order-by.5.adm | 5 + .../results/range-hints/order-by/order-by.6.adm | 5 + .../results/range-hints/order-by/order-by.7.adm | 5 + .../src/test/resources/runtimets/testsuite.xml | 485 ++++++++++--------- asterix-aql/pom.xml | 247 +++++----- .../asterix/aql/expression/OrderbyClause.java | 10 + .../CloneAndSubstituteVariablesVisitor.java | 3 + .../ics/asterix/aql/util/RangeMapBuilder.java | 171 +++++++ asterix-aql/src/main/javacc/AQL.jj | 178 +++++-- asterix-doc/src/site/markdown/aql/functions.md | 80 +-- 36 files changed, 1029 insertions(+), 436 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/d2d78adc/asterix-algebra/src/main/java/edu/uci/ics/asterix/translator/AqlExpressionToPlanTranslator.java ---------------------------------------------------------------------- diff --git a/asterix-algebra/src/main/java/edu/uci/ics/asterix/translator/AqlExpressionToPlanTranslator.java b/asterix-algebra/src/main/java/edu/uci/ics/asterix/translator/AqlExpressionToPlanTranslator.java index d1268e5..ef9797d 100644 --- a/asterix-algebra/src/main/java/edu/uci/ics/asterix/translator/AqlExpressionToPlanTranslator.java +++ b/asterix-algebra/src/main/java/edu/uci/ics/asterix/translator/AqlExpressionToPlanTranslator.java @@ -88,6 +88,7 @@ import edu.uci.ics.asterix.aql.expression.WhereClause; import edu.uci.ics.asterix.aql.expression.WriteStatement; import edu.uci.ics.asterix.aql.expression.visitor.IAqlExpressionVisitor; import edu.uci.ics.asterix.aql.util.FunctionUtils; +import edu.uci.ics.asterix.aql.util.RangeMapBuilder; import edu.uci.ics.asterix.common.config.AsterixMetadataProperties; import edu.uci.ics.asterix.common.config.DatasetConfig.DatasetType; import edu.uci.ics.asterix.common.exceptions.AsterixException; @@ -910,7 +911,6 @@ public class AqlExpressionToPlanTranslator extends AbstractAqlTranslator impleme @Override public Pair visitOrderbyClause(OrderbyClause oc, Mutable tupSource) throws AsterixException { - OrderOperator ord = new OrderOperator(); Iterator modifIter = oc.getModifierList().iterator(); Mutable topOp = tupSource; @@ -930,6 +930,12 @@ public class AqlExpressionToPlanTranslator extends AbstractAqlTranslator impleme if (oc.getNumFrames() > 0) { ord.getAnnotations().put(OperatorAnnotations.MAX_NUMBER_FRAMES, oc.getNumFrames()); } + if (oc.getRangeMap() != null) { + Iterator orderModifIter = oc.getModifierList().iterator(); + boolean ascending = (orderModifIter.next() == OrderModifier.ASC); + RangeMapBuilder.verifyRangeOrder(oc.getRangeMap(), ascending); + ord.getAnnotations().put(OperatorAnnotations.USE_RANGE_CONNECTOR, oc.getRangeMap()); + } return new Pair(ord, null); } http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/d2d78adc/asterix-app/src/main/java/edu/uci/ics/asterix/aql/translator/AqlTranslator.java ---------------------------------------------------------------------- diff --git a/asterix-app/src/main/java/edu/uci/ics/asterix/aql/translator/AqlTranslator.java b/asterix-app/src/main/java/edu/uci/ics/asterix/aql/translator/AqlTranslator.java index 0184a65..4c47c7d 100644 --- a/asterix-app/src/main/java/edu/uci/ics/asterix/aql/translator/AqlTranslator.java +++ b/asterix-app/src/main/java/edu/uci/ics/asterix/aql/translator/AqlTranslator.java @@ -192,8 +192,7 @@ public class AqlTranslator extends AbstractAqlTranslator { private Dataverse activeDefaultDataverse; private final List declaredFunctions; - public AqlTranslator(List aqlStatements, SessionConfig conf) - throws MetadataException, AsterixException { + public AqlTranslator(List aqlStatements, SessionConfig conf) throws MetadataException, AsterixException { this.aqlStatements = aqlStatements; this.sessionConfig = conf; declaredFunctions = getDeclaredFunctions(aqlStatements); @@ -1736,7 +1735,8 @@ public class AqlTranslator extends AbstractAqlTranslator { CompiledLoadFromFileStatement cls = new CompiledLoadFromFileStatement(dataverseName, loadStmt .getDatasetName().getValue(), loadStmt.getAdapter(), loadStmt.getProperties(), loadStmt.dataIsAlreadySorted()); - JobSpecification spec = APIFramework.compileQuery(null, metadataProvider, null, 0, null, sessionConfig, cls); + JobSpecification spec = APIFramework + .compileQuery(null, metadataProvider, null, 0, null, sessionConfig, cls); MetadataManager.INSTANCE.commitTransaction(mdTxnCtx); bActiveTxn = false; if (spec != null) { @@ -1834,8 +1834,7 @@ public class AqlTranslator extends AbstractAqlTranslator { Pair reWrittenQuery = APIFramework.reWriteQuery(declaredFunctions, metadataProvider, query, sessionConfig); - // Query Compilation (happens under the same ongoing metadata - // transaction) + // Query Compilation (happens under the same ongoing metadata transaction) JobSpecification spec = APIFramework.compileQuery(declaredFunctions, metadataProvider, reWrittenQuery.first, reWrittenQuery.second, stmt == null ? null : stmt.getDatasetName(), sessionConfig, stmt); @@ -2193,8 +2192,8 @@ public class AqlTranslator extends AbstractAqlTranslator { // In this case (the normal case), we don't use the // "response" JSONObject - just stream the results // to the "out" PrintWriter - if (sessionConfig.fmt() == OutputFormat.CSV && - sessionConfig.is(SessionConfig.FORMAT_CSV_HEADER)) { + if (sessionConfig.fmt() == OutputFormat.CSV + && sessionConfig.is(SessionConfig.FORMAT_CSV_HEADER)) { ResultUtils.displayCSVHeader(metadataProvider.findOutputRecordType(), sessionConfig); } ResultUtils.displayResults(resultReader, sessionConfig); http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/d2d78adc/asterix-app/src/test/resources/optimizerts/queries/range-connector/sort-hint-on-closed-numeric-desc.aql ---------------------------------------------------------------------- diff --git a/asterix-app/src/test/resources/optimizerts/queries/range-connector/sort-hint-on-closed-numeric-desc.aql b/asterix-app/src/test/resources/optimizerts/queries/range-connector/sort-hint-on-closed-numeric-desc.aql new file mode 100644 index 0000000..1d13a10 --- /dev/null +++ b/asterix-app/src/test/resources/optimizerts/queries/range-connector/sort-hint-on-closed-numeric-desc.aql @@ -0,0 +1,27 @@ +/* + * Description : The hint is to use the range connector + * : This test is intended to verify that the range connector is used instead of single node merge. + * Expected Result : Success + * Date : 1th May 2015 + */ + +drop dataverse TinySocial if exists; +create dataverse TinySocial; +use dataverse TinySocial; + +create type TwitterUserType as open { + screen-name: string, + lang: string, + friends_count: int64, + statuses_count: int64, + name: string, + followers_count: int64 +} + +create dataset TwitterUsers(TwitterUserType) +primary key screen-name; + +for $user in dataset TwitterUsers +/*+ range [400, 150, 100] */ +order by $user.friends_count desc +return $user; \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/d2d78adc/asterix-app/src/test/resources/optimizerts/queries/range-connector/sort-hint-on-closed-numeric.aql ---------------------------------------------------------------------- diff --git a/asterix-app/src/test/resources/optimizerts/queries/range-connector/sort-hint-on-closed-numeric.aql b/asterix-app/src/test/resources/optimizerts/queries/range-connector/sort-hint-on-closed-numeric.aql new file mode 100644 index 0000000..1bf07ab --- /dev/null +++ b/asterix-app/src/test/resources/optimizerts/queries/range-connector/sort-hint-on-closed-numeric.aql @@ -0,0 +1,27 @@ +/* + * Description : The hint is to use the range connector + * : This test is intended to verify that the range connector is used instead of single node merge. + * Expected Result : Success + * Date : 1th May 2015 + */ + +drop dataverse TinySocial if exists; +create dataverse TinySocial; +use dataverse TinySocial; + +create type TwitterUserType as open { + screen-name: string, + lang: string, + friends_count: int64, + statuses_count: int64, + name: string, + followers_count: int64 +} + +create dataset TwitterUsers(TwitterUserType) +primary key screen-name; + +for $user in dataset TwitterUsers +/*+ range [100, 150, 400] */ +order by $user.friends_count +return $user; http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/d2d78adc/asterix-app/src/test/resources/optimizerts/queries/range-connector/sort-hint-on-closed-string-desc.aql ---------------------------------------------------------------------- diff --git a/asterix-app/src/test/resources/optimizerts/queries/range-connector/sort-hint-on-closed-string-desc.aql b/asterix-app/src/test/resources/optimizerts/queries/range-connector/sort-hint-on-closed-string-desc.aql new file mode 100644 index 0000000..7d61041 --- /dev/null +++ b/asterix-app/src/test/resources/optimizerts/queries/range-connector/sort-hint-on-closed-string-desc.aql @@ -0,0 +1,27 @@ +/* + * Description : The hint is to use the range connector + * : This test is intended to verify that the range connector is used instead of single node merge. + * Expected Result : Success + * Date : 1th May 2015 + */ + +drop dataverse TinySocial if exists; +create dataverse TinySocial; +use dataverse TinySocial; + +create type TwitterUserType as open { + screen-name: string, + lang: string, + friends_count: int64, + statuses_count: int64, + name: string, + followers_count: int64 +} + +create dataset TwitterUsers(TwitterUserType) +primary key screen-name; + +for $user in dataset TwitterUsers +/*+ range ["Nb", "F", "Ci"] */ +order by $user.screen-name desc +return $user; http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/d2d78adc/asterix-app/src/test/resources/optimizerts/queries/range-connector/sort-hint-on-closed-string.aql ---------------------------------------------------------------------- diff --git a/asterix-app/src/test/resources/optimizerts/queries/range-connector/sort-hint-on-closed-string.aql b/asterix-app/src/test/resources/optimizerts/queries/range-connector/sort-hint-on-closed-string.aql new file mode 100644 index 0000000..71de562 --- /dev/null +++ b/asterix-app/src/test/resources/optimizerts/queries/range-connector/sort-hint-on-closed-string.aql @@ -0,0 +1,27 @@ +/* + * Description : The hint is to use the range connector + * : This test is intended to verify that the range connector is used instead of single node merge. + * Expected Result : Success + * Date : 1th May 2015 + */ + +drop dataverse TinySocial if exists; +create dataverse TinySocial; +use dataverse TinySocial; + +create type TwitterUserType as open { + screen-name: string, + lang: string, + friends_count: int64, + statuses_count: int64, + name: string, + followers_count: int64 +} + +create dataset TwitterUsers(TwitterUserType) +primary key screen-name; + +for $user in dataset TwitterUsers +/*+ range ["Ci", "F", "Nb"] */ +order by $user.screen-name +return $user; http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/d2d78adc/asterix-app/src/test/resources/optimizerts/results/range-connector/sort-hint-on-closed-numeric-desc.plan ---------------------------------------------------------------------- diff --git a/asterix-app/src/test/resources/optimizerts/results/range-connector/sort-hint-on-closed-numeric-desc.plan b/asterix-app/src/test/resources/optimizerts/results/range-connector/sort-hint-on-closed-numeric-desc.plan new file mode 100644 index 0000000..cdedfde --- /dev/null +++ b/asterix-app/src/test/resources/optimizerts/results/range-connector/sort-hint-on-closed-numeric-desc.plan @@ -0,0 +1,12 @@ +-- DISTRIBUTE_RESULT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- RANGE_PARTITION_MERGE_EXCHANGE [$$4(DESC)] SPLIT COUNT:3 |PARTITIONED| + -- STABLE_SORT [$$4(DESC)] |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- DATASOURCE_SCAN |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- EMPTY_TUPLE_SOURCE |PARTITIONED| \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/d2d78adc/asterix-app/src/test/resources/optimizerts/results/range-connector/sort-hint-on-closed-numeric.plan ---------------------------------------------------------------------- diff --git a/asterix-app/src/test/resources/optimizerts/results/range-connector/sort-hint-on-closed-numeric.plan b/asterix-app/src/test/resources/optimizerts/results/range-connector/sort-hint-on-closed-numeric.plan new file mode 100644 index 0000000..ba0dc6f --- /dev/null +++ b/asterix-app/src/test/resources/optimizerts/results/range-connector/sort-hint-on-closed-numeric.plan @@ -0,0 +1,12 @@ +-- DISTRIBUTE_RESULT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- RANGE_PARTITION_MERGE_EXCHANGE [$$4(ASC)] SPLIT COUNT:3 |PARTITIONED| + -- STABLE_SORT [$$4(ASC)] |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- DATASOURCE_SCAN |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- EMPTY_TUPLE_SOURCE |PARTITIONED| \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/d2d78adc/asterix-app/src/test/resources/optimizerts/results/range-connector/sort-hint-on-closed-string-desc.plan ---------------------------------------------------------------------- diff --git a/asterix-app/src/test/resources/optimizerts/results/range-connector/sort-hint-on-closed-string-desc.plan b/asterix-app/src/test/resources/optimizerts/results/range-connector/sort-hint-on-closed-string-desc.plan new file mode 100644 index 0000000..3faa5ec --- /dev/null +++ b/asterix-app/src/test/resources/optimizerts/results/range-connector/sort-hint-on-closed-string-desc.plan @@ -0,0 +1,9 @@ +-- DISTRIBUTE_RESULT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- RANGE_PARTITION_MERGE_EXCHANGE [$$3(DESC)] SPLIT COUNT:3 |PARTITIONED| + -- STABLE_SORT [$$3(DESC)] |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- DATASOURCE_SCAN |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- EMPTY_TUPLE_SOURCE |PARTITIONED| \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/d2d78adc/asterix-app/src/test/resources/optimizerts/results/range-connector/sort-hint-on-closed-string.plan ---------------------------------------------------------------------- diff --git a/asterix-app/src/test/resources/optimizerts/results/range-connector/sort-hint-on-closed-string.plan b/asterix-app/src/test/resources/optimizerts/results/range-connector/sort-hint-on-closed-string.plan new file mode 100644 index 0000000..e0cffaa --- /dev/null +++ b/asterix-app/src/test/resources/optimizerts/results/range-connector/sort-hint-on-closed-string.plan @@ -0,0 +1,7 @@ +-- DISTRIBUTE_RESULT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- RANGE_PARTITION_MERGE_EXCHANGE [$$3(ASC)] SPLIT COUNT:3 |PARTITIONED| + -- DATASOURCE_SCAN |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- EMPTY_TUPLE_SOURCE |PARTITIONED| \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/d2d78adc/asterix-app/src/test/resources/runtimets/queries/range-hints/order-by-exception_01/order-by-exception_01.1.ddl.aql ---------------------------------------------------------------------- diff --git a/asterix-app/src/test/resources/runtimets/queries/range-hints/order-by-exception_01/order-by-exception_01.1.ddl.aql b/asterix-app/src/test/resources/runtimets/queries/range-hints/order-by-exception_01/order-by-exception_01.1.ddl.aql new file mode 100644 index 0000000..eab28a2 --- /dev/null +++ b/asterix-app/src/test/resources/runtimets/queries/range-hints/order-by-exception_01/order-by-exception_01.1.ddl.aql @@ -0,0 +1,12 @@ +drop dataverse TinySocial if exists; +create dataverse TinySocial; +use dataverse TinySocial; + +create type TwitterUserType as open { + screen-name: string, + lang: string, + friends_count: int64, + statuses_count: int64, + name: string, + followers_count: int64 +} http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/d2d78adc/asterix-app/src/test/resources/runtimets/queries/range-hints/order-by-exception_01/order-by-exception_01.2.ddl.aql ---------------------------------------------------------------------- diff --git a/asterix-app/src/test/resources/runtimets/queries/range-hints/order-by-exception_01/order-by-exception_01.2.ddl.aql b/asterix-app/src/test/resources/runtimets/queries/range-hints/order-by-exception_01/order-by-exception_01.2.ddl.aql new file mode 100644 index 0000000..8d402a7 --- /dev/null +++ b/asterix-app/src/test/resources/runtimets/queries/range-hints/order-by-exception_01/order-by-exception_01.2.ddl.aql @@ -0,0 +1,5 @@ +use dataverse TinySocial; + +create dataset TwitterUsers(TwitterUserType) +primary key screen-name; + http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/d2d78adc/asterix-app/src/test/resources/runtimets/queries/range-hints/order-by-exception_01/order-by-exception_01.3.update.aql ---------------------------------------------------------------------- diff --git a/asterix-app/src/test/resources/runtimets/queries/range-hints/order-by-exception_01/order-by-exception_01.3.update.aql b/asterix-app/src/test/resources/runtimets/queries/range-hints/order-by-exception_01/order-by-exception_01.3.update.aql new file mode 100644 index 0000000..2ed6ad5 --- /dev/null +++ b/asterix-app/src/test/resources/runtimets/queries/range-hints/order-by-exception_01/order-by-exception_01.3.update.aql @@ -0,0 +1,5 @@ +use dataverse TinySocial; + +load dataset TwitterUsers using localfs +(("path"="nc1://data/tinysocial/twu.adm"),("format"="adm")); + http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/d2d78adc/asterix-app/src/test/resources/runtimets/queries/range-hints/order-by-exception_01/order-by-exception_01.4.query.aql ---------------------------------------------------------------------- diff --git a/asterix-app/src/test/resources/runtimets/queries/range-hints/order-by-exception_01/order-by-exception_01.4.query.aql b/asterix-app/src/test/resources/runtimets/queries/range-hints/order-by-exception_01/order-by-exception_01.4.query.aql new file mode 100644 index 0000000..833521b --- /dev/null +++ b/asterix-app/src/test/resources/runtimets/queries/range-hints/order-by-exception_01/order-by-exception_01.4.query.aql @@ -0,0 +1,6 @@ +use dataverse TinySocial; + +for $user in dataset TwitterUsers +/*+ range ["Ci", "Nb", "F"] */ +order by $user.screen-name +return $user; http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/d2d78adc/asterix-app/src/test/resources/runtimets/queries/range-hints/order-by-exception_02/order-by-exception_02.1.ddl.aql ---------------------------------------------------------------------- diff --git a/asterix-app/src/test/resources/runtimets/queries/range-hints/order-by-exception_02/order-by-exception_02.1.ddl.aql b/asterix-app/src/test/resources/runtimets/queries/range-hints/order-by-exception_02/order-by-exception_02.1.ddl.aql new file mode 100644 index 0000000..eab28a2 --- /dev/null +++ b/asterix-app/src/test/resources/runtimets/queries/range-hints/order-by-exception_02/order-by-exception_02.1.ddl.aql @@ -0,0 +1,12 @@ +drop dataverse TinySocial if exists; +create dataverse TinySocial; +use dataverse TinySocial; + +create type TwitterUserType as open { + screen-name: string, + lang: string, + friends_count: int64, + statuses_count: int64, + name: string, + followers_count: int64 +} http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/d2d78adc/asterix-app/src/test/resources/runtimets/queries/range-hints/order-by-exception_02/order-by-exception_02.2.ddl.aql ---------------------------------------------------------------------- diff --git a/asterix-app/src/test/resources/runtimets/queries/range-hints/order-by-exception_02/order-by-exception_02.2.ddl.aql b/asterix-app/src/test/resources/runtimets/queries/range-hints/order-by-exception_02/order-by-exception_02.2.ddl.aql new file mode 100644 index 0000000..8d402a7 --- /dev/null +++ b/asterix-app/src/test/resources/runtimets/queries/range-hints/order-by-exception_02/order-by-exception_02.2.ddl.aql @@ -0,0 +1,5 @@ +use dataverse TinySocial; + +create dataset TwitterUsers(TwitterUserType) +primary key screen-name; + http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/d2d78adc/asterix-app/src/test/resources/runtimets/queries/range-hints/order-by-exception_02/order-by-exception_02.3.update.aql ---------------------------------------------------------------------- diff --git a/asterix-app/src/test/resources/runtimets/queries/range-hints/order-by-exception_02/order-by-exception_02.3.update.aql b/asterix-app/src/test/resources/runtimets/queries/range-hints/order-by-exception_02/order-by-exception_02.3.update.aql new file mode 100644 index 0000000..2ed6ad5 --- /dev/null +++ b/asterix-app/src/test/resources/runtimets/queries/range-hints/order-by-exception_02/order-by-exception_02.3.update.aql @@ -0,0 +1,5 @@ +use dataverse TinySocial; + +load dataset TwitterUsers using localfs +(("path"="nc1://data/tinysocial/twu.adm"),("format"="adm")); + http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/d2d78adc/asterix-app/src/test/resources/runtimets/queries/range-hints/order-by-exception_02/order-by-exception_02.4.query.aql ---------------------------------------------------------------------- diff --git a/asterix-app/src/test/resources/runtimets/queries/range-hints/order-by-exception_02/order-by-exception_02.4.query.aql b/asterix-app/src/test/resources/runtimets/queries/range-hints/order-by-exception_02/order-by-exception_02.4.query.aql new file mode 100644 index 0000000..66167c8 --- /dev/null +++ b/asterix-app/src/test/resources/runtimets/queries/range-hints/order-by-exception_02/order-by-exception_02.4.query.aql @@ -0,0 +1,6 @@ +use dataverse TinySocial; + +for $user in dataset TwitterUsers +/*+ range ["Ci", "Nb", "F"] */ +order by $user.screen-name desc +return $user; http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/d2d78adc/asterix-app/src/test/resources/runtimets/queries/range-hints/order-by/order-by.1.ddl.aql ---------------------------------------------------------------------- diff --git a/asterix-app/src/test/resources/runtimets/queries/range-hints/order-by/order-by.1.ddl.aql b/asterix-app/src/test/resources/runtimets/queries/range-hints/order-by/order-by.1.ddl.aql new file mode 100644 index 0000000..eab28a2 --- /dev/null +++ b/asterix-app/src/test/resources/runtimets/queries/range-hints/order-by/order-by.1.ddl.aql @@ -0,0 +1,12 @@ +drop dataverse TinySocial if exists; +create dataverse TinySocial; +use dataverse TinySocial; + +create type TwitterUserType as open { + screen-name: string, + lang: string, + friends_count: int64, + statuses_count: int64, + name: string, + followers_count: int64 +} http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/d2d78adc/asterix-app/src/test/resources/runtimets/queries/range-hints/order-by/order-by.2.ddl.aql ---------------------------------------------------------------------- diff --git a/asterix-app/src/test/resources/runtimets/queries/range-hints/order-by/order-by.2.ddl.aql b/asterix-app/src/test/resources/runtimets/queries/range-hints/order-by/order-by.2.ddl.aql new file mode 100644 index 0000000..8d402a7 --- /dev/null +++ b/asterix-app/src/test/resources/runtimets/queries/range-hints/order-by/order-by.2.ddl.aql @@ -0,0 +1,5 @@ +use dataverse TinySocial; + +create dataset TwitterUsers(TwitterUserType) +primary key screen-name; + http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/d2d78adc/asterix-app/src/test/resources/runtimets/queries/range-hints/order-by/order-by.3.update.aql ---------------------------------------------------------------------- diff --git a/asterix-app/src/test/resources/runtimets/queries/range-hints/order-by/order-by.3.update.aql b/asterix-app/src/test/resources/runtimets/queries/range-hints/order-by/order-by.3.update.aql new file mode 100644 index 0000000..2ed6ad5 --- /dev/null +++ b/asterix-app/src/test/resources/runtimets/queries/range-hints/order-by/order-by.3.update.aql @@ -0,0 +1,5 @@ +use dataverse TinySocial; + +load dataset TwitterUsers using localfs +(("path"="nc1://data/tinysocial/twu.adm"),("format"="adm")); + http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/d2d78adc/asterix-app/src/test/resources/runtimets/queries/range-hints/order-by/order-by.4.query.aql ---------------------------------------------------------------------- diff --git a/asterix-app/src/test/resources/runtimets/queries/range-hints/order-by/order-by.4.query.aql b/asterix-app/src/test/resources/runtimets/queries/range-hints/order-by/order-by.4.query.aql new file mode 100644 index 0000000..afb12ef --- /dev/null +++ b/asterix-app/src/test/resources/runtimets/queries/range-hints/order-by/order-by.4.query.aql @@ -0,0 +1,6 @@ +use dataverse TinySocial; + +for $user in dataset TwitterUsers +/*+ range ["Ci", "F", "Nb"] */ +order by $user.screen-name +return $user; http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/d2d78adc/asterix-app/src/test/resources/runtimets/queries/range-hints/order-by/order-by.5.query.aql ---------------------------------------------------------------------- diff --git a/asterix-app/src/test/resources/runtimets/queries/range-hints/order-by/order-by.5.query.aql b/asterix-app/src/test/resources/runtimets/queries/range-hints/order-by/order-by.5.query.aql new file mode 100644 index 0000000..f9dbfe1 --- /dev/null +++ b/asterix-app/src/test/resources/runtimets/queries/range-hints/order-by/order-by.5.query.aql @@ -0,0 +1,6 @@ +use dataverse TinySocial; + +for $user in dataset TwitterUsers +/*+ range ["Nb", "F", "Ci"] */ +order by $user.screen-name desc +return $user; http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/d2d78adc/asterix-app/src/test/resources/runtimets/queries/range-hints/order-by/order-by.6.query.aql ---------------------------------------------------------------------- diff --git a/asterix-app/src/test/resources/runtimets/queries/range-hints/order-by/order-by.6.query.aql b/asterix-app/src/test/resources/runtimets/queries/range-hints/order-by/order-by.6.query.aql new file mode 100644 index 0000000..e85e13a --- /dev/null +++ b/asterix-app/src/test/resources/runtimets/queries/range-hints/order-by/order-by.6.query.aql @@ -0,0 +1,6 @@ +use dataverse TinySocial; + +for $user in dataset TwitterUsers +/*+ range [100, 150, 400] */ +order by $user.friends_count +return $user; http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/d2d78adc/asterix-app/src/test/resources/runtimets/queries/range-hints/order-by/order-by.7.query.aql ---------------------------------------------------------------------- diff --git a/asterix-app/src/test/resources/runtimets/queries/range-hints/order-by/order-by.7.query.aql b/asterix-app/src/test/resources/runtimets/queries/range-hints/order-by/order-by.7.query.aql new file mode 100644 index 0000000..1ba71c5 --- /dev/null +++ b/asterix-app/src/test/resources/runtimets/queries/range-hints/order-by/order-by.7.query.aql @@ -0,0 +1,6 @@ +use dataverse TinySocial; + +for $user in dataset TwitterUsers +/*+ range [400, 150, 100] */ +order by $user.friends_count desc +return $user; http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/d2d78adc/asterix-app/src/test/resources/runtimets/results/range-hints/order-by/order-by.4.adm ---------------------------------------------------------------------- diff --git a/asterix-app/src/test/resources/runtimets/results/range-hints/order-by/order-by.4.adm b/asterix-app/src/test/resources/runtimets/results/range-hints/order-by/order-by.4.adm new file mode 100644 index 0000000..5820838 --- /dev/null +++ b/asterix-app/src/test/resources/runtimets/results/range-hints/order-by/order-by.4.adm @@ -0,0 +1,5 @@ +[ { "screen-name": "ChangEwing_573", "lang": "en", "friends_count": 182, "statuses_count": 394, "name": "Chang Ewing", "followers_count": 32136 } +, { "screen-name": "ColineGeyer@63", "lang": "en", "friends_count": 121, "statuses_count": 362, "name": "Coline Geyer", "followers_count": 17159 } +, { "screen-name": "NathanGiesen@211", "lang": "en", "friends_count": 18, "statuses_count": 473, "name": "Nathan Giesen", "followers_count": 49416 } +, { "screen-name": "NilaMilliron_tw", "lang": "en", "friends_count": 445, "statuses_count": 164, "name": "Nila Milliron", "followers_count": 22649 } + ] \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/d2d78adc/asterix-app/src/test/resources/runtimets/results/range-hints/order-by/order-by.5.adm ---------------------------------------------------------------------- diff --git a/asterix-app/src/test/resources/runtimets/results/range-hints/order-by/order-by.5.adm b/asterix-app/src/test/resources/runtimets/results/range-hints/order-by/order-by.5.adm new file mode 100644 index 0000000..bbb58ab --- /dev/null +++ b/asterix-app/src/test/resources/runtimets/results/range-hints/order-by/order-by.5.adm @@ -0,0 +1,5 @@ +[ { "screen-name": "NilaMilliron_tw", "lang": "en", "friends_count": 445, "statuses_count": 164, "name": "Nila Milliron", "followers_count": 22649 } +, { "screen-name": "NathanGiesen@211", "lang": "en", "friends_count": 18, "statuses_count": 473, "name": "Nathan Giesen", "followers_count": 49416 } +, { "screen-name": "ColineGeyer@63", "lang": "en", "friends_count": 121, "statuses_count": 362, "name": "Coline Geyer", "followers_count": 17159 } +, { "screen-name": "ChangEwing_573", "lang": "en", "friends_count": 182, "statuses_count": 394, "name": "Chang Ewing", "followers_count": 32136 } + ] \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/d2d78adc/asterix-app/src/test/resources/runtimets/results/range-hints/order-by/order-by.6.adm ---------------------------------------------------------------------- diff --git a/asterix-app/src/test/resources/runtimets/results/range-hints/order-by/order-by.6.adm b/asterix-app/src/test/resources/runtimets/results/range-hints/order-by/order-by.6.adm new file mode 100644 index 0000000..77b184b --- /dev/null +++ b/asterix-app/src/test/resources/runtimets/results/range-hints/order-by/order-by.6.adm @@ -0,0 +1,5 @@ +[ { "screen-name": "NathanGiesen@211", "lang": "en", "friends_count": 18, "statuses_count": 473, "name": "Nathan Giesen", "followers_count": 49416 } +, { "screen-name": "ColineGeyer@63", "lang": "en", "friends_count": 121, "statuses_count": 362, "name": "Coline Geyer", "followers_count": 17159 } +, { "screen-name": "ChangEwing_573", "lang": "en", "friends_count": 182, "statuses_count": 394, "name": "Chang Ewing", "followers_count": 32136 } +, { "screen-name": "NilaMilliron_tw", "lang": "en", "friends_count": 445, "statuses_count": 164, "name": "Nila Milliron", "followers_count": 22649 } + ] \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/d2d78adc/asterix-app/src/test/resources/runtimets/results/range-hints/order-by/order-by.7.adm ---------------------------------------------------------------------- diff --git a/asterix-app/src/test/resources/runtimets/results/range-hints/order-by/order-by.7.adm b/asterix-app/src/test/resources/runtimets/results/range-hints/order-by/order-by.7.adm new file mode 100644 index 0000000..9f60378 --- /dev/null +++ b/asterix-app/src/test/resources/runtimets/results/range-hints/order-by/order-by.7.adm @@ -0,0 +1,5 @@ +[ { "screen-name": "NilaMilliron_tw", "lang": "en", "friends_count": 445, "statuses_count": 164, "name": "Nila Milliron", "followers_count": 22649 } +, { "screen-name": "ChangEwing_573", "lang": "en", "friends_count": 182, "statuses_count": 394, "name": "Chang Ewing", "followers_count": 32136 } +, { "screen-name": "ColineGeyer@63", "lang": "en", "friends_count": 121, "statuses_count": 362, "name": "Coline Geyer", "followers_count": 17159 } +, { "screen-name": "NathanGiesen@211", "lang": "en", "friends_count": 18, "statuses_count": 473, "name": "Nathan Giesen", "followers_count": 49416 } + ] \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/d2d78adc/asterix-app/src/test/resources/runtimets/testsuite.xml ---------------------------------------------------------------------- diff --git a/asterix-app/src/test/resources/runtimets/testsuite.xml b/asterix-app/src/test/resources/runtimets/testsuite.xml index 9df6301..f97f793 100644 --- a/asterix-app/src/test/resources/runtimets/testsuite.xml +++ b/asterix-app/src/test/resources/runtimets/testsuite.xml @@ -4318,6 +4318,25 @@ + + + + order-by + + + + + order-by + edu.uci.ics.asterix.common.exceptions.AsterixException + + + + + order-by + edu.uci.ics.asterix.common.exceptions.AsterixException + + + @@ -5404,7 +5423,7 @@ query-issue562 - + @@ -6154,7 +6173,7 @@ agg_01 - + overlap_bins_gby_1 @@ -6310,237 +6329,237 @@ - - - probe-pidx-with-join-btree-sidx1 - - - - - probe-pidx-with-join-btree-sidx2 - - - - - probe-pidx-with-join-rtree-sidx1 - - - - - probe-pidx-with-join-rtree-sidx2 - - - - - probe-pidx-with-join-invidx-sidx1 - - - - - probe-pidx-with-join-invidx-sidx2 - - - - - - - query-issue443 - - - - - query-issue443-2 - - - - - - - tinysocial-suite - - - - - - - record01 - - - - - type_promotion_0 - - - - - type_promotion_1 - - - - - opentype_orderby_01 - - - - - promotion_closedtype_field_vs_closedtype_field_01 - - - - - promotion_closedtype_field_vs_closedtype_field_02 - - - - - promotion_closedtype_field_vs_closedtype_field_03 - - - - - promotion_closedtype_field_vs_closedtype_field_04 - - - - - promotion_closedtype_field_vs_closedtype_field_05 - - - - - promotion_closedtype_field_vs_constant_01 - - - - - promotion_closedtype_field_vs_constant_02 - - - - - promotion_closedtype_field_vs_constant_03 - - - - - promotion_closedtype_field_vs_constant_04 - - - - - promotion_closedtype_field_vs_constant_05 - - - - - promotion_closedtype_field_vs_constant_06 - - - - - promotion_closedtype_field_vs_constant_07 - - - - - promotion_closedtype_field_vs_constant_08 - - - - - promotion_closedtype_field_vs_constant_09 - - - - - promotion_closedtype_field_vs_constant_10 - - - - - promotion_closedtype_field_vs_constant_11 - - - - - promotion_closedtype_field_vs_opentype_field_01 - - - - - promotion_closedtype_field_vs_opentype_field_02 - - - - - promotion_closedtype_field_vs_opentype_field_03 - - - - - promotion_closedtype_field_vs_opentype_field_04 - - - - - promotion_opentype_field_vs_constant_01 - - - - - promotion_opentype_field_vs_constant_02 - - - - - promotion_opentype_field_vs_constant_03 - - - - - promotion_opentype_field_vs_constant_04 - - - - - promotion_opentype_field_vs_constant_05 - - - - - promotion_opentype_field_vs_constant_06 - - - - - promotion_opentype_field_vs_constant_07 - - - - - promotion_opentype_field_vs_constant_08 - - - - - promotion_opentype_field_vs_opentype_field_01 - - - - - promotion_opentype_field_vs_opentype_field_02 - - - - - - - assign-reuse - - - - - + + + probe-pidx-with-join-btree-sidx1 + + + + + probe-pidx-with-join-btree-sidx2 + + + + + probe-pidx-with-join-rtree-sidx1 + + + + + probe-pidx-with-join-rtree-sidx2 + + + + + probe-pidx-with-join-invidx-sidx1 + + + + + probe-pidx-with-join-invidx-sidx2 + + + + + + + query-issue443 + + + + + query-issue443-2 + + + + + + + tinysocial-suite + + + + + + + record01 + + + + + type_promotion_0 + + + + + type_promotion_1 + + + + + opentype_orderby_01 + + + + + promotion_closedtype_field_vs_closedtype_field_01 + + + + + promotion_closedtype_field_vs_closedtype_field_02 + + + + + promotion_closedtype_field_vs_closedtype_field_03 + + + + + promotion_closedtype_field_vs_closedtype_field_04 + + + + + promotion_closedtype_field_vs_closedtype_field_05 + + + + + promotion_closedtype_field_vs_constant_01 + + + + + promotion_closedtype_field_vs_constant_02 + + + + + promotion_closedtype_field_vs_constant_03 + + + + + promotion_closedtype_field_vs_constant_04 + + + + + promotion_closedtype_field_vs_constant_05 + + + + + promotion_closedtype_field_vs_constant_06 + + + + + promotion_closedtype_field_vs_constant_07 + + + + + promotion_closedtype_field_vs_constant_08 + + + + + promotion_closedtype_field_vs_constant_09 + + + + + promotion_closedtype_field_vs_constant_10 + + + + + promotion_closedtype_field_vs_constant_11 + + + + + promotion_closedtype_field_vs_opentype_field_01 + + + + + promotion_closedtype_field_vs_opentype_field_02 + + + + + promotion_closedtype_field_vs_opentype_field_03 + + + + + promotion_closedtype_field_vs_opentype_field_04 + + + + + promotion_opentype_field_vs_constant_01 + + + + + promotion_opentype_field_vs_constant_02 + + + + + promotion_opentype_field_vs_constant_03 + + + + + promotion_opentype_field_vs_constant_04 + + + + + promotion_opentype_field_vs_constant_05 + + + + + promotion_opentype_field_vs_constant_06 + + + + + promotion_opentype_field_vs_constant_07 + + + + + promotion_opentype_field_vs_constant_08 + + + + + promotion_opentype_field_vs_opentype_field_01 + + + + + promotion_opentype_field_vs_opentype_field_02 + + + + + + + assign-reuse + + + + + equality-predicate http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/d2d78adc/asterix-aql/pom.xml ---------------------------------------------------------------------- diff --git a/asterix-aql/pom.xml b/asterix-aql/pom.xml index 6cfa550..26e9684 100644 --- a/asterix-aql/pom.xml +++ b/asterix-aql/pom.xml @@ -12,60 +12,63 @@ ! See the License for the specific language governing permissions and ! limitations under the License. !--> - - 4.0.0 - - asterix - edu.uci.ics.asterix - 0.8.7-SNAPSHOT - + + 4.0.0 + + asterix + edu.uci.ics.asterix + 0.8.7-SNAPSHOT + - - - Apache License, Version 2.0 - http://www.apache.org/licenses/LICENSE-2.0.txt - repo - A business-friendly OSS license - - + + + Apache License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + repo + A business-friendly OSS license + + - asterix-aql - - - - org.apache.maven.plugins - maven-compiler-plugin - 2.3.2 - - 1.7 - 1.7 - true - - - - org.codehaus.mojo - javacc-maven-plugin - 2.6 - - - javacc - - javacc - - - false - true - - - - javacc-jjdoc - - jjdoc - - process-sources - - - + asterix-aql + + + + org.apache.maven.plugins + maven-compiler-plugin + 2.3.2 + + 1.7 + 1.7 + true + + + + org.codehaus.mojo + javacc-maven-plugin + 2.6 + + + javacc + + javacc + + + false + true + + + + javacc-jjdoc + + jjdoc + + process-sources + + + org.codehaus.mojo build-helper-maven-plugin @@ -85,76 +88,76 @@ - - - - - - org.eclipse.m2e - lifecycle-mapping - 1.0.0 - - - - - - - org.codehaus.mojo - - - javacc-maven-plugin - - - [2.6,) - - - jjdoc - javacc - - - - - - - - - - - - - + + + + + + org.eclipse.m2e + lifecycle-mapping + 1.0.0 + + + + + + + org.codehaus.mojo + + + javacc-maven-plugin + + + [2.6,) + + + jjdoc + javacc + + + + + + + + + + + + + - - - edu.uci.ics.asterix - asterix-common - 0.8.7-SNAPSHOT - compile - - - edu.uci.ics.asterix - asterix-om - 0.8.7-SNAPSHOT - compile - - - edu.uci.ics.asterix - asterix-metadata - 0.8.7-SNAPSHOT - compile - - - edu.uci.ics.fuzzyjoin - fuzzyjoin-core - 0.0.3 - compile - - - xerces - xerces - 2.4.0 - - + + + edu.uci.ics.asterix + asterix-common + 0.8.7-SNAPSHOT + compile + + + edu.uci.ics.asterix + asterix-om + 0.8.7-SNAPSHOT + compile + + + edu.uci.ics.asterix + asterix-metadata + 0.8.7-SNAPSHOT + compile + + + edu.uci.ics.fuzzyjoin + fuzzyjoin-core + 0.0.3 + compile + + + xerces + xerces + 2.4.0 + + http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/d2d78adc/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/expression/OrderbyClause.java ---------------------------------------------------------------------- diff --git a/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/expression/OrderbyClause.java b/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/expression/OrderbyClause.java index 4418df9..90e8724 100644 --- a/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/expression/OrderbyClause.java +++ b/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/expression/OrderbyClause.java @@ -21,10 +21,12 @@ import edu.uci.ics.asterix.aql.base.Expression; import edu.uci.ics.asterix.aql.expression.visitor.IAqlExpressionVisitor; import edu.uci.ics.asterix.aql.expression.visitor.IAqlVisitorWithVoidReturn; import edu.uci.ics.asterix.common.exceptions.AsterixException; +import edu.uci.ics.hyracks.dataflow.common.data.partition.range.IRangeMap; public class OrderbyClause implements Clause { private List orderbyList; private List modifierList; + private IRangeMap rangeMap; private int numFrames = -1; private int numTuples = -1; @@ -86,4 +88,12 @@ public class OrderbyClause implements Clause { public void setNumTuples(int numTuples) { this.numTuples = numTuples; } + + public IRangeMap getRangeMap() { + return rangeMap; + } + + public void setRangeMap(IRangeMap rangeMap) { + this.rangeMap = rangeMap; + } } http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/d2d78adc/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/rewrites/CloneAndSubstituteVariablesVisitor.java ---------------------------------------------------------------------- diff --git a/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/rewrites/CloneAndSubstituteVariablesVisitor.java b/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/rewrites/CloneAndSubstituteVariablesVisitor.java index 1e6747e..edb080c 100644 --- a/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/rewrites/CloneAndSubstituteVariablesVisitor.java +++ b/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/rewrites/CloneAndSubstituteVariablesVisitor.java @@ -311,6 +311,9 @@ public class CloneAndSubstituteVariablesVisitor implements List arg) throws AsterixException { List exprList = visitAndCloneExprList(oc.getOrderbyList(), arg); OrderbyClause oc2 = new OrderbyClause(exprList, oc.getModifierList()); + oc2.setNumFrames(oc.getNumFrames()); + oc2.setNumTuples(oc.getNumTuples()); + oc2.setRangeMap(oc.getRangeMap()); return new Pair>(oc2, arg); } http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/d2d78adc/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/util/RangeMapBuilder.java ---------------------------------------------------------------------- diff --git a/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/util/RangeMapBuilder.java b/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/util/RangeMapBuilder.java new file mode 100644 index 0000000..223358c --- /dev/null +++ b/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/util/RangeMapBuilder.java @@ -0,0 +1,171 @@ +/* + * Copyright 2009-2013 by The Regents of the University of California + * Licensed 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 from + * + * 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 edu.uci.ics.asterix.aql.util; + +import java.io.DataOutput; +import java.util.List; + +import edu.uci.ics.asterix.aql.base.Expression; +import edu.uci.ics.asterix.aql.base.Expression.Kind; +import edu.uci.ics.asterix.aql.base.Literal; +import edu.uci.ics.asterix.aql.base.Statement; +import edu.uci.ics.asterix.aql.expression.ListConstructor; +import edu.uci.ics.asterix.aql.expression.LiteralExpr; +import edu.uci.ics.asterix.aql.expression.Query; +import edu.uci.ics.asterix.aql.literal.DoubleLiteral; +import edu.uci.ics.asterix.aql.literal.FloatLiteral; +import edu.uci.ics.asterix.aql.literal.IntegerLiteral; +import edu.uci.ics.asterix.aql.literal.LongIntegerLiteral; +import edu.uci.ics.asterix.aql.literal.StringLiteral; +import edu.uci.ics.asterix.aql.parser.AQLParser; +import edu.uci.ics.asterix.aql.parser.ParseException; +import edu.uci.ics.asterix.common.exceptions.AsterixException; +import edu.uci.ics.asterix.formats.nontagged.AqlBinaryComparatorFactoryProvider; +import edu.uci.ics.asterix.formats.nontagged.AqlSerializerDeserializerProvider; +import edu.uci.ics.asterix.om.base.AMutableDouble; +import edu.uci.ics.asterix.om.base.AMutableFloat; +import edu.uci.ics.asterix.om.base.AMutableInt32; +import edu.uci.ics.asterix.om.base.AMutableInt64; +import edu.uci.ics.asterix.om.base.AMutableString; +import edu.uci.ics.asterix.om.types.ATypeTag; +import edu.uci.ics.asterix.om.types.BuiltinType; +import edu.uci.ics.hyracks.algebricks.common.exceptions.NotImplementedException; +import edu.uci.ics.hyracks.api.dataflow.value.IBinaryComparator; +import edu.uci.ics.hyracks.api.dataflow.value.IBinaryComparatorFactory; +import edu.uci.ics.hyracks.api.dataflow.value.ISerializerDeserializer; +import edu.uci.ics.hyracks.api.exceptions.HyracksDataException; +import edu.uci.ics.hyracks.data.std.util.ArrayBackedValueStorage; +import edu.uci.ics.hyracks.dataflow.common.data.partition.range.IRangeMap; +import edu.uci.ics.hyracks.dataflow.common.data.partition.range.RangeMap; + +public abstract class RangeMapBuilder { + + public static IRangeMap parseHint(Object hint) throws ParseException { + ArrayBackedValueStorage abvs = new ArrayBackedValueStorage(); + DataOutput out = abvs.getDataOutput();; + abvs.reset(); + + AQLParser parser = new AQLParser((String) hint); + List hintStatements = parser.parse(); + if (hintStatements.size() != 1) { + throw new ParseException("Only one range statement is allowed for the range hint."); + } + + // Translate the query into a Range Map + if (hintStatements.get(0).getKind() != Statement.Kind.QUERY) { + throw new ParseException("Not a proper query for the range hint."); + } + Query q = (Query) hintStatements.get(0); + + if (q.getBody().getKind() != Kind.LIST_CONSTRUCTOR_EXPRESSION) { + throw new ParseException("The range hint must be a list."); + } + List el = (List) ((ListConstructor) q.getBody()).getExprList(); + int offsets[] = new int[el.size()]; + + // Loop over list of literals + for (int i = 0; i < el.size(); ++i) { + Expression item = el.get(i); + if (item.getKind() == Kind.LITERAL_EXPRESSION) { + parseLiteralToBytes(item, out); + offsets[i] = abvs.getLength(); + } + // TODO Add support for composite fields. + } + + return new RangeMap(1, abvs.getByteArray(), offsets); + } + + @SuppressWarnings("unchecked") + private static void parseLiteralToBytes(Expression item, DataOutput out) throws ParseException { + AMutableDouble aDouble = new AMutableDouble(0); + AMutableFloat aFloat = new AMutableFloat(0); + AMutableInt64 aInt64 = new AMutableInt64(0); + AMutableInt32 aInt32 = new AMutableInt32(0); + AMutableString aString = new AMutableString(""); + @SuppressWarnings("rawtypes") + ISerializerDeserializer serde; + + Literal l = (Literal) ((LiteralExpr) item).getValue(); + try { + switch (l.getLiteralType()) { + case DOUBLE: + DoubleLiteral dl = (DoubleLiteral) l; + serde = AqlSerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ADOUBLE); + aDouble.setValue(dl.getValue()); + serde.serialize(aDouble, out); + break; + case FLOAT: + FloatLiteral fl = (FloatLiteral) l; + serde = AqlSerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AFLOAT); + aFloat.setValue(fl.getValue()); + serde.serialize(aFloat, out); + break; + case INTEGER: + IntegerLiteral il = (IntegerLiteral) l; + serde = AqlSerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINT32); + aInt32.setValue(il.getValue()); + serde.serialize(aInt32, out); + break; + case LONG: + LongIntegerLiteral lil = (LongIntegerLiteral) l; + serde = AqlSerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINT64); + aInt64.setValue(lil.getValue()); + serde.serialize(aInt64, out); + break; + case STRING: + StringLiteral sl = (StringLiteral) l; + serde = AqlSerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ASTRING); + aString.setValue(sl.getValue()); + serde.serialize(aString, out); + break; + default: + throw new NotImplementedException("The range map builder has not been implemented for " + + item.getKind() + " type of expressions."); + } + } catch (HyracksDataException e) { + throw new ParseException(e.getMessage()); + } + } + + public static void verifyRangeOrder(IRangeMap rangeMap, boolean ascending) throws AsterixException { + // TODO Add support for composite fields. + int fieldIndex = 0; + int fieldType = rangeMap.getTag(0, 0); + AqlBinaryComparatorFactoryProvider comparatorFactory = AqlBinaryComparatorFactoryProvider.INSTANCE; + IBinaryComparatorFactory bcf = comparatorFactory.getBinaryComparatorFactory( + ATypeTag.VALUE_TYPE_MAPPING[fieldType], ascending); + IBinaryComparator comparator = bcf.createBinaryComparator(); + int c = 0; + for (int split = 1; split < rangeMap.getSplitCount(); ++split) { + if (fieldType != rangeMap.getTag(fieldIndex, split)) { + throw new AsterixException("Range field contains more than a single type of items (" + fieldType + + " and " + rangeMap.getTag(fieldIndex, split) + ")."); + } + int previousSplit = split - 1; + try { + c = comparator.compare(rangeMap.getByteArray(fieldIndex, previousSplit), + rangeMap.getStartOffset(fieldIndex, previousSplit), + rangeMap.getLength(fieldIndex, previousSplit), rangeMap.getByteArray(fieldIndex, split), + rangeMap.getStartOffset(fieldIndex, split), rangeMap.getLength(fieldIndex, split)); + } catch (HyracksDataException e) { + throw new AsterixException(e); + } + if (c >= 0) { + throw new AsterixException("Range fields are not in sorted order."); + } + } + } +}