Repository: asterixdb Updated Branches: refs/heads/master c04b47783 -> f3aa19fb1
http://git-wip-us.apache.org/repos/asf/asterixdb/blob/f3aa19fb/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/filters/upsert/upsert.1.ddl.sqlpp ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/filters/upsert/upsert.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/filters/upsert/upsert.1.ddl.sqlpp index fd65d71..589e7f9 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/filters/upsert/upsert.1.ddl.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/filters/upsert/upsert.1.ddl.sqlpp @@ -82,8 +82,13 @@ create type typeTweet if not exists as open{ }; create dataset Tweet(typeTweet) primary key id -using compaction policy prefix (("max-mergable-component-size"="32768"),("max-tolerance-component-count"="32")) -with filter on create_at; +with filter on create_at +with { + "merge-policy": { + "name": "prefix", + "parameters": { "max-mergable-component-size": 32768, "max-tolerance-component-count": 32 } + } +}; create index text_idx if not exists on Tweet(`text`) type btree; create index state_idx if not exists on Tweet(geo_tag.stateID) type btree; http://git-wip-us.apache.org/repos/asf/asterixdb/blob/f3aa19fb/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/open-index-non-enforced/correlated-index-selection/btree-index-01/btree-index-01.1.ddl.sqlpp ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/open-index-non-enforced/correlated-index-selection/btree-index-01/btree-index-01.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/open-index-non-enforced/correlated-index-selection/btree-index-01/btree-index-01.1.ddl.sqlpp index caa7ca4..b42d017 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/open-index-non-enforced/correlated-index-selection/btree-index-01/btree-index-01.1.ddl.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/open-index-non-enforced/correlated-index-selection/btree-index-01/btree-index-01.1.ddl.sqlpp @@ -31,5 +31,9 @@ create type TestOpenType as open { create dataset TestOpen(TestOpenType) primary key c_id -using compaction policy `correlated-prefix` -((`max-mergable-component-size`="16384"),(`max-tolerance-component-count`="3")); +with { + "merge-policy": { + "name": "correlated-prefix", + "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 } + } +}; http://git-wip-us.apache.org/repos/asf/asterixdb/blob/f3aa19fb/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/upsert/multiple-correlated-secondaries/multiple-correlated-secondaries.1.ddl.sqlpp ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/upsert/multiple-correlated-secondaries/multiple-correlated-secondaries.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/upsert/multiple-correlated-secondaries/multiple-correlated-secondaries.1.ddl.sqlpp index 872e1bc..edfa1d3 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/upsert/multiple-correlated-secondaries/multiple-correlated-secondaries.1.ddl.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/upsert/multiple-correlated-secondaries/multiple-correlated-secondaries.1.ddl.sqlpp @@ -35,11 +35,19 @@ create type MyRecord as closed { create dataset UpsertTo(MyRecord) primary key id -using compaction policy `correlated-prefix` -((`max-mergable-component-size`=`16384`),(`max-tolerance-component-count`=`3`)); +with { + "merge-policy": { + "name": "correlated-prefix", + "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 } + } +}; create dataset UpsertFrom(MyRecord) primary key id -using compaction policy `correlated-prefix` -((`max-mergable-component-size`=`16384`),(`max-tolerance-component-count`=`3`)); +with { + "merge-policy": { + "name": "correlated-prefix", + "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 } + } +}; http://git-wip-us.apache.org/repos/asf/asterixdb/blob/f3aa19fb/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/upsert/primary-correlated-secondary-btree/primary-secondary-btree.1.ddl.sqlpp ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/upsert/primary-correlated-secondary-btree/primary-secondary-btree.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/upsert/primary-correlated-secondary-btree/primary-secondary-btree.1.ddl.sqlpp index d1db047..6095171 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/upsert/primary-correlated-secondary-btree/primary-secondary-btree.1.ddl.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/upsert/primary-correlated-secondary-btree/primary-secondary-btree.1.ddl.sqlpp @@ -34,9 +34,17 @@ salary:double }; create dataset UpsertTo(TestType) primary key id -using compaction policy `correlated-prefix` -((`max-mergable-component-size`=`16384`),(`max-tolerance-component-count`=`3`)); +with { + "merge-policy": { + "name": "correlated-prefix", + "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 } + } +}; create dataset UpsertFrom(TestType) primary key id -using compaction policy `correlated-prefix` -((`max-mergable-component-size`=`16384`),(`max-tolerance-component-count`=`3`)); +with { + "merge-policy": { + "name": "correlated-prefix", + "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 } + } +}; http://git-wip-us.apache.org/repos/asf/asterixdb/blob/f3aa19fb/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/upsert/primary-correlated-secondary-inverted/primary-correlated-secondary-inverted.1.ddl.sqlpp ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/upsert/primary-correlated-secondary-inverted/primary-correlated-secondary-inverted.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/upsert/primary-correlated-secondary-inverted/primary-correlated-secondary-inverted.1.ddl.sqlpp index f54ab2b..0b2b260 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/upsert/primary-correlated-secondary-inverted/primary-correlated-secondary-inverted.1.ddl.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/upsert/primary-correlated-secondary-inverted/primary-correlated-secondary-inverted.1.ddl.sqlpp @@ -30,10 +30,18 @@ create type DBLPType as closed { create dataset UpsertToDBLP(DBLPType) primary key id -using compaction policy `correlated-prefix` -((`max-mergable-component-size`=`16384`),(`max-tolerance-component-count`=`3`)); +with { + "merge-policy": { + "name": "correlated-prefix", + "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 } + } +}; create dataset UpsertFromDBLP(DBLPType) primary key id -using compaction policy `correlated-prefix` -((`max-mergable-component-size`=`16384`),(`max-tolerance-component-count`=`3`)); +with { + "merge-policy": { + "name": "correlated-prefix", + "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 } + } +}; http://git-wip-us.apache.org/repos/asf/asterixdb/blob/f3aa19fb/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/upsert/primary-correlated-secondary-rtree/primary-correlated-secondary-rtree.1.ddl.sqlpp ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/upsert/primary-correlated-secondary-rtree/primary-correlated-secondary-rtree.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/upsert/primary-correlated-secondary-rtree/primary-correlated-secondary-rtree.1.ddl.sqlpp index cc33f84..4cc2324 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/upsert/primary-correlated-secondary-rtree/primary-correlated-secondary-rtree.1.ddl.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/upsert/primary-correlated-secondary-rtree/primary-correlated-secondary-rtree.1.ddl.sqlpp @@ -33,11 +33,19 @@ create type MyRecord as closed { }; create dataset UpsertTo(MyRecord) - primary key id - using compaction policy `correlated-prefix` -((`max-mergable-component-size`=`16384`),(`max-tolerance-component-count`=`3`)); +primary key id +with { + "merge-policy": { + "name": "correlated-prefix", + "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 } + } +}; create dataset UpsertFrom(MyRecord) - primary key id - using compaction policy `correlated-prefix` -((`max-mergable-component-size`=`16384`),(`max-tolerance-component-count`=`3`)); +primary key id +with { + "merge-policy": { + "name": "correlated-prefix", + "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 } + } +}; http://git-wip-us.apache.org/repos/asf/asterixdb/blob/f3aa19fb/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ErrorCode.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ErrorCode.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ErrorCode.java index a4cf64a..1c85ff9 100644 --- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ErrorCode.java +++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ErrorCode.java @@ -133,6 +133,12 @@ public class ErrorCode { public static final int COMPILATION_FAILED_DUE_TO_REPLICATE_OP = 1054; public static final int COMPILATION_INCOMPATIBLE_FUNCTION_LANGUAGE = 1055; public static final int TOO_MANY_OPTIONS_FOR_FUNCTION = 1056; + public static final int EXPRESSION_NOT_SUPPORTED_IN_CONSTANT_RECORD = 1057; + public static final int LITERAL_TYPE_NOT_SUPPORTED_IN_CONSTANT_RECORD = 1058; + public static final int UNSUPPORTED_WITH_FIELD = 1059; + public static final int WITH_FIELD_MUST_BE_OF_TYPE = 1060; + public static final int WITH_FIELD_MUST_CONTAIN_SUB_FIELD = 1061; + public static final int MERGE_POLICY_PARAMETER_INVALID_TYPE = 1062; // Feed errors public static final int DATAFLOW_ILLEGAL_STATE = 3001; http://git-wip-us.apache.org/repos/asf/asterixdb/blob/f3aa19fb/asterixdb/asterix-common/src/main/resources/asx_errormsg/en.properties ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-common/src/main/resources/asx_errormsg/en.properties b/asterixdb/asterix-common/src/main/resources/asx_errormsg/en.properties index 39a74ff..61d8291 100644 --- a/asterixdb/asterix-common/src/main/resources/asx_errormsg/en.properties +++ b/asterixdb/asterix-common/src/main/resources/asx_errormsg/en.properties @@ -119,6 +119,12 @@ 1054 = Compilation failed due to some problem in the query plan. 1055 = Incompatible function language. Expect %1$s, but %2$s found. 1056 = Too many options were specified for %1$s +1057 = Expression of type %1$s is not supported in constant record +1058 = Literal of type %1$s is not supported in constant record +1059 = Field \"%1$s\" unsupported in the with clause +1060 = Field \"%1$s\" in the with clause must be of type %2$s +1061 = Field \"%1$s\" in the with clause must contain sub field \"%2$s\" +1062 = Merge policy parameters cannot be of type %1$s # Feed Errors 3001 = Illegal state. http://git-wip-us.apache.org/repos/asf/asterixdb/blob/f3aa19fb/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_ngram_index/primary_plus_correlated_ngram_index.2.ddl.aql ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_ngram_index/primary_plus_correlated_ngram_index.2.ddl.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_ngram_index/primary_plus_correlated_ngram_index.2.ddl.aql index be29328..bdce483 100644 --- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_ngram_index/primary_plus_correlated_ngram_index.2.ddl.aql +++ b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_ngram_index/primary_plus_correlated_ngram_index.2.ddl.aql @@ -61,12 +61,20 @@ create type FragileType as closed { /* Create dataset for loading raw Fragile data */ create dataset Fragile_raw (FragileTypeRaw) primary key row_id -using compaction policy "correlated-prefix" -(("max-mergable-component-size"="16384"),("max-tolerance-component-count"="3")); +with { + "merge-policy": { + "name": "correlated-prefix", + "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 } + } +}; /* Create dataset for cleaned Fragile data */ create dataset Fragile (FragileType) primary key row_id -using compaction policy "correlated-prefix" -(("max-mergable-component-size"="16384"),("max-tolerance-component-count"="3")); +with { + "merge-policy": { + "name": "correlated-prefix", + "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 } + } +}; http://git-wip-us.apache.org/repos/asf/asterixdb/blob/f3aa19fb/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_rtree_index/primary_plus_correlated_rtree_index.2.ddl.aql ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_rtree_index/primary_plus_correlated_rtree_index.2.ddl.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_rtree_index/primary_plus_correlated_rtree_index.2.ddl.aql index 9443205..0fa78f2 100644 --- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_rtree_index/primary_plus_correlated_rtree_index.2.ddl.aql +++ b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_rtree_index/primary_plus_correlated_rtree_index.2.ddl.aql @@ -62,11 +62,20 @@ create type FragileType as closed { /* Create dataset for loading raw Fragile data */ create dataset Fragile_raw (FragileTypeRaw) primary key row_id -using compaction policy "correlated-prefix" -(("max-mergable-component-size"="16384"),("max-tolerance-component-count"="3")); +with { + "merge-policy": { + "name": "correlated-prefix", + "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 } + } +}; + /* Create dataset for cleaned Fragile data */ create dataset Fragile (FragileType) primary key row_id -using compaction policy "correlated-prefix" -(("max-mergable-component-size"="16384"),("max-tolerance-component-count"="3")); +with { + "merge-policy": { + "name": "correlated-prefix", + "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 } + } +}; http://git-wip-us.apache.org/repos/asf/asterixdb/blob/f3aa19fb/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_correlated_secondary_index/primary_plus_default_correlated_secondary_index.2.ddl.aql ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_correlated_secondary_index/primary_plus_default_correlated_secondary_index.2.ddl.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_correlated_secondary_index/primary_plus_default_correlated_secondary_index.2.ddl.aql index 618c6b1..b27ec90 100644 --- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_correlated_secondary_index/primary_plus_default_correlated_secondary_index.2.ddl.aql +++ b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_correlated_secondary_index/primary_plus_default_correlated_secondary_index.2.ddl.aql @@ -60,12 +60,20 @@ create type FragileType as closed { /* Create dataset for loading raw Fragile data */ create dataset Fragile_raw (FragileTypeRaw) primary key row_id -using compaction policy "correlated-prefix" -(("max-mergable-component-size"="16384"),("max-tolerance-component-count"="3")); +with { + "merge-policy": { + "name": "correlated-prefix", + "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 } + } +}; /* Create dataset for cleaned Fragile data */ create dataset Fragile (FragileType) primary key row_id -using compaction policy "correlated-prefix" -(("max-mergable-component-size"="16384"),("max-tolerance-component-count"="3")); +with { + "merge-policy": { + "name": "correlated-prefix", + "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 } + } +}; http://git-wip-us.apache.org/repos/asf/asterixdb/blob/f3aa19fb/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_correlated_secondary_index/primary_plus_keyword_correlated_secondary_index.2.ddl.aql ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_correlated_secondary_index/primary_plus_keyword_correlated_secondary_index.2.ddl.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_correlated_secondary_index/primary_plus_keyword_correlated_secondary_index.2.ddl.aql index b1f61e2..c79a54c 100644 --- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_correlated_secondary_index/primary_plus_keyword_correlated_secondary_index.2.ddl.aql +++ b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_correlated_secondary_index/primary_plus_keyword_correlated_secondary_index.2.ddl.aql @@ -62,12 +62,20 @@ create type FragileType as closed { /* Create dataset for loading raw Fragile data */ create dataset Fragile_raw (FragileTypeRaw) primary key row_id -using compaction policy "correlated-prefix" -(("max-mergable-component-size"="16384"),("max-tolerance-component-count"="3")); +with { + "merge-policy": { + "name": "correlated-prefix", + "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 } + } +}; /* Create dataset for cleaned Fragile data */ create dataset Fragile (FragileType) primary key row_id -using compaction policy "correlated-prefix" -(("max-mergable-component-size"="16384"),("max-tolerance-component-count"="3")); +with { + "merge-policy": { + "name": "correlated-prefix", + "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 } + } +}; http://git-wip-us.apache.org/repos/asf/asterixdb/blob/f3aa19fb/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/primary_plus_multiple_correlated_secondary_indices.2.ddl.aql ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/primary_plus_multiple_correlated_secondary_indices.2.ddl.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/primary_plus_multiple_correlated_secondary_indices.2.ddl.aql index 69a6c9d..e473591 100644 --- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/primary_plus_multiple_correlated_secondary_indices.2.ddl.aql +++ b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/primary_plus_multiple_correlated_secondary_indices.2.ddl.aql @@ -62,12 +62,20 @@ create type FragileType as closed { /* Create dataset for loading raw Fragile data */ create dataset Fragile_raw (FragileTypeRaw) primary key row_id -using compaction policy "correlated-prefix" -(("max-mergable-component-size"="16384"),("max-tolerance-component-count"="3")); +with { + "merge-policy": { + "name": "correlated-prefix", + "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 } + } +}; /* Create dataset for cleaned Fragile data */ create dataset Fragile (FragileType) primary key row_id -using compaction policy "correlated-prefix" -(("max-mergable-component-size"="16384"),("max-tolerance-component-count"="3")); +with { + "merge-policy": { + "name": "correlated-prefix", + "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 } + } +}; http://git-wip-us.apache.org/repos/asf/asterixdb/blob/f3aa19fb/asterixdb/asterix-lang-aql/src/main/javacc/AQL.jj ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-lang-aql/src/main/javacc/AQL.jj b/asterixdb/asterix-lang-aql/src/main/javacc/AQL.jj index 59ed8ae..5c7c6f2 100644 --- a/asterixdb/asterix-lang-aql/src/main/javacc/AQL.jj +++ b/asterixdb/asterix-lang-aql/src/main/javacc/AQL.jj @@ -440,16 +440,15 @@ DatasetDecl DatasetSpecification() throws ParseException: Pair<Identifier,Identifier> typeComponents = null; String adapterName = null; Map<String,String> properties = null; - Map<String,String> compactionPolicyProperties = null; FunctionSignature appliedFunction = null; Pair<List<Integer>, List<List<String>>> primaryKeyFields = null; String nodeGroupName = null; Map<String,String> hints = new HashMap<String,String>(); DatasetDecl dsetDecl = null; boolean autogenerated = false; - String compactionPolicy = null; Pair<Integer, List<String>> filterField = null; Pair<Identifier,Identifier> metaTypeComponents = new Pair<Identifier, Identifier>(null, null); + RecordConstructor withRecord = null; } { ( @@ -459,24 +458,27 @@ DatasetDecl DatasetSpecification() throws ParseException: <USING> adapterName = AdapterName() properties = Configuration() ( <ON> nodeGroupName = Identifier() )? ( <HINTS> hints = Properties() )? - ( <USING> <COMPACTION> <POLICY> compactionPolicy = CompactionPolicy() (compactionPolicyProperties = Configuration())? )? + ( <WITH> withRecord = RecordConstructor() )? { ExternalDetailsDecl edd = new ExternalDetailsDecl(); edd.setAdapter(adapterName); edd.setProperties(properties); - dsetDecl = new DatasetDecl(nameComponents.first, - nameComponents.second, - typeComponents.first, - typeComponents.second, - metaTypeComponents.first, - metaTypeComponents.second, - nodeGroupName != null? new Identifier(nodeGroupName): null, - compactionPolicy, - compactionPolicyProperties, - hints, - DatasetType.EXTERNAL, - edd, - ifNotExists); + try{ + dsetDecl = new DatasetDecl(nameComponents.first, + nameComponents.second, + typeComponents.first, + typeComponents.second, + metaTypeComponents.first, + metaTypeComponents.second, + nodeGroupName != null? new Identifier(nodeGroupName): null, + hints, + DatasetType.EXTERNAL, + edd, + withRecord, + ifNotExists); + } catch (CompilationException e){ + throw new ParseException(e.getMessage()); + } } | ( <INTERNAL> )? @@ -498,8 +500,8 @@ DatasetDecl DatasetSpecification() throws ParseException: ( <AUTOGENERATED> { autogenerated = true; } )? ( <ON> nodeGroupName = Identifier() )? ( <HINTS> hints = Properties() )? - ( <USING> <COMPACTION> <POLICY> compactionPolicy = CompactionPolicy() (compactionPolicyProperties = Configuration())? )? - ( <WITH> <FILTER> <ON> filterField = NestedField() )? + ( LOOKAHEAD(2) <WITH> <FILTER> <ON> filterField = NestedField() )? + ( <WITH> withRecord = RecordConstructor() )? { if(filterField!=null && filterField.first!=0){ throw new ParseException("A filter field can only be a field in the main record of the dataset."); @@ -508,19 +510,22 @@ DatasetDecl DatasetSpecification() throws ParseException: primaryKeyFields.first, autogenerated, filterField == null? null : filterField.second); - dsetDecl = new DatasetDecl(nameComponents.first, + try{ + dsetDecl = new DatasetDecl(nameComponents.first, nameComponents.second, typeComponents.first, typeComponents.second, metaTypeComponents.first, metaTypeComponents.second, nodeGroupName != null ? new Identifier(nodeGroupName) : null, - compactionPolicy, - compactionPolicyProperties, hints, DatasetType.INTERNAL, idd, + withRecord, ifNotExists); + } catch (CompilationException e){ + throw new ParseException(e.getMessage()); + } } ) { http://git-wip-us.apache.org/repos/asf/asterixdb/blob/f3aa19fb/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/base/Literal.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/base/Literal.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/base/Literal.java index 1ca8ac4..c0beef4 100644 --- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/base/Literal.java +++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/base/Literal.java @@ -38,9 +38,9 @@ public abstract class Literal implements Serializable { LONG } - abstract public Object getValue(); + public abstract Object getValue(); - abstract public Type getLiteralType(); + public abstract Type getLiteralType(); public String getStringValue() { return getValue().toString(); http://git-wip-us.apache.org/repos/asf/asterixdb/blob/f3aa19fb/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/ListConstructor.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/ListConstructor.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/ListConstructor.java index 2a527d5..ca5dd57 100644 --- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/ListConstructor.java +++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/ListConstructor.java @@ -19,12 +19,12 @@ package org.apache.asterix.lang.common.expression; import java.util.List; +import java.util.Objects; import org.apache.asterix.common.exceptions.CompilationException; import org.apache.asterix.lang.common.base.AbstractExpression; import org.apache.asterix.lang.common.base.Expression; import org.apache.asterix.lang.common.visitor.base.ILangVisitor; -import org.apache.commons.lang3.ObjectUtils; public class ListConstructor extends AbstractExpression { private List<Expression> exprList; @@ -72,7 +72,7 @@ public class ListConstructor extends AbstractExpression { @Override public int hashCode() { - return ObjectUtils.hashCodeMulti(exprList, type); + return Objects.hash(exprList, type); } @Override @@ -84,6 +84,6 @@ public class ListConstructor extends AbstractExpression { return false; } ListConstructor target = (ListConstructor) object; - return ObjectUtils.equals(exprList, target.exprList) && ObjectUtils.equals(type, target.type); + return Objects.equals(exprList, target.exprList) && Objects.equals(type, target.type); } } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/f3aa19fb/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/LiteralExpr.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/LiteralExpr.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/LiteralExpr.java index 095f098..0c3fdb1 100644 --- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/LiteralExpr.java +++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/LiteralExpr.java @@ -18,11 +18,22 @@ */ package org.apache.asterix.lang.common.expression; +import java.util.Objects; + import org.apache.asterix.common.exceptions.CompilationException; +import org.apache.asterix.common.exceptions.ErrorCode; import org.apache.asterix.lang.common.base.AbstractExpression; import org.apache.asterix.lang.common.base.Literal; +import org.apache.asterix.lang.common.literal.DoubleLiteral; +import org.apache.asterix.lang.common.literal.LongIntegerLiteral; +import org.apache.asterix.lang.common.literal.StringLiteral; import org.apache.asterix.lang.common.visitor.base.ILangVisitor; -import org.apache.commons.lang3.ObjectUtils; +import org.apache.asterix.object.base.AdmBigIntNode; +import org.apache.asterix.object.base.AdmBooleanNode; +import org.apache.asterix.object.base.AdmDoubleNode; +import org.apache.asterix.object.base.AdmNullNode; +import org.apache.asterix.object.base.AdmStringNode; +import org.apache.asterix.object.base.IAdmNode; public class LiteralExpr extends AbstractExpression { private Literal value; @@ -55,7 +66,7 @@ public class LiteralExpr extends AbstractExpression { @Override public int hashCode() { - return ObjectUtils.hashCode(value); + return Objects.hashCode(value); } @Override @@ -67,6 +78,6 @@ public class LiteralExpr extends AbstractExpression { return false; } LiteralExpr target = (LiteralExpr) object; - return ObjectUtils.equals(value, target.value); + return Objects.equals(value, target.value); } } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/f3aa19fb/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/RecordConstructor.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/RecordConstructor.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/RecordConstructor.java index 1aa8ff1..cce92e6 100644 --- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/RecordConstructor.java +++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/RecordConstructor.java @@ -19,11 +19,11 @@ package org.apache.asterix.lang.common.expression; import java.util.List; +import java.util.Objects; import org.apache.asterix.common.exceptions.CompilationException; import org.apache.asterix.lang.common.base.AbstractExpression; import org.apache.asterix.lang.common.visitor.base.ILangVisitor; -import org.apache.commons.lang3.ObjectUtils; public class RecordConstructor extends AbstractExpression { private List<FieldBinding> fbList; @@ -57,7 +57,7 @@ public class RecordConstructor extends AbstractExpression { @Override public int hashCode() { - return ObjectUtils.hashCode(fbList); + return Objects.hashCode(fbList); } @Override @@ -69,6 +69,6 @@ public class RecordConstructor extends AbstractExpression { return false; } RecordConstructor target = (RecordConstructor) object; - return ObjectUtils.equals(fbList, target.fbList); + return Objects.equals(fbList, target.fbList); } } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/f3aa19fb/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/literal/DoubleLiteral.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/literal/DoubleLiteral.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/literal/DoubleLiteral.java index f362c15..5812b19 100644 --- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/literal/DoubleLiteral.java +++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/literal/DoubleLiteral.java @@ -23,9 +23,9 @@ import org.apache.commons.lang.ObjectUtils; public class DoubleLiteral extends Literal { private static final long serialVersionUID = -5685491458356989250L; - private Double value; + private double value; - public DoubleLiteral(Double value) { + public DoubleLiteral(double value) { super(); this.value = value; } @@ -35,6 +35,10 @@ public class DoubleLiteral extends Literal { return value; } + public double getDoubleValue() { + return value; + } + public void setValue(Double value) { this.value = value; } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/f3aa19fb/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/literal/LongIntegerLiteral.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/literal/LongIntegerLiteral.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/literal/LongIntegerLiteral.java index 66164d1..5e00cb8 100644 --- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/literal/LongIntegerLiteral.java +++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/literal/LongIntegerLiteral.java @@ -35,6 +35,10 @@ public class LongIntegerLiteral extends Literal { return value; } + public long getLongValue() { + return value; + } + public void setValue(Long value) { this.value = value; } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/f3aa19fb/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DatasetDecl.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DatasetDecl.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DatasetDecl.java index 79d1774..e63dae6 100644 --- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DatasetDecl.java +++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DatasetDecl.java @@ -18,34 +18,47 @@ */ package org.apache.asterix.lang.common.statement; +import java.util.Arrays; +import java.util.HashSet; import java.util.Map; +import java.util.Set; import org.apache.asterix.common.config.DatasetConfig.DatasetType; import org.apache.asterix.common.exceptions.CompilationException; +import org.apache.asterix.common.exceptions.ErrorCode; import org.apache.asterix.lang.common.base.Statement; +import org.apache.asterix.lang.common.expression.RecordConstructor; import org.apache.asterix.lang.common.struct.Identifier; +import org.apache.asterix.lang.common.util.ExpressionUtils; +import org.apache.asterix.lang.common.util.MergePolicyUtils; import org.apache.asterix.lang.common.visitor.base.ILangVisitor; +import org.apache.asterix.object.base.AdmObjectNode; +import org.apache.asterix.object.base.AdmStringNode; +import org.apache.asterix.object.base.IAdmNode; +import org.apache.asterix.om.types.ATypeTag; +import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException; public class DatasetDecl implements Statement { + protected static final String[] WITH_OBJECT_FIELDS = new String[] { MergePolicyUtils.MERGE_POLICY_PARAMETER_NAME }; + protected static final Set<String> WITH_OBJECT_FIELDS_SET = new HashSet<>(Arrays.asList(WITH_OBJECT_FIELDS)); + protected final Identifier name; protected final Identifier dataverse; protected final Identifier itemTypeDataverse; protected final Identifier itemTypeName; + protected final Identifier metaItemTypeDataverse; + protected final Identifier metaItemTypeName; protected final Identifier nodegroupName; - protected final String compactionPolicy; - protected final Map<String, String> compactionPolicyProperties; protected final DatasetType datasetType; protected final IDatasetDetailsDecl datasetDetailsDecl; protected final Map<String, String> hints; + private final AdmObjectNode withObjectNode; protected final boolean ifNotExists; - protected final Identifier metaItemTypeDataverse; - protected final Identifier metaItemTypeName; - public DatasetDecl(Identifier dataverse, Identifier name, Identifier itemTypeDataverse, Identifier itemTypeName, Identifier metaItemTypeDataverse, Identifier metaItemTypeName, Identifier nodeGroupName, - String compactionPolicy, Map<String, String> compactionPolicyProperties, Map<String, String> hints, - DatasetType datasetType, IDatasetDetailsDecl idd, boolean ifNotExists) { + Map<String, String> hints, DatasetType datasetType, IDatasetDetailsDecl idd, RecordConstructor withRecord, + boolean ifNotExists) throws CompilationException { this.dataverse = dataverse; this.name = name; this.itemTypeName = itemTypeName; @@ -61,9 +74,15 @@ public class DatasetDecl implements Statement { this.metaItemTypeDataverse = metaItemTypeDataverse; } this.nodegroupName = nodeGroupName; - this.compactionPolicy = compactionPolicy; - this.compactionPolicyProperties = compactionPolicyProperties; this.hints = hints; + try { + this.withObjectNode = withRecord == null ? null : ExpressionUtils.toNode(withRecord); + } catch (CompilationException e) { + throw e; + } catch (AlgebricksException e) { + // TODO(tillw) make signatures throw Algebricks exceptions + throw new CompilationException(e); + } this.ifNotExists = ifNotExists; this.datasetType = datasetType; this.datasetDetailsDecl = idd; @@ -121,12 +140,68 @@ public class DatasetDecl implements Statement { return nodegroupName; } - public String getCompactionPolicy() { - return compactionPolicy; + public String getCompactionPolicy() throws CompilationException { + AdmObjectNode mergePolicy = getMergePolicyObject(); + if (mergePolicy == null) { + return null; + } + IAdmNode mergePolicyName = mergePolicy.get(MergePolicyUtils.MERGE_POLICY_NAME_PARAMETER_NAME); + if (mergePolicyName == null) { + throw new CompilationException(ErrorCode.WITH_FIELD_MUST_CONTAIN_SUB_FIELD, + MergePolicyUtils.MERGE_POLICY_PARAMETER_NAME, MergePolicyUtils.MERGE_POLICY_NAME_PARAMETER_NAME); + } + if (mergePolicyName.getType() != ATypeTag.STRING) { + throw new CompilationException(ErrorCode.WITH_FIELD_MUST_BE_OF_TYPE, + MergePolicyUtils.MERGE_POLICY_PARAMETER_NAME + '.' + + MergePolicyUtils.MERGE_POLICY_NAME_PARAMETER_NAME, + ATypeTag.STRING); + } + return ((AdmStringNode) mergePolicyName).get(); + } + + private static AdmObjectNode validateWithObject(AdmObjectNode withObject) throws CompilationException { + if (withObject == null) { + return null; + } + for (String name : withObject.getFieldNames()) { + if (!WITH_OBJECT_FIELDS_SET.contains(name)) { + throw new CompilationException(ErrorCode.UNSUPPORTED_WITH_FIELD, name); + } + } + return withObject; + } + + private AdmObjectNode getMergePolicyObject() throws CompilationException { + if (withObjectNode == null) { + return null; + } + IAdmNode mergePolicy = validateWithObject(withObjectNode).get(MergePolicyUtils.MERGE_POLICY_PARAMETER_NAME); + if (mergePolicy == null) { + return null; + } + if (!mergePolicy.isObject()) { + throw new CompilationException(ErrorCode.WITH_FIELD_MUST_BE_OF_TYPE, + MergePolicyUtils.MERGE_POLICY_PARAMETER_NAME, ATypeTag.OBJECT); + } + return (AdmObjectNode) mergePolicy; } - public Map<String, String> getCompactionPolicyProperties() { - return compactionPolicyProperties; + public Map<String, String> getCompactionPolicyProperties() throws CompilationException { + AdmObjectNode mergePolicy = getMergePolicyObject(); + if (mergePolicy == null) { + return null; + } + IAdmNode mergePolicyParameters = mergePolicy.get(MergePolicyUtils.MERGE_POLICY_PARAMETERS_PARAMETER_NAME); + if (mergePolicyParameters == null) { + return null; + } + if (mergePolicyParameters.getType() != ATypeTag.OBJECT) { + throw new CompilationException(ErrorCode.WITH_FIELD_MUST_BE_OF_TYPE, + MergePolicyUtils.MERGE_POLICY_PARAMETER_NAME + '.' + + MergePolicyUtils.MERGE_POLICY_PARAMETERS_PARAMETER_NAME, + ATypeTag.OBJECT); + } + return MergePolicyUtils.toProperties((AdmObjectNode) mergePolicyParameters); } public Map<String, String> getHints() { @@ -156,4 +231,8 @@ public class DatasetDecl implements Statement { return Category.DDL; } + public AdmObjectNode getWithObjectNode() { + return withObjectNode; + } + } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/f3aa19fb/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/ExpressionUtils.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/ExpressionUtils.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/ExpressionUtils.java new file mode 100644 index 0000000..25f9d07 --- /dev/null +++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/ExpressionUtils.java @@ -0,0 +1,101 @@ +/* + * 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.asterix.lang.common.util; + +import java.util.List; + +import org.apache.asterix.common.exceptions.CompilationException; +import org.apache.asterix.common.exceptions.ErrorCode; +import org.apache.asterix.lang.common.base.Expression; +import org.apache.asterix.lang.common.base.Literal; +import org.apache.asterix.lang.common.expression.FieldBinding; +import org.apache.asterix.lang.common.expression.ListConstructor; +import org.apache.asterix.lang.common.expression.LiteralExpr; +import org.apache.asterix.lang.common.expression.RecordConstructor; +import org.apache.asterix.lang.common.literal.DoubleLiteral; +import org.apache.asterix.lang.common.literal.LongIntegerLiteral; +import org.apache.asterix.lang.common.literal.StringLiteral; +import org.apache.asterix.object.base.AdmArrayNode; +import org.apache.asterix.object.base.AdmBigIntNode; +import org.apache.asterix.object.base.AdmBooleanNode; +import org.apache.asterix.object.base.AdmDoubleNode; +import org.apache.asterix.object.base.AdmNullNode; +import org.apache.asterix.object.base.AdmObjectNode; +import org.apache.asterix.object.base.AdmStringNode; +import org.apache.asterix.object.base.IAdmNode; +import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException; + +public class ExpressionUtils { + private ExpressionUtils() { + } + + public static IAdmNode toNode(Expression expr) throws AlgebricksException { + switch (expr.getKind()) { + case LIST_CONSTRUCTOR_EXPRESSION: + return toNode((ListConstructor) expr); + case LITERAL_EXPRESSION: + return toNode((LiteralExpr) expr); + case RECORD_CONSTRUCTOR_EXPRESSION: + return toNode((RecordConstructor) expr); + default: + throw new CompilationException(ErrorCode.EXPRESSION_NOT_SUPPORTED_IN_CONSTANT_RECORD, expr.getKind()); + } + } + + public static AdmObjectNode toNode(RecordConstructor recordConstructor) throws AlgebricksException { + AdmObjectNode node = new AdmObjectNode(); + final List<FieldBinding> fbList = recordConstructor.getFbList(); + for (int i = 0; i < fbList.size(); i++) { + FieldBinding binding = fbList.get(i); + String key = LangRecordParseUtil.exprToStringLiteral(binding.getLeftExpr()).getStringValue(); + IAdmNode value = ExpressionUtils.toNode(binding.getRightExpr()); + node.set(key, value); + } + return node; + } + + private static IAdmNode toNode(ListConstructor listConstructor) throws AlgebricksException { + final List<Expression> exprList = listConstructor.getExprList(); + AdmArrayNode array = new AdmArrayNode(exprList.size()); + for (int i = 0; i < exprList.size(); i++) { + array.add(ExpressionUtils.toNode(exprList.get(i))); + } + return array; + } + + private static IAdmNode toNode(LiteralExpr literalExpr) throws AlgebricksException { + final Literal value = literalExpr.getValue(); + final Literal.Type literalType = value.getLiteralType(); + switch (literalType) { + case DOUBLE: + return new AdmDoubleNode(((DoubleLiteral) value).getDoubleValue()); + case FALSE: + case TRUE: + return AdmBooleanNode.get((Boolean) value.getValue()); + case LONG: + return new AdmBigIntNode(((LongIntegerLiteral) value).getLongValue()); + case NULL: + return AdmNullNode.INSTANCE; + case STRING: + return new AdmStringNode(((StringLiteral) value).getValue()); + default: + throw new CompilationException(ErrorCode.LITERAL_TYPE_NOT_SUPPORTED_IN_CONSTANT_RECORD, literalType); + } + } +} http://git-wip-us.apache.org/repos/asf/asterixdb/blob/f3aa19fb/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/LangRecordParseUtil.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/LangRecordParseUtil.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/LangRecordParseUtil.java index 080e2c4..c4b23ef 100644 --- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/LangRecordParseUtil.java +++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/LangRecordParseUtil.java @@ -26,6 +26,7 @@ import java.util.Map; import org.apache.asterix.builders.OrderedListBuilder; import org.apache.asterix.builders.RecordBuilder; +import org.apache.asterix.common.exceptions.CompilationException; import org.apache.asterix.common.exceptions.ErrorCode; import org.apache.asterix.formats.nontagged.SerializerDeserializerProvider; import org.apache.asterix.lang.common.base.Expression; @@ -56,22 +57,22 @@ import org.apache.hyracks.data.std.util.ArrayBackedValueStorage; public class LangRecordParseUtil { private static final String NOT_ALLOWED_EXPRESSIONS_ERROR_MESSAGE = "JSON record can only have expressions [%1$s, %2$s, %3$s]"; - private static final ISerializerDeserializer<ADouble> doubleSerde = SerializerDeserializerProvider.INSTANCE - .getSerializerDeserializer(BuiltinType.ADOUBLE); - private static final ISerializerDeserializer<AString> stringSerde = SerializerDeserializerProvider.INSTANCE - .getSerializerDeserializer(BuiltinType.ASTRING); - private static final ISerializerDeserializer<AInt64> intSerde = SerializerDeserializerProvider.INSTANCE - .getSerializerDeserializer(BuiltinType.AINT64); - private static final ISerializerDeserializer<ABoolean> booleanSerde = SerializerDeserializerProvider.INSTANCE - .getSerializerDeserializer(BuiltinType.ABOOLEAN); - private static final ISerializerDeserializer<ANull> nullSerde = SerializerDeserializerProvider.INSTANCE - .getSerializerDeserializer(BuiltinType.ANULL); + private static final ISerializerDeserializer<ADouble> doubleSerde = + SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ADOUBLE); + private static final ISerializerDeserializer<AString> stringSerde = + SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ASTRING); + private static final ISerializerDeserializer<AInt64> intSerde = + SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINT64); + private static final ISerializerDeserializer<ABoolean> booleanSerde = + SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ABOOLEAN); + private static final ISerializerDeserializer<ANull> nullSerde = + SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ANULL); private LangRecordParseUtil() { } private static void parseExpression(Expression expr, ArrayBackedValueStorage serialized) - throws HyracksDataException { + throws HyracksDataException, CompilationException { switch (expr.getKind()) { case LITERAL_EXPRESSION: parseLiteral((LiteralExpr) expr, serialized); @@ -84,14 +85,15 @@ public class LangRecordParseUtil { break; default: throw new HyracksDataException(ErrorCode.ASTERIX, ErrorCode.PARSE_ERROR, - NOT_ALLOWED_EXPRESSIONS_ERROR_MESSAGE, new Serializable[] { Expression.Kind.LITERAL_EXPRESSION - .toString(), Expression.Kind.RECORD_CONSTRUCTOR_EXPRESSION.toString(), + NOT_ALLOWED_EXPRESSIONS_ERROR_MESSAGE, + new Serializable[] { Expression.Kind.LITERAL_EXPRESSION.toString(), + Expression.Kind.RECORD_CONSTRUCTOR_EXPRESSION.toString(), Expression.Kind.LIST_CONSTRUCTOR_EXPRESSION.toString() }); } } public static void parseRecord(RecordConstructor recordValue, ArrayBackedValueStorage serialized, boolean tagged, - List<Pair<String, String>> defaults) throws HyracksDataException { + List<Pair<String, String>> defaults) throws HyracksDataException, CompilationException { AMutableString fieldNameString = new AMutableString(null); ArrayBackedValueStorage fieldName = new ArrayBackedValueStorage(); ArrayBackedValueStorage fieldValue = new ArrayBackedValueStorage(); @@ -106,8 +108,8 @@ public class LangRecordParseUtil { // get key fieldNameString.setValue(exprToStringLiteral(fb.getLeftExpr()).getStringValue()); if (!fieldNames.add(fieldNameString.getStringValue())) { - throw new HyracksDataException("Field " + fieldNameString.getStringValue() - + " was specified multiple times"); + throw new HyracksDataException( + "Field " + fieldNameString.getStringValue() + " was specified multiple times"); } stringSerde.serialize(fieldNameString, fieldName.getDataOutput()); // get value @@ -127,25 +129,25 @@ public class LangRecordParseUtil { recordBuilder.write(serialized.getDataOutput(), tagged); } - public static Literal exprToStringLiteral(Expression expr) throws HyracksDataException { + public static Literal exprToStringLiteral(Expression expr) throws CompilationException { if (expr.getKind() != Expression.Kind.LITERAL_EXPRESSION) { - throw new HyracksDataException(ErrorCode.ASTERIX, ErrorCode.PARSE_ERROR, - "Expected expression can only be of type %1$s", Expression.Kind.LITERAL_EXPRESSION); + throw new CompilationException(ErrorCode.PARSE_ERROR, "Expected expression can only be of type %1$s", + Expression.Kind.LITERAL_EXPRESSION); } LiteralExpr keyLiteralExpr = (LiteralExpr) expr; Literal keyLiteral = keyLiteralExpr.getValue(); if (keyLiteral.getLiteralType() != Literal.Type.STRING) { - throw new HyracksDataException(ErrorCode.ASTERIX, ErrorCode.PARSE_ERROR, - "Expected Literal can only be of type %1$s", Literal.Type.STRING); + throw new CompilationException(ErrorCode.PARSE_ERROR, "Expected Literal can only be of type %1$s", + Literal.Type.STRING); } return keyLiteral; } private static void parseList(ListConstructor valueExpr, ArrayBackedValueStorage serialized) - throws HyracksDataException { + throws CompilationException, HyracksDataException { if (valueExpr.getType() != ListConstructor.Type.ORDERED_LIST_CONSTRUCTOR) { - throw new HyracksDataException(ErrorCode.ASTERIX, ErrorCode.PARSE_ERROR, - "JSON List can't be of type %1$s", valueExpr.getType()); + throw new HyracksDataException(ErrorCode.ASTERIX, ErrorCode.PARSE_ERROR, "JSON List can't be of type %1$s", + valueExpr.getType()); } ArrayBackedValueStorage serializedValue = new ArrayBackedValueStorage(); OrderedListBuilder listBuilder = new OrderedListBuilder(); @@ -187,13 +189,12 @@ public class LangRecordParseUtil { stringSerde.serialize(new AString((String) value.getValue()), serialized.getDataOutput()); break; default: - throw new HyracksDataException(ErrorCode.ASTERIX, ErrorCode.PARSE_ERROR, - "Unknown Literal Type %1$s", value.getLiteralType()); + throw new HyracksDataException(ErrorCode.ASTERIX, ErrorCode.PARSE_ERROR, "Unknown Literal Type %1$s", + value.getLiteralType()); } } - public static void recordToMap(Map<String, String> map, ARecord record) - throws AlgebricksException { + public static void recordToMap(Map<String, String> map, ARecord record) throws AlgebricksException { String[] keys = record.getType().getFieldNames(); for (int i = 0; i < keys.length; i++) { String key = keys[i]; http://git-wip-us.apache.org/repos/asf/asterixdb/blob/f3aa19fb/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/MergePolicyUtils.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/MergePolicyUtils.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/MergePolicyUtils.java new file mode 100644 index 0000000..6bb5c36 --- /dev/null +++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/MergePolicyUtils.java @@ -0,0 +1,67 @@ +/* + * 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.asterix.lang.common.util; + +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; + +import org.apache.asterix.common.exceptions.CompilationException; +import org.apache.asterix.common.exceptions.ErrorCode; +import org.apache.asterix.object.base.AdmObjectNode; +import org.apache.asterix.object.base.AdmStringNode; +import org.apache.asterix.object.base.IAdmNode; + +public class MergePolicyUtils { + public static final String MERGE_POLICY_PARAMETER_NAME = "merge-policy"; + public static final String MERGE_POLICY_NAME_PARAMETER_NAME = "name"; + public static final String MERGE_POLICY_PARAMETERS_PARAMETER_NAME = "parameters"; + + private MergePolicyUtils() { + } + + /** + * Convert the parameters object to a Map<String,String> + * This method should go away once we store the with object as it is in storage + * + * @param parameters + * the parameters passed for the merge policy in the with clause + * @return the parameters as a map + */ + public static Map<String, String> toProperties(AdmObjectNode parameters) throws CompilationException { + Map<String, String> map = new HashMap<>(); + for (Entry<String, IAdmNode> field : parameters.getFields()) { + IAdmNode value = field.getValue(); + switch (value.getType()) { + case BOOLEAN: + case DOUBLE: + case BIGINT: + map.put(field.getKey(), value.toString()); + break; + case STRING: + map.put(field.getKey(), ((AdmStringNode) value).get()); + break; + default: + throw new CompilationException(ErrorCode.MERGE_POLICY_PARAMETER_INVALID_TYPE, value.getType()); + } + } + return map; + } + +} http://git-wip-us.apache.org/repos/asf/asterixdb/blob/f3aa19fb/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/FormatPrintVisitor.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/FormatPrintVisitor.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/FormatPrintVisitor.java index 21a4b76..ea81865 100644 --- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/FormatPrintVisitor.java +++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/FormatPrintVisitor.java @@ -109,8 +109,8 @@ public class FormatPrintVisitor implements ILangVisitor<Void, Integer> { private final static String FEED = " feed "; private final static String DEFAULT_DATAVERSE_FORMAT = "org.apache.asterix.runtime.formats.NonTaggedDataFormat"; protected final PrintWriter out; - protected Set<Character> validIdentifierChars = new HashSet<Character>(); - protected Set<Character> validIdentifierStartChars = new HashSet<Character>(); + protected Set<Character> validIdentifierChars = new HashSet<>(); + protected Set<Character> validIdentifierStartChars = new HashSet<>(); protected String dataverseSymbol = " dataverse "; protected String datasetSymbol = " dataset "; protected String assignSymbol = ":="; @@ -361,7 +361,7 @@ public class FormatPrintVisitor implements ILangVisitor<Void, Integer> { @Override public Void visit(FunctionDecl fd, Integer step) throws CompilationException { out.print(skip(step) + "declare function " + generateFullName(null, fd.getSignature().getName()) + "("); - List<Identifier> parameters = new ArrayList<Identifier>(); + List<Identifier> parameters = new ArrayList<>(); parameters.addAll(fd.getParamList()); printDelimitedIdentifiers(parameters, COMMA); out.println(") {"); @@ -492,13 +492,6 @@ public class FormatPrintVisitor implements ILangVisitor<Void, Integer> { out.print(" hints "); printProperties(hints); } - if (dd.getCompactionPolicy() != null) { - out.print(" using compaction policy " + revertStringToQuoted(dd.getCompactionPolicy())); - Map<String, String> compactionPolicyProperties = dd.getCompactionPolicyProperties(); - if (compactionPolicyProperties != null && compactionPolicyProperties.size() > 0) { - printConfiguration(compactionPolicyProperties); - } - } if (dd.getDatasetType() == DatasetType.INTERNAL) { List<String> filterField = ((InternalDetailsDecl) dd.getDatasetDetailsDecl()).getFilterField(); if (filterField != null && filterField.size() > 0) { @@ -506,6 +499,10 @@ public class FormatPrintVisitor implements ILangVisitor<Void, Integer> { printNestField(filterField); } } + if (dd.getWithObjectNode() != null) { + out.print(" with "); + out.print(dd.getWithObjectNode().toString()); + } out.println(SEMICOLON); out.println(); return null; http://git-wip-us.apache.org/repos/asf/asterixdb/blob/f3aa19fb/asterixdb/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj b/asterixdb/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj index 7ac8c57..c5d6d26 100644 --- a/asterixdb/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj +++ b/asterixdb/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj @@ -493,16 +493,15 @@ DatasetDecl DatasetSpecification() throws ParseException: Pair<Identifier,Identifier> typeComponents = null; String adapterName = null; Map<String,String> properties = null; - Map<String,String> compactionPolicyProperties = null; FunctionSignature appliedFunction = null; Pair<List<Integer>, List<List<String>>> primaryKeyFields = null; String nodeGroupName = null; Map<String,String> hints = new HashMap<String,String>(); DatasetDecl dsetDecl = null; boolean autogenerated = false; - String compactionPolicy = null; Pair<Integer, List<String>> filterField = null; Pair<Identifier,Identifier> metaTypeComponents = new Pair<Identifier, Identifier>(null, null); + RecordConstructor withRecord = null; } { ( @@ -510,13 +509,14 @@ DatasetDecl DatasetSpecification() throws ParseException: <LEFTPAREN> typeComponents = TypeName() <RIGHTPAREN> ifNotExists = IfNotExists() <USING> adapterName = AdapterName() properties = Configuration() - (<ON> nodeGroupName = Identifier() )? + ( <ON> nodeGroupName = Identifier() )? ( <HINTS> hints = Properties() )? - ( <USING> <COMPACTION> <POLICY> compactionPolicy = CompactionPolicy() (LOOKAHEAD(1) compactionPolicyProperties = Configuration())? )? + ( <WITH> withRecord = RecordConstructor() )? { ExternalDetailsDecl edd = new ExternalDetailsDecl(); edd.setAdapter(adapterName); edd.setProperties(properties); + try{ dsetDecl = new DatasetDecl(nameComponents.first, nameComponents.second, typeComponents.first, @@ -524,12 +524,14 @@ DatasetDecl DatasetSpecification() throws ParseException: metaTypeComponents.first, metaTypeComponents.second, nodeGroupName != null? new Identifier(nodeGroupName): null, - compactionPolicy, - compactionPolicyProperties, hints, DatasetType.EXTERNAL, edd, + withRecord, ifNotExists); + } catch (CompilationException e){ + throw new ParseException(e.getMessage()); + } } | ( <INTERNAL> )? @@ -551,8 +553,8 @@ DatasetDecl DatasetSpecification() throws ParseException: (<AUTOGENERATED> { autogenerated = true; } )? (<ON> nodeGroupName = Identifier() )? ( <HINTS> hints = Properties() )? - ( <USING> <COMPACTION> <POLICY> compactionPolicy = CompactionPolicy() (LOOKAHEAD(1) compactionPolicyProperties = Configuration())? )? ( LOOKAHEAD(2) <WITH> <FILTER> <ON> filterField = NestedField() )? + ( <WITH> withRecord = RecordConstructor() )? { if(filterField!=null && filterField.first!=0){ throw new ParseException("A filter field can only be a field in the main record of the dataset."); @@ -561,6 +563,7 @@ DatasetDecl DatasetSpecification() throws ParseException: primaryKeyFields.first, autogenerated, filterField == null? null : filterField.second); + try{ dsetDecl = new DatasetDecl(nameComponents.first, nameComponents.second, typeComponents.first, @@ -568,12 +571,14 @@ DatasetDecl DatasetSpecification() throws ParseException: metaTypeComponents.first, metaTypeComponents.second, nodeGroupName != null ? new Identifier(nodeGroupName) : null, - compactionPolicy, - compactionPolicyProperties, hints, DatasetType.INTERNAL, idd, + withRecord, ifNotExists); + } catch (CompilationException e){ + throw new ParseException(e.getMessage()); + } } ) { http://git-wip-us.apache.org/repos/asf/asterixdb/blob/f3aa19fb/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmArrayNode.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmArrayNode.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmArrayNode.java new file mode 100644 index 0000000..e489cd5 --- /dev/null +++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmArrayNode.java @@ -0,0 +1,77 @@ +/* + * 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.asterix.object.base; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.asterix.om.types.ATypeTag; + +public class AdmArrayNode implements IAdmNode { + private final List<IAdmNode> children; + + public AdmArrayNode() { + children = new ArrayList<>(); + } + + public AdmArrayNode(int initialCapacity) { + children = new ArrayList<>(initialCapacity); + } + + public IAdmNode set(int index, boolean value) { + return set(index, AdmBooleanNode.get(value)); + } + + public void add(boolean value) { + add(AdmBooleanNode.get(value)); + } + + public void add(IAdmNode value) { + if (value == null) { + value = AdmNullNode.INSTANCE; // NOSONAR + } + children.add(value); + } + + public IAdmNode set(int index, IAdmNode value) { + if (value == null) { + value = AdmNullNode.INSTANCE; // NOSONAR + } + return children.set(index, value); + } + + public IAdmNode get(int index) { + return children.get(index); + } + + @Override + public ATypeTag getType() { + return ATypeTag.ARRAY; + } + + @Override + public void reset() { + children.clear(); + } + + @Override + public String toString() { + return children.toString(); + } +} http://git-wip-us.apache.org/repos/asf/asterixdb/blob/f3aa19fb/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmBigIntNode.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmBigIntNode.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmBigIntNode.java new file mode 100644 index 0000000..0006668 --- /dev/null +++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmBigIntNode.java @@ -0,0 +1,55 @@ +/* + * 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.asterix.object.base; + +import org.apache.asterix.om.types.ATypeTag; + +public class AdmBigIntNode implements IAdmNode { + private long value; + + public AdmBigIntNode() { + } + + public AdmBigIntNode(long value) { + this.value = value; + } + + @Override + public ATypeTag getType() { + return ATypeTag.BIGINT; + } + + public void set(long value) { + this.value = value; + } + + public long get() { + return value; + } + + @Override + public void reset() { + value = 0; + } + + @Override + public String toString() { + return Long.toString(value); + } +} http://git-wip-us.apache.org/repos/asf/asterixdb/blob/f3aa19fb/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmBooleanNode.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmBooleanNode.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmBooleanNode.java new file mode 100644 index 0000000..aeebd86 --- /dev/null +++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmBooleanNode.java @@ -0,0 +1,59 @@ +/* + * 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.asterix.object.base; + +import org.apache.asterix.om.types.ATypeTag; + +public class AdmBooleanNode implements IAdmNode { + + public static final AdmBooleanNode TRUE = new AdmBooleanNode(true); + public static final AdmBooleanNode FALSE = new AdmBooleanNode(false); + private final boolean value; + + private AdmBooleanNode(boolean value) { + this.value = value; + } + + @Override + public ATypeTag getType() { + return ATypeTag.BOOLEAN; + } + + public boolean get() { + return value; + } + + @Override + public void reset() { + // Nothing to do + } + + public static AdmBooleanNode get(boolean value) { + return value ? TRUE : FALSE; + } + + public static AdmBooleanNode get(Boolean value) { + return value.booleanValue() ? TRUE : FALSE; + } + + @Override + public String toString() { + return Boolean.toString(value); + } +} http://git-wip-us.apache.org/repos/asf/asterixdb/blob/f3aa19fb/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmDoubleNode.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmDoubleNode.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmDoubleNode.java new file mode 100644 index 0000000..0150b4e --- /dev/null +++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmDoubleNode.java @@ -0,0 +1,56 @@ +/* + * 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.asterix.object.base; + +import org.apache.asterix.om.types.ATypeTag; + +public class AdmDoubleNode implements IAdmNode { + private double value; + + public AdmDoubleNode() { + + } + + public AdmDoubleNode(double value) { + this.value = value; + } + + @Override + public ATypeTag getType() { + return ATypeTag.DOUBLE; + } + + public void set(double value) { + this.value = value; + } + + public double get() { + return value; + } + + @Override + public void reset() { + value = 0; + } + + @Override + public String toString() { + return Double.toString(value); + } +} http://git-wip-us.apache.org/repos/asf/asterixdb/blob/f3aa19fb/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmNullNode.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmNullNode.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmNullNode.java new file mode 100644 index 0000000..2804ca3 --- /dev/null +++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmNullNode.java @@ -0,0 +1,44 @@ +/* + * 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.asterix.object.base; + +import org.apache.asterix.om.types.ATypeTag; + +public class AdmNullNode implements IAdmNode { + + public static final AdmNullNode INSTANCE = new AdmNullNode(); + + private AdmNullNode() { + } + + @Override + public ATypeTag getType() { + return ATypeTag.NULL; + } + + @Override + public void reset() { + // Nothing to reset + } + + @Override + public String toString() { + return "null"; + } +} http://git-wip-us.apache.org/repos/asf/asterixdb/blob/f3aa19fb/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmObjectNode.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmObjectNode.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmObjectNode.java new file mode 100644 index 0000000..e35b28f --- /dev/null +++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmObjectNode.java @@ -0,0 +1,95 @@ +/* + * 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.asterix.object.base; + +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +import org.apache.asterix.om.types.ATypeTag; + +/** + * An adm object instance + */ +public class AdmObjectNode implements IAdmNode { + private final Map<String, IAdmNode> children; + + public AdmObjectNode() { + children = new HashMap<>(); + } + + @Override + public ATypeTag getType() { + return ATypeTag.OBJECT; + } + + public int size() { + return children.size(); + } + + public IAdmNode get(String fieldName) { + return children.get(fieldName); + } + + public Set<String> getFieldNames() { + return children.keySet(); + } + + public Set<Entry<String, IAdmNode>> getFields() { + return children.entrySet(); + } + + public AdmObjectNode set(String fieldName, IAdmNode value) { + if (value == null) { + value = AdmNullNode.INSTANCE; // NOSONAR + } + children.put(fieldName, value); + return this; + } + + public IAdmNode remove(String fieldName) { + return children.remove(fieldName); + } + + @Override + public void reset() { + children.clear(); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("{"); + int count = 0; + for (Map.Entry<String, IAdmNode> en : children.entrySet()) { + if (count > 0) { + sb.append(","); + } + ++count; + sb.append('"'); + sb.append(en.getKey()); + sb.append('"'); + sb.append(':'); + sb.append(en.getValue().toString()); + } + sb.append("}"); + return sb.toString(); + } +} http://git-wip-us.apache.org/repos/asf/asterixdb/blob/f3aa19fb/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmStringNode.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmStringNode.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmStringNode.java new file mode 100644 index 0000000..4c92f09 --- /dev/null +++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmStringNode.java @@ -0,0 +1,52 @@ +/* + * 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.asterix.object.base; + +import org.apache.asterix.om.types.ATypeTag; + +public class AdmStringNode implements IAdmNode { + private String value; + + public AdmStringNode() { + } + + public AdmStringNode(String value) { + this.value = value; + } + + @Override + public ATypeTag getType() { + return ATypeTag.STRING; + } + + public String get() { + return value; + } + + @Override + public void reset() { + value = null; + } + + @Override + public String toString() { + return "\"" + value + "\""; + } + +} http://git-wip-us.apache.org/repos/asf/asterixdb/blob/f3aa19fb/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/IAdmNode.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/IAdmNode.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/IAdmNode.java new file mode 100644 index 0000000..c382fd2 --- /dev/null +++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/IAdmNode.java @@ -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. + */ +package org.apache.asterix.object.base; + +import org.apache.asterix.om.types.ATypeTag; + +/** + * An interface representing an adm node + */ +public interface IAdmNode { + + /** + * @return true if the object is a value, false if the object is a container + */ + default boolean isValueNode() { + switch (getType()) { + case ARRAY: + case OBJECT: + case MULTISET: + return false; + default: + return true; + } + } + + /** + * @return true if the object is an array, false otherwise + */ + default boolean isArray() { + return getType() == ATypeTag.ARRAY; + } + + /** + * @return true if the object is an adm object, false otherwise + */ + default boolean isObject() { + return getType() == ATypeTag.OBJECT; + } + + /** + * @return the type tag of the object + */ + ATypeTag getType(); + + /** + * reset the node + */ + void reset(); +}