Add an integer ordered list to dataset "Dataset" and "Index" optinally.
For the case the primary or secondary index key contains fields from the meta
record associated with a dataset record, we need an integer ordered
list to indicate which record a key field comes from.
Change-Id: I979c642ebd60e53213369f1e2070146b4c26e805
Reviewed-on: https://asterix-gerrit.ics.uci.edu/683
Tested-by: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Reviewed-by: abdullah alamoudi <bamousaa@gmail.com>
Reviewed-by: Michael Blow <michael.blow@couchbase.com>
Reviewed-by: Till Westmann <tillw@apache.org>
diff --git a/asterix-lang-sqlpp/src/main/javacc/SQLPP.html b/asterix-lang-sqlpp/src/main/javacc/SQLPP.html
index 42aaa06..ebe7926 100644
--- a/asterix-lang-sqlpp/src/main/javacc/SQLPP.html
+++ b/asterix-lang-sqlpp/src/main/javacc/SQLPP.html
@@ -403,7 +403,7 @@
<TR>
<TD ALIGN=RIGHT VALIGN=BASELINE><A NAME="prod21">DatasetSpecification</A></TD>
<TD ALIGN=CENTER VALIGN=BASELINE>::=</TD>
-<TD ALIGN=LEFT VALIGN=BASELINE>( <EXTERNAL> <DATASET> <A HREF="#prod30">QualifiedName</A> <LEFTPAREN> <A HREF="#prod27">TypeName</A> <RIGHTPAREN> <A HREF="#prod28">IfNotExists</A> <USING> <A HREF="#prod31">AdapterName</A> <A HREF="#prod32">Configuration</A> ( <ON> <A HREF="#prod18">Identifier</A> )? ( <HINTS> <A HREF="#prod33">Properties</A> )? ( <USING> <COMPACTION> <POLICY> <A HREF="#prod34">CompactionPolicy</A> ( <A HREF="#prod32">Configuration</A> )? )? | ( <INTERNAL> | <TEMPORARY> )? <DATASET> <A HREF="#prod30">QualifiedName</A> <LEFTPAREN> <A HREF="#prod27">TypeName</A> ( <COMMA> <A HREF="#prod27">TypeName</A> )? <RIGHTPAREN> <A HREF="#prod28">IfNotExists</A> <A HREF="#prod35">PrimaryKey</A> ( <AUTOGENERATED> )? ( <ON> <A HREF="#prod18">Identifier</A> )? ( <HINTS> <A HREF="#prod33">Properties</A> )? ( <USING> <COMPACTION> <POLICY> <A HREF="#prod34">CompactionPolicy</A> ( <A HREF="#prod32">Configuration</A> )? )? ( <WITH> <FILTER> <ON> <A HREF="#prod36">NestedField</A> )? )</TD>
+<TD ALIGN=LEFT VALIGN=BASELINE>( <EXTERNAL> <DATASET> <A HREF="#prod30">QualifiedName</A> <LEFTPAREN> <A HREF="#prod27">TypeName</A> <RIGHTPAREN> <A HREF="#prod28">IfNotExists</A> <USING> <A HREF="#prod31">AdapterName</A> <A HREF="#prod32">Configuration</A> ( <ON> <A HREF="#prod18">Identifier</A> )? ( <HINTS> <A HREF="#prod33">Properties</A> )? ( <USING> <COMPACTION> <POLICY> <A HREF="#prod34">CompactionPolicy</A> ( <A HREF="#prod32">Configuration</A> )? )? | ( <INTERNAL> | <TEMPORARY> )? <DATASET> <A HREF="#prod30">QualifiedName</A> <LEFTPAREN> <A HREF="#prod27">TypeName</A> <RIGHTPAREN> ( <WITH> <A HREF="#prod18">Identifier</A> <LEFTPAREN> <A HREF="#prod27">TypeName</A> <RIGHTPAREN> )? <A HREF="#prod28">IfNotExists</A> <A HREF="#prod35">PrimaryKey</A> ( <AUTOGENERATED> )? ( <ON> <A HREF="#prod18">Identifier</A> )? ( <HINTS> <A HREF="#prod33">Properties</A> )? ( <USING> <COMPACTION> <POLICY> <A HREF="#prod34">CompactionPolicy</A> ( <A HREF="#prod32">Configuration</A> )? )? ( <WITH> <FILTER> <ON> <A HREF="#prod36">NestedField</A> )? )</TD>
</TR>
<TR>
<TD ALIGN=RIGHT VALIGN=BASELINE><A NAME="prod16">RefreshExternalDatasetStatement</A></TD>
@@ -623,7 +623,7 @@
<TR>
<TD ALIGN=RIGHT VALIGN=BASELINE><A NAME="prod36">NestedField</A></TD>
<TD ALIGN=CENTER VALIGN=BASELINE>::=</TD>
-<TD ALIGN=LEFT VALIGN=BASELINE>( <ATT> )? <A HREF="#prod18">Identifier</A> ( <DOT> <A HREF="#prod18">Identifier</A> )*</TD>
+<TD ALIGN=LEFT VALIGN=BASELINE><A HREF="#prod18">Identifier</A> ( <LEFTPAREN> <RIGHTPAREN> )? ( <DOT> <A HREF="#prod18">Identifier</A> )*</TD>
</TR>
<TR>
<TD ALIGN=RIGHT VALIGN=BASELINE><A NAME="prod40">QuotedString</A></TD>
diff --git a/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj b/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj
index 6259faa..ec915e9 100644
--- a/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj
+++ b/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj
@@ -421,14 +421,14 @@
Map<String,String> properties = null;
Map<String,String> compactionPolicyProperties = null;
FunctionSignature appliedFunction = null;
- List<List<String>> primaryKeyFields = 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;
boolean temp = false;
- List<String> filterField = null;
+ Pair<Integer, List<String>> filterField = null;
Pair<Identifier,Identifier> metaTypeComponents = new Pair<Identifier, Identifier>(null, null);
}
{
@@ -481,9 +481,13 @@
( <USING> <COMPACTION> <POLICY> compactionPolicy = CompactionPolicy() (LOOKAHEAD(1) compactionPolicyProperties = Configuration())? )?
( LOOKAHEAD(2) <WITH> <FILTER> <ON> filterField = NestedField() )?
{
- InternalDetailsDecl idd = new InternalDetailsDecl(primaryKeyFields,
+ if(filterField!=null && filterField.first!=0){
+ throw new ParseException("A filter field can only be a field in the main record of the dataset.");
+ }
+ InternalDetailsDecl idd = new InternalDetailsDecl(primaryKeyFields.second,
+ primaryKeyFields.first,
autogenerated,
- filterField,
+ filterField == null? null : filterField.second,
temp);
dsetDecl = new DatasetDecl(nameComponents.first,
nameComponents.second,
@@ -547,7 +551,7 @@
String indexName = null;
boolean ifNotExists = false;
Pair<Identifier,Identifier> nameComponents = null;
- Pair<List<String>, TypeExpression> fieldPair = null;
+ Pair<Integer, Pair<List<String>, TypeExpression>> fieldPair = null;
IndexParams indexType = null;
boolean enforced = false;
}
@@ -557,11 +561,13 @@
<ON> nameComponents = QualifiedName()
<LEFTPAREN> ( fieldPair = OpenField()
{
- cis.addFieldExprPair(fieldPair);
+ cis.addFieldExprPair(fieldPair.second);
+ cis.addFieldIndexIndicator(fieldPair.first);
}
) (<COMMA> fieldPair = OpenField()
{
- cis.addFieldExprPair(fieldPair);
+ cis.addFieldExprPair(fieldPair.second);
+ cis.addFieldIndexIndicator(fieldPair.first);
}
)* <RIGHTPAREN> ( <TYPE> indexType = IndexType() )? ( <ENFORCED> { enforced = true; } )?
{
@@ -825,23 +831,26 @@
}
}
-List<List<String>> PrimaryKey() throws ParseException:
+Pair<List<Integer>, List<List<String>>> PrimaryKey() throws ParseException:
{
- List<String> tmp = null;
+ Pair<Integer, List<String>> tmp = null;
+ List<Integer> keyFieldSourceIndicators = new ArrayList<Integer>();
List<List<String>> primaryKeyFields = new ArrayList<List<String>>();
}
{
<PRIMARY> <KEY> tmp = NestedField()
{
- primaryKeyFields.add(tmp);
+ keyFieldSourceIndicators.add(tmp.first);
+ primaryKeyFields.add(tmp.second);
}
( <COMMA> tmp = NestedField()
{
- primaryKeyFields.add(tmp);
+ keyFieldSourceIndicators.add(tmp.first);
+ primaryKeyFields.add(tmp.second);
}
)*
{
- return primaryKeyFields;
+ return new Pair<List<Integer>, List<List<String>>> (keyFieldSourceIndicators, primaryKeyFields);
}
}
@@ -1380,23 +1389,25 @@
)
}
-Pair<List<String>, TypeExpression> OpenField() throws ParseException:
+Pair<Integer, Pair<List<String>, TypeExpression>> OpenField() throws ParseException:
{
TypeExpression fieldType = null;
- List<String> fieldList = null;
+ Pair<Integer, List<String>> fieldList = null;
}
{
fieldList = NestedField()
( <COLON> fieldType = IndexedTypeExpr() )?
{
- return new Pair<List<String>, TypeExpression>(fieldList, fieldType);
+ return new Pair<Integer, Pair<List<String>, TypeExpression>>
+ (fieldList.first, new Pair<List<String>, TypeExpression>(fieldList.second, fieldType));
}
}
-List<String> NestedField() throws ParseException:
+Pair<Integer, List<String>> NestedField() throws ParseException:
{
List<String> exprList = new ArrayList<String>();
String lit = null;
+ int source = 0;
}
{
lit = Identifier()
@@ -1404,14 +1415,14 @@
boolean meetParens = false;
}
(
+ LOOKAHEAD(1)
<LEFTPAREN><RIGHTPAREN>
{
- if(lit.toLowerCase().equals("meta")){
- exprList.add(lit.toLowerCase() + "()");
- }else{
+ if(!lit.toLowerCase().equals("meta")){
throw new ParseException("The string before () has to be \"meta\".");
}
meetParens = true;
+ source = 1;
}
)?
{
@@ -1426,7 +1437,7 @@
}
)*
{
- return exprList;
+ return new Pair<Integer, List<String>>(source, exprList);
}
}