Implement libjn:values
authorriyafa <riyafa.12@cse.mrt.ac.lk>
Sun, 31 Jul 2016 14:40:10 +0000 (20:10 +0530)
committerPreston Carman <prestonc@apache.org>
Mon, 8 Aug 2016 03:54:16 +0000 (20:54 -0700)
vxquery-core/src/main/java/org/apache/vxquery/functions/builtin-functions.xml
vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/json/LibjnValuesScalarEvaluator.java [new file with mode: 0644]
vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/json/LibjnValuesScalarEvaluatorFactory.java [new file with mode: 0644]
vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/jsonitem/SimpleObjectUnionScalarEvaluator.java
vxquery-xtest/src/test/resources/ExpectedTestResults/Json/Libraries/values.txt [new file with mode: 0644]
vxquery-xtest/src/test/resources/Queries/XQuery/Json/Libraries/values.xq [new file with mode: 0644]
vxquery-xtest/src/test/resources/cat/LibrariesInJSONiq.xml

index 5e58596..e1b6a7a 100644 (file)
         <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>
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 (file)
index 0000000..70ffcd8
--- /dev/null
@@ -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);
+        }
+    }
+
+}
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 (file)
index 0000000..18bff0a
--- /dev/null
@@ -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);
+    }
+
+}
index 4eaf8f7..7583918 100644 (file)
@@ -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) {
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 (file)
index 0000000..74efe4c
--- /dev/null
@@ -0,0 +1,5 @@
+Kirk
+Spock
+Scott
+Archer
+Trip
\ No newline at end of file
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 (file)
index 0000000..57dc2de
--- /dev/null
@@ -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()
+    )
+)
index fcae9a9..4de12e4 100644 (file)
@@ -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>