Repository: vxquery Updated Branches: refs/heads/master 4a19104c8 -> 180d113f9
Implement libjn:values Project: http://git-wip-us.apache.org/repos/asf/vxquery/repo Commit: http://git-wip-us.apache.org/repos/asf/vxquery/commit/180d113f Tree: http://git-wip-us.apache.org/repos/asf/vxquery/tree/180d113f Diff: http://git-wip-us.apache.org/repos/asf/vxquery/diff/180d113f Branch: refs/heads/master Commit: 180d113f9b70fc906962525a77e9d2a364c1f4c1 Parents: 4a19104 Author: riyafa <[email protected]> Authored: Sun Jul 31 20:10:10 2016 +0530 Committer: Preston Carman <[email protected]> Committed: Sun Aug 7 20:54:16 2016 -0700 ---------------------------------------------------------------------- .../vxquery/functions/builtin-functions.xml | 6 ++ .../json/LibjnValuesScalarEvaluator.java | 107 +++++++++++++++++++ .../json/LibjnValuesScalarEvaluatorFactory.java | 39 +++++++ .../SimpleObjectUnionScalarEvaluator.java | 1 - .../Json/Libraries/values.txt | 5 + .../Queries/XQuery/Json/Libraries/values.xq | 35 ++++++ .../test/resources/cat/LibrariesInJSONiq.xml | 5 + 7 files changed, 197 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/vxquery/blob/180d113f/vxquery-core/src/main/java/org/apache/vxquery/functions/builtin-functions.xml ---------------------------------------------------------------------- diff --git a/vxquery-core/src/main/java/org/apache/vxquery/functions/builtin-functions.xml b/vxquery-core/src/main/java/org/apache/vxquery/functions/builtin-functions.xml index 5e58596..e1b6a7a 100644 --- a/vxquery-core/src/main/java/org/apache/vxquery/functions/builtin-functions.xml +++ b/vxquery-core/src/main/java/org/apache/vxquery/functions/builtin-functions.xml @@ -1212,4 +1212,10 @@ <return type="item()*"/> <runtime type="scalar" class="org.apache.vxquery.runtime.functions.json.LibjnFlattenScalarEvaluatorFactory"/> </function> + <!-- libjn:values($sequence as item()*) as item()* --> + <function name="libjn:values"> + <param name="sequence" type="item()*"/> + <return type="item()*"/> + <runtime type="scalar" class="org.apache.vxquery.runtime.functions.json.LibjnValuesScalarEvaluatorFactory"/> + </function> </functions> http://git-wip-us.apache.org/repos/asf/vxquery/blob/180d113f/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/json/LibjnValuesScalarEvaluator.java ---------------------------------------------------------------------- diff --git a/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/json/LibjnValuesScalarEvaluator.java b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/json/LibjnValuesScalarEvaluator.java new file mode 100644 index 0000000..70ffcd8 --- /dev/null +++ b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/json/LibjnValuesScalarEvaluator.java @@ -0,0 +1,107 @@ +/* +* 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.json; + +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.hyracks.data.std.util.ArrayBackedValueStorage; +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.builders.sequence.SequenceBuilder; +import org.apache.vxquery.datamodel.values.ValueTag; +import org.apache.vxquery.exceptions.ErrorCode; +import org.apache.vxquery.exceptions.SystemException; +import org.apache.vxquery.runtime.functions.base.AbstractTaggedValueArgumentScalarEvaluator; + +import java.io.IOException; + +public class LibjnValuesScalarEvaluator extends AbstractTaggedValueArgumentScalarEvaluator { + protected final IHyracksTaskContext ctx; + private final ObjectPointable op; + private final UTF8StringPointable stringKey; + private final ArrayBackedValueStorage abvs1; + private final SequenceBuilder sb; + + public LibjnValuesScalarEvaluator(IHyracksTaskContext ctx, IScalarEvaluator[] args) { + super(args); + this.ctx = ctx; + stringKey = (UTF8StringPointable) UTF8StringPointable.FACTORY.createPointable(); + abvs1 = new ArrayBackedValueStorage(); + sb = new SequenceBuilder(); + op = (ObjectPointable) ObjectPointable.FACTORY.createPointable(); + } + + @Override + protected void evaluate(TaggedValuePointable[] args, IPointable result) throws SystemException { + TaggedValuePointable sequence = args[0]; + + TaggedValuePointable tempTvp = ppool.takeOne(TaggedValuePointable.class); + SequencePointable sp = ppool.takeOne(SequencePointable.class); + try { + abvs1.reset(); + sb.reset(abvs1); + if (sequence.getTag() == ValueTag.SEQUENCE_TAG) { + sequence.getValue(sp); + for (int i = 0; i < sp.getEntryCount(); ++i) { + sp.getEntry(i, tempTvp); + if (tempTvp.getTag() == ValueTag.OBJECT_TAG) { + tempTvp.getValue(op); + addValues(tempTvp); + } + } + } else if (sequence.getTag() == ValueTag.OBJECT_TAG) { + sequence.getValue(op); + addValues(tempTvp); + } + sb.finish(); + result.set(abvs1); + } catch (IOException e) { + throw new SystemException(ErrorCode.SYSE0001, e); + } finally { + ppool.giveBack(tempTvp); + ppool.giveBack(sp); + } + } + + private void addValues(TaggedValuePointable tempTvp) throws IOException, SystemException { + TaggedValuePointable tempValue = ppool.takeOne(TaggedValuePointable.class); + SequencePointable sp1 = ppool.takeOne(SequencePointable.class); + try { + op.getKeys(tempTvp); + if (tempTvp.getTag() == ValueTag.XS_STRING_TAG) { + tempTvp.getValue(stringKey); + op.getValue(stringKey, tempValue); + sb.addItem(tempValue); + } else if (tempTvp.getTag() == ValueTag.SEQUENCE_TAG) { + tempTvp.getValue(sp1); + for (int j = 0; j < sp1.getEntryCount(); ++j) { + sp1.getEntry(j, tempTvp); + tempTvp.getValue(stringKey); + op.getValue(stringKey, tempValue); + sb.addItem(tempValue); + } + } + } finally { + ppool.giveBack(tempValue); + ppool.giveBack(sp1); + } + } + +} http://git-wip-us.apache.org/repos/asf/vxquery/blob/180d113f/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/json/LibjnValuesScalarEvaluatorFactory.java ---------------------------------------------------------------------- diff --git a/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/json/LibjnValuesScalarEvaluatorFactory.java b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/json/LibjnValuesScalarEvaluatorFactory.java new file mode 100644 index 0000000..18bff0a --- /dev/null +++ b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/json/LibjnValuesScalarEvaluatorFactory.java @@ -0,0 +1,39 @@ +/* +* 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.json; + +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 LibjnValuesScalarEvaluatorFactory extends AbstractTaggedValueArgumentScalarEvaluatorFactory { + + private static final long serialVersionUID = 1L; + + public LibjnValuesScalarEvaluatorFactory(IScalarEvaluatorFactory[] args) { + super(args); + } + + @Override + protected IScalarEvaluator createEvaluator(IHyracksTaskContext ctx, IScalarEvaluator[] args) + throws AlgebricksException { + return new LibjnValuesScalarEvaluator(ctx, args); + } + +} http://git-wip-us.apache.org/repos/asf/vxquery/blob/180d113f/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 index 4eaf8f7..7583918 100644 --- 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 @@ -61,7 +61,6 @@ public class SimpleObjectUnionScalarEvaluator extends AbstractObjectConstructorS op = (ObjectPointable) ObjectPointable.FACTORY.createPointable(); sp.getEntry(i, tempTvp); tempTvp.getValue(op); - op.getKeys(tempTvp); addPairs(tempTvp, tempValue); } } else if (arg.getTag() == ValueTag.OBJECT_TAG) { http://git-wip-us.apache.org/repos/asf/vxquery/blob/180d113f/vxquery-xtest/src/test/resources/ExpectedTestResults/Json/Libraries/values.txt ---------------------------------------------------------------------- diff --git a/vxquery-xtest/src/test/resources/ExpectedTestResults/Json/Libraries/values.txt b/vxquery-xtest/src/test/resources/ExpectedTestResults/Json/Libraries/values.txt new file mode 100644 index 0000000..74efe4c --- /dev/null +++ b/vxquery-xtest/src/test/resources/ExpectedTestResults/Json/Libraries/values.txt @@ -0,0 +1,5 @@ +Kirk +Spock +Scott +Archer +Trip \ No newline at end of file http://git-wip-us.apache.org/repos/asf/vxquery/blob/180d113f/vxquery-xtest/src/test/resources/Queries/XQuery/Json/Libraries/values.xq ---------------------------------------------------------------------- diff --git a/vxquery-xtest/src/test/resources/Queries/XQuery/Json/Libraries/values.xq b/vxquery-xtest/src/test/resources/Queries/XQuery/Json/Libraries/values.xq new file mode 100644 index 0000000..57dc2de --- /dev/null +++ b/vxquery-xtest/src/test/resources/Queries/XQuery/Json/Libraries/values.xq @@ -0,0 +1,35 @@ +(: 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. :) + +(: JSONiq libjn:values :) +libjn:values( + ( + { + "Captain" : "Kirk", + "First Officer" : "Spock", + "Engineer" : "Scott" + }, + [ 1, 2, 3, 4 ], + { + "Captain" : "Archer", + "Engineer" : "Trip" + }, + true(), + 1, + jn:null() + ) +) http://git-wip-us.apache.org/repos/asf/vxquery/blob/180d113f/vxquery-xtest/src/test/resources/cat/LibrariesInJSONiq.xml ---------------------------------------------------------------------- diff --git a/vxquery-xtest/src/test/resources/cat/LibrariesInJSONiq.xml b/vxquery-xtest/src/test/resources/cat/LibrariesInJSONiq.xml index fcae9a9..4de12e4 100644 --- a/vxquery-xtest/src/test/resources/cat/LibrariesInJSONiq.xml +++ b/vxquery-xtest/src/test/resources/cat/LibrariesInJSONiq.xml @@ -40,4 +40,9 @@ <query name="flatten" date="2016-07-20"/> <output-file compare="Text">flatten.txt</output-file> </test-case> + <test-case name="values" FilePath="Json/Libraries/" Creator="Riyafa Abdul Hameed"> + <description>Json Libraries.</description> + <query name="values" date="2016-07-31"/> + <output-file compare="Text">values.txt</output-file> + </test-case> </test-group>
