Repository: vxquery Updated Branches: refs/heads/master b96caaa0f -> d19fa2630
VXQUERY-212 Dynamic object construction syntax Project: http://git-wip-us.apache.org/repos/asf/vxquery/repo Commit: http://git-wip-us.apache.org/repos/asf/vxquery/commit/d19fa263 Tree: http://git-wip-us.apache.org/repos/asf/vxquery/tree/d19fa263 Diff: http://git-wip-us.apache.org/repos/asf/vxquery/diff/d19fa263 Branch: refs/heads/master Commit: d19fa26307e6d6fce3ed9f4bcb49fba9428dcc72 Parents: b96caaa Author: riyafa <[email protected]> Authored: Wed Jul 13 05:43:22 2016 +0530 Committer: riyafa <[email protected]> Committed: Wed Jul 13 05:43:22 2016 +0530 ---------------------------------------------------------------------- .../vxquery/functions/builtin-operators.xml | 7 ++ .../SimpleObjectUnionScalarEvaluator.java | 103 +++++++++++++++++++ ...SimpleObjectUnionScalarEvaluatorFactory.java | 36 +++++++ .../xmlquery/translator/XMLQueryTranslator.java | 22 ++-- vxquery-core/src/main/javacc/xquery-grammar.jj | 30 ++++-- .../Json/Object/q13_object.txt | 1 + .../Json/Object/q14_object.txt | 1 + .../Queries/XQuery/Json/Object/q13_object.xq | 22 ++++ .../Queries/XQuery/Json/Object/q14_object.xq | 29 ++++++ .../test/resources/cat/JsonObjectQueries.xml | 10 ++ 10 files changed, 244 insertions(+), 17 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/vxquery/blob/d19fa263/vxquery-core/src/main/java/org/apache/vxquery/functions/builtin-operators.xml ---------------------------------------------------------------------- diff --git a/vxquery-core/src/main/java/org/apache/vxquery/functions/builtin-operators.xml b/vxquery-core/src/main/java/org/apache/vxquery/functions/builtin-operators.xml index bb710a9..0b03c34 100644 --- a/vxquery-core/src/main/java/org/apache/vxquery/functions/builtin-operators.xml +++ b/vxquery-core/src/main/java/org/apache/vxquery/functions/builtin-operators.xml @@ -882,6 +882,13 @@ <runtime type="scalar" class="org.apache.vxquery.runtime.functions.jsonitem.ObjectConstructorScalarEvaluatorFactory"/> </operator> + <!-- opext:simple-object-union($expression as object()*) as object() --> + <operator name="opext:simple-object-union"> + <param name="expression" type="object()*"/> + <return type="object()"/> + <runtime type="scalar" class="org.apache.vxquery.runtime.functions.jsonitem.SimpleObjectUnionScalarEvaluatorFactory"/> + </operator> + <!-- opext:if-then-else($condition as xs:boolean, $then as item()*, $else as item()*) as item()* --> <operator name="opext:if-then-else"> <param name="condition" type="xs:boolean"/> http://git-wip-us.apache.org/repos/asf/vxquery/blob/d19fa263/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/jsonitem/SimpleObjectUnionScalarEvaluator.java ---------------------------------------------------------------------- diff --git a/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/jsonitem/SimpleObjectUnionScalarEvaluator.java b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/jsonitem/SimpleObjectUnionScalarEvaluator.java new file mode 100644 index 0000000..60347b1 --- /dev/null +++ b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/jsonitem/SimpleObjectUnionScalarEvaluator.java @@ -0,0 +1,103 @@ +/* + * 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.vxquery.runtime.functions.jsonitem; + +import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator; +import org.apache.hyracks.api.context.IHyracksTaskContext; +import org.apache.hyracks.data.std.api.IPointable; +import org.apache.hyracks.data.std.primitive.UTF8StringPointable; +import org.apache.vxquery.datamodel.accessors.SequencePointable; +import org.apache.vxquery.datamodel.accessors.TaggedValuePointable; +import org.apache.vxquery.datamodel.accessors.jsonitem.ObjectPointable; +import org.apache.vxquery.datamodel.values.ValueTag; +import org.apache.vxquery.datamodel.values.XDMConstants; +import org.apache.vxquery.exceptions.ErrorCode; +import org.apache.vxquery.exceptions.SystemException; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +public class SimpleObjectUnionScalarEvaluator extends ObjectConstructorScalarEvaluator { + + private final SequencePointable sp, sp1; + + public SimpleObjectUnionScalarEvaluator(IHyracksTaskContext ctx, IScalarEvaluator[] args) { + super(ctx, args); + sp = (SequencePointable) SequencePointable.FACTORY.createPointable(); + sp1 = (SequencePointable) SequencePointable.FACTORY.createPointable(); + } + + @Override + protected void evaluate(TaggedValuePointable[] args, IPointable result) throws SystemException { + List<TaggedValuePointable> tvps = new ArrayList<>(); + + ObjectPointable op; + TaggedValuePointable key, value; + TaggedValuePointable arg = args[0]; + if (arg.getTag() == ValueTag.SEQUENCE_TAG) { + arg.getValue(sp); + TaggedValuePointable tempTvp = ppool.takeOne(TaggedValuePointable.class); + TaggedValuePointable boolTvp = ppool.takeOne(TaggedValuePointable.class); + UTF8StringPointable tempKey = ppool.takeOne(UTF8StringPointable.class); + XDMConstants.setFalse(boolTvp); + try { + for (int i = 0; i < sp.getEntryCount(); ++i) { + op = (ObjectPointable) ObjectPointable.FACTORY.createPointable(); + sp.getEntry(i, tempTvp); + tempTvp.getValue(op); + op.getKeys(tempTvp); + if (tempTvp.getTag() == ValueTag.XS_STRING_TAG) { + key = ppool.takeOne(TaggedValuePointable.class); + value = ppool.takeOne(TaggedValuePointable.class); + tempTvp.getValue(tempKey); + op.getValue(tempKey, value); + key.set(tempTvp); + tvps.add(key); + tvps.add(value); + tvps.add(boolTvp); + + } else if (tempTvp.getTag() == ValueTag.SEQUENCE_TAG) { + tempTvp.getValue(sp1); + for (int j = 0; j < sp1.getEntryCount(); ++j) { + key = ppool.takeOne(TaggedValuePointable.class); + value = ppool.takeOne(TaggedValuePointable.class); + sp1.getEntry(j, tempTvp); + tempTvp.getValue(tempKey); + op.getValue(tempKey, value); + key.set(tempTvp); + tvps.add(key); + tvps.add(value); + tvps.add(boolTvp); + } + + } + } + super.evaluate(tvps.toArray(new TaggedValuePointable[tvps.size()]), result); + } catch (IOException e) { + throw new SystemException(ErrorCode.SYSE0001, e); + } finally { + ppool.giveBack(tempKey); + ppool.giveBack(tempTvp); + ppool.giveBack(boolTvp); + for (TaggedValuePointable pointable : tvps) { + ppool.giveBack(pointable); + } + } + } + } +} http://git-wip-us.apache.org/repos/asf/vxquery/blob/d19fa263/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/jsonitem/SimpleObjectUnionScalarEvaluatorFactory.java ---------------------------------------------------------------------- diff --git a/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/jsonitem/SimpleObjectUnionScalarEvaluatorFactory.java b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/jsonitem/SimpleObjectUnionScalarEvaluatorFactory.java new file mode 100644 index 0000000..9ba4798 --- /dev/null +++ b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/jsonitem/SimpleObjectUnionScalarEvaluatorFactory.java @@ -0,0 +1,36 @@ +/* + * 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.vxquery.runtime.functions.jsonitem; + +import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException; +import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator; +import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory; +import org.apache.hyracks.api.context.IHyracksTaskContext; +import org.apache.vxquery.runtime.functions.base.AbstractTaggedValueArgumentScalarEvaluatorFactory; + +public class SimpleObjectUnionScalarEvaluatorFactory extends AbstractTaggedValueArgumentScalarEvaluatorFactory { + + public SimpleObjectUnionScalarEvaluatorFactory(IScalarEvaluatorFactory[] args) { + super(args); + } + + @Override + protected IScalarEvaluator createEvaluator(IHyracksTaskContext ctx, IScalarEvaluator[] args) + throws AlgebricksException { + return new SimpleObjectUnionScalarEvaluator(ctx, args); + } +} http://git-wip-us.apache.org/repos/asf/vxquery/blob/d19fa263/vxquery-core/src/main/java/org/apache/vxquery/xmlquery/translator/XMLQueryTranslator.java ---------------------------------------------------------------------- diff --git a/vxquery-core/src/main/java/org/apache/vxquery/xmlquery/translator/XMLQueryTranslator.java b/vxquery-core/src/main/java/org/apache/vxquery/xmlquery/translator/XMLQueryTranslator.java index a635951..c8cfb2b 100644 --- a/vxquery-core/src/main/java/org/apache/vxquery/xmlquery/translator/XMLQueryTranslator.java +++ b/vxquery-core/src/main/java/org/apache/vxquery/xmlquery/translator/XMLQueryTranslator.java @@ -1206,14 +1206,22 @@ public class XMLQueryTranslator { private LogicalVariable translateObjectConstructor(TranslationContext tCtx, ObjectConstructor obj) throws SystemException { List<ILogicalExpression> content = new ArrayList<ILogicalExpression>(); + PairConstructor pc; for (ASTNode aVal : obj.getContent()) { - ILogicalExpression ke = string(data(vre(translateExpression(((PairConstructor) aVal).getKey(), tCtx)))); - content.add(ke); - ILogicalExpression ve = vre(translateExpression(((PairConstructor) aVal).getValue(), tCtx)); - content.add(ve); - ILogicalExpression qmce = ce(SequenceType.create(BuiltinTypeRegistry.XS_BOOLEAN, Quantifier.QUANT_ONE), - ((PairConstructor) aVal).isQuestionMarkColon()); - content.add(qmce); + if (aVal.getTag()==ASTTag.PAIR_CONSTRUCTOR) { + pc=(PairConstructor) aVal; + ILogicalExpression ke = string(data(vre(translateExpression(pc.getKey(), tCtx)))); + content.add(ke); + ILogicalExpression ve = vre(translateExpression(pc.getValue(), tCtx)); + content.add(ve); + ILogicalExpression qmce = ce(SequenceType.create(BuiltinTypeRegistry.XS_BOOLEAN, Quantifier.QUANT_ONE), + pc.isQuestionMarkColon()); + content.add(qmce); + } else { + ILogicalExpression aExpr = aVal == null ? sfce(BuiltinOperators.CONCATENATE) + : vre(translateExpression(aVal, tCtx)); + return createAssignment(sfce(BuiltinOperators.SIMPLE_OBJECT_UNION, aExpr), tCtx); + } } return createAssignment( http://git-wip-us.apache.org/repos/asf/vxquery/blob/d19fa263/vxquery-core/src/main/javacc/xquery-grammar.jj ---------------------------------------------------------------------- diff --git a/vxquery-core/src/main/javacc/xquery-grammar.jj b/vxquery-core/src/main/javacc/xquery-grammar.jj index f9d25b2..9ea3943 100644 --- a/vxquery-core/src/main/javacc/xquery-grammar.jj +++ b/vxquery-core/src/main/javacc/xquery-grammar.jj @@ -2013,17 +2013,27 @@ ASTNode ObjectConstructor() : ASTNode pc; } { - t = <LbraceExprEnclosure> ( - pc = PairConstructor() { - content.add(pc); - } ( - "," pc = PairConstructor() { - content.add(pc); - } - )* - )* - <Rbrace> + ( + t = <LbraceExprEnclosure> + ( + pc = PairConstructor() { + content.add(pc); + } ( + "," pc = PairConstructor() { + content.add(pc); + } + )* + )* + <Rbrace> + ) + | ( + t = "{|" pc = Expr() "|}" + { + content.add(pc); + } + ) + ) { ObjectConstructor obj = new ObjectConstructor(createSourceLocation(t)); obj.setContent(content); http://git-wip-us.apache.org/repos/asf/vxquery/blob/d19fa263/vxquery-xtest/src/test/resources/ExpectedTestResults/Json/Object/q13_object.txt ---------------------------------------------------------------------- diff --git a/vxquery-xtest/src/test/resources/ExpectedTestResults/Json/Object/q13_object.txt b/vxquery-xtest/src/test/resources/ExpectedTestResults/Json/Object/q13_object.txt new file mode 100644 index 0000000..d80c27c --- /dev/null +++ b/vxquery-xtest/src/test/resources/ExpectedTestResults/Json/Object/q13_object.txt @@ -0,0 +1 @@ +{"Captain":"Kirk","First officer":"Spock"} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/vxquery/blob/d19fa263/vxquery-xtest/src/test/resources/ExpectedTestResults/Json/Object/q14_object.txt ---------------------------------------------------------------------- diff --git a/vxquery-xtest/src/test/resources/ExpectedTestResults/Json/Object/q14_object.txt b/vxquery-xtest/src/test/resources/ExpectedTestResults/Json/Object/q14_object.txt new file mode 100644 index 0000000..84dd8df --- /dev/null +++ b/vxquery-xtest/src/test/resources/ExpectedTestResults/Json/Object/q14_object.txt @@ -0,0 +1 @@ +{"Sunday":1,"Monday":2,"Tuesday":3,"Wednesday":4,"Thursday":5,"Friday":6,"Saturday":7} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/vxquery/blob/d19fa263/vxquery-xtest/src/test/resources/Queries/XQuery/Json/Object/q13_object.xq ---------------------------------------------------------------------- diff --git a/vxquery-xtest/src/test/resources/Queries/XQuery/Json/Object/q13_object.xq b/vxquery-xtest/src/test/resources/Queries/XQuery/Json/Object/q13_object.xq new file mode 100644 index 0000000..d7920e1 --- /dev/null +++ b/vxquery-xtest/src/test/resources/Queries/XQuery/Json/Object/q13_object.xq @@ -0,0 +1,22 @@ +(: 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. :) + +(: Json Object Query :) +(: Issue VXQUERY-212 :) +let $object1 := { "Captain" : "Kirk" } +let $object2 := { "First officer" : "Spock" } +return {| $object1, $object2 |} http://git-wip-us.apache.org/repos/asf/vxquery/blob/d19fa263/vxquery-xtest/src/test/resources/Queries/XQuery/Json/Object/q14_object.xq ---------------------------------------------------------------------- diff --git a/vxquery-xtest/src/test/resources/Queries/XQuery/Json/Object/q14_object.xq b/vxquery-xtest/src/test/resources/Queries/XQuery/Json/Object/q14_object.xq new file mode 100644 index 0000000..ef31848 --- /dev/null +++ b/vxquery-xtest/src/test/resources/Queries/XQuery/Json/Object/q14_object.xq @@ -0,0 +1,29 @@ +(: 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. :) + +(: Json Object Query :) +(: Issue VXQUERY-212 :) +{| + for $d at $i in ("Sunday", + "Monday", + "Tuesday", + "Wednesday", + "Thursday", + "Friday", + "Saturday" ) + return { $d : $i } +|} http://git-wip-us.apache.org/repos/asf/vxquery/blob/d19fa263/vxquery-xtest/src/test/resources/cat/JsonObjectQueries.xml ---------------------------------------------------------------------- diff --git a/vxquery-xtest/src/test/resources/cat/JsonObjectQueries.xml b/vxquery-xtest/src/test/resources/cat/JsonObjectQueries.xml index e8fc532..2ee68c4 100644 --- a/vxquery-xtest/src/test/resources/cat/JsonObjectQueries.xml +++ b/vxquery-xtest/src/test/resources/cat/JsonObjectQueries.xml @@ -80,4 +80,14 @@ <query name="q12_object" date="2016-07-05"/> <output-file compare="Text">q12_object.txt</output-file> </test-case> + <test-case name="json-object-q13" FilePath="Json/Object/" Creator="Riyafa Abdul Hameed"> + <description>Object.</description> + <query name="q13_object" date="2016-07-09"/> + <output-file compare="Text">q13_object.txt</output-file> + </test-case> + <test-case name="json-object-q14" FilePath="Json/Object/" Creator="Riyafa Abdul Hameed"> + <description>Object.</description> + <query name="q14_object" date="2016-07-09"/> + <output-file compare="Text">q14_object.txt</output-file> + </test-case> </test-group> \ No newline at end of file
