Implement libjn:project and libjn:remove-keys 140/head
authorriyafa <riyafa.12@cse.mrt.ac.lk>
Mon, 8 Aug 2016 16:55:37 +0000 (22:25 +0530)
committerPreston Carman <prestonc@apache.org>
Fri, 12 Aug 2016 18:51:54 +0000 (11:51 -0700)
12 files changed:
vxquery-core/src/main/java/org/apache/vxquery/functions/builtin-functions.xml
vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/json/AbstractLibjnProjectScalarEvaluator.java [new file with mode: 0644]
vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/json/LibjnProjectScalarEvaluator.java [new file with mode: 0644]
vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/json/LibjnProjectScalarEvaluatorFactory.java [new file with mode: 0644]
vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/json/LibjnRemoveKeysScalarEvaluator.java [new file with mode: 0644]
vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/json/LibjnRemoveKeysScalarEvaluatorFactory.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/project.txt [new file with mode: 0644]
vxquery-xtest/src/test/resources/ExpectedTestResults/remove_keys.txt [new file with mode: 0644]
vxquery-xtest/src/test/resources/Queries/XQuery/Json/Libraries/project.xq [new file with mode: 0644]
vxquery-xtest/src/test/resources/Queries/XQuery/Json/Libraries/remove_keys.xq [new file with mode: 0644]
vxquery-xtest/src/test/resources/cat/LibrariesInJSONiq.xml

index 93f2cb3..43839f8 100644 (file)
         <return type="object()*"/>
         <runtime type="scalar" class="org.apache.vxquery.runtime.functions.json.LibjnDescendantPairsScalarEvaluatorFactory"/>
     </function>
+
+    <!-- libjn:project($sequence as item()*, $keys as xs:string*) as item()* -->
+    <function name="libjn:project">
+        <param name="sequence" type="item()*"/>
+        <param name="keys" type="xs:string*"/>
+        <return type="item()*"/>
+        <runtime type="scalar" class="org.apache.vxquery.runtime.functions.json.LibjnProjectScalarEvaluatorFactory"/>
+    </function>
+
+    <!-- libjn:remove-keys($sequence as item()*, $keys as xs:string*) as item()* -->
+    <function name="libjn:remove-keys">
+        <param name="sequence" type="item()*"/>
+        <param name="keys" type="xs:string*"/>
+        <return type="item()*"/>
+        <runtime type="scalar" class="org.apache.vxquery.runtime.functions.json.LibjnRemoveKeysScalarEvaluatorFactory"/>
+    </function>
 </functions>
diff --git a/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/json/AbstractLibjnProjectScalarEvaluator.java b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/json/AbstractLibjnProjectScalarEvaluator.java
new file mode 100644 (file)
index 0000000..d81cc7d
--- /dev/null
@@ -0,0 +1,160 @@
+/*
+* 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.jsonitem.ObjectBuilder;
+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 org.apache.vxquery.runtime.functions.util.FunctionHelper;
+
+import java.io.IOException;
+
+public abstract class AbstractLibjnProjectScalarEvaluator extends AbstractTaggedValueArgumentScalarEvaluator {
+    protected final IHyracksTaskContext ctx;
+    protected final ObjectPointable op;
+    protected final UTF8StringPointable stringKey;
+    protected final ObjectBuilder ob;
+    protected final ArrayBackedValueStorage abvs, abvs1;
+    protected final SequenceBuilder sb;
+    protected final SequencePointable sp1;
+    protected final TaggedValuePointable tvp1;
+
+    public AbstractLibjnProjectScalarEvaluator(IHyracksTaskContext ctx, IScalarEvaluator[] args) {
+        super(args);
+        this.ctx = ctx;
+        stringKey = (UTF8StringPointable) UTF8StringPointable.FACTORY.createPointable();
+        ob = new ObjectBuilder();
+        abvs = new ArrayBackedValueStorage();
+        abvs1 = new ArrayBackedValueStorage();
+        sb = new SequenceBuilder();
+        op = (ObjectPointable) ObjectPointable.FACTORY.createPointable();
+        sp1 = (SequencePointable) SequencePointable.FACTORY.createPointable();
+        tvp1 = (TaggedValuePointable) TaggedValuePointable.FACTORY.createPointable();
+    }
+
+    @Override
+    protected void evaluate(TaggedValuePointable[] args, IPointable result) throws SystemException {
+        TaggedValuePointable sequence = args[0];
+        TaggedValuePointable keys = args[1];
+        if (keys.getTag() != ValueTag.SEQUENCE_TAG && keys.getTag() != ValueTag.XS_STRING_TAG) {
+            throw new SystemException(ErrorCode.FORG0006);
+        }
+        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);
+                        op.getKeys(tempTvp);
+                        addPairs(tempTvp, keys);
+                    } else {
+                        sb.addItem(tempTvp);
+                    }
+                }
+            } else if (sequence.getTag() == ValueTag.OBJECT_TAG) {
+                sequence.getValue(op);
+                addPairs(tempTvp, keys);
+            } else {
+                sb.addItem(sequence);
+            }
+            sb.finish();
+            result.set(abvs1);
+        } catch (IOException e) {
+            throw new SystemException(ErrorCode.SYSE0001, e);
+        } finally {
+            ppool.giveBack(tempTvp);
+            ppool.giveBack(sp);
+        }
+    }
+
+    protected void addPair(TaggedValuePointable tempTvp, TaggedValuePointable tempValue)
+            throws IOException, SystemException {
+        tempTvp.getValue(stringKey);
+        op.getValue(stringKey, tempValue);
+        ob.addItem(stringKey, tempValue);
+    }
+
+    private void addPairs(TaggedValuePointable tvp2, TaggedValuePointable keys) throws IOException, SystemException {
+        op.getKeys(tvp2);
+        if (tvp2.getTag() == ValueTag.XS_STRING_TAG) {
+            if (keyCheck(tvp2, keys)) {
+                abvs.reset();
+                ob.reset(abvs);
+                addPair(tvp2, tvp1);
+                ob.finish();
+                sb.addItem(abvs);
+            }
+        } else if (tvp2.getTag() == ValueTag.SEQUENCE_TAG) {
+            tvp2.getValue(sp1);
+            boolean found = false;
+            for (int j = 0; j < sp1.getEntryCount(); ++j) {
+                sp1.getEntry(j, tvp2);
+                if (keyCheck(tvp2, keys)) {
+                    if (!found) {
+                        abvs.reset();
+                        ob.reset(abvs);
+                        found = true;
+                    }
+                    addPair(tvp2, tvp1);
+                }
+            }
+            if (found) {
+                ob.finish();
+                sb.addItem(abvs);
+            }
+        }
+
+    }
+
+    protected abstract boolean keyCheck(TaggedValuePointable objTvp, TaggedValuePointable keys) throws SystemException;
+
+    protected boolean isKeyFound(TaggedValuePointable tvp, TaggedValuePointable keys) throws SystemException {
+        if (keys.getTag() == ValueTag.SEQUENCE_TAG) {
+            keys.getValue(sp1);
+            for (int i = 0; i < sp1.getEntryCount(); i++) {
+                sp1.getEntry(i, tvp1);
+                if (tvp1.getTag() != ValueTag.XS_STRING_TAG) {
+                    throw new SystemException(ErrorCode.FORG0006);
+                }
+                if (FunctionHelper.arraysEqual(tvp1, tvp)) {
+                    return true;
+                }
+            }
+        } else if (keys.getTag() == ValueTag.XS_STRING_TAG) {
+            if (FunctionHelper.arraysEqual(tvp, keys)) {
+                return true;
+            }
+        }
+        return false;
+    }
+}
diff --git a/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/json/LibjnProjectScalarEvaluator.java b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/json/LibjnProjectScalarEvaluator.java
new file mode 100644 (file)
index 0000000..171179d
--- /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.
+*/
+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.vxquery.datamodel.accessors.TaggedValuePointable;
+import org.apache.vxquery.exceptions.SystemException;
+
+public class LibjnProjectScalarEvaluator extends AbstractLibjnProjectScalarEvaluator {
+
+    public LibjnProjectScalarEvaluator(IHyracksTaskContext ctx, IScalarEvaluator[] args) {
+        super(ctx, args);
+    }
+
+    @Override
+    protected boolean keyCheck(TaggedValuePointable objTvp, TaggedValuePointable keys) throws SystemException {
+        return isKeyFound(objTvp, keys);
+    }
+
+}
diff --git a/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/json/LibjnProjectScalarEvaluatorFactory.java b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/json/LibjnProjectScalarEvaluatorFactory.java
new file mode 100644 (file)
index 0000000..54f5fd0
--- /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 LibjnProjectScalarEvaluatorFactory extends AbstractTaggedValueArgumentScalarEvaluatorFactory {
+
+    private static final long serialVersionUID = 1L;
+
+    public LibjnProjectScalarEvaluatorFactory(IScalarEvaluatorFactory[] args) {
+        super(args);
+    }
+
+    @Override
+    protected IScalarEvaluator createEvaluator(IHyracksTaskContext ctx, IScalarEvaluator[] args)
+            throws AlgebricksException {
+        return new LibjnProjectScalarEvaluator(ctx, args);
+    }
+
+}
diff --git a/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/json/LibjnRemoveKeysScalarEvaluator.java b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/json/LibjnRemoveKeysScalarEvaluator.java
new file mode 100644 (file)
index 0000000..370e535
--- /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.
+*/
+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.vxquery.datamodel.accessors.TaggedValuePointable;
+import org.apache.vxquery.exceptions.SystemException;
+
+public class LibjnRemoveKeysScalarEvaluator extends AbstractLibjnProjectScalarEvaluator {
+
+    public LibjnRemoveKeysScalarEvaluator(IHyracksTaskContext ctx, IScalarEvaluator[] args) {
+        super(ctx, args);
+    }
+
+    @Override
+    protected boolean keyCheck(TaggedValuePointable objTvp, TaggedValuePointable keys) throws SystemException {
+        return !isKeyFound(objTvp, keys);
+    }
+
+}
diff --git a/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/json/LibjnRemoveKeysScalarEvaluatorFactory.java b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/json/LibjnRemoveKeysScalarEvaluatorFactory.java
new file mode 100644 (file)
index 0000000..4563014
--- /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 LibjnRemoveKeysScalarEvaluatorFactory extends AbstractTaggedValueArgumentScalarEvaluatorFactory {
+
+    private static final long serialVersionUID = 1L;
+
+    public LibjnRemoveKeysScalarEvaluatorFactory(IScalarEvaluatorFactory[] args) {
+        super(args);
+    }
+
+    @Override
+    protected IScalarEvaluator createEvaluator(IHyracksTaskContext ctx, IScalarEvaluator[] args)
+            throws AlgebricksException {
+        return new LibjnRemoveKeysScalarEvaluator(ctx, args);
+    }
+
+}
index 7583918..2b13a9f 100644 (file)
@@ -102,7 +102,6 @@ public class SimpleObjectUnionScalarEvaluator extends AbstractObjectConstructorS
         } else if (tempTvp.getTag() == ValueTag.SEQUENCE_TAG) {
             tempTvp.getValue(sp1);
             for (int j = 0; j < sp1.getEntryCount(); ++j) {
-                key = ppool.takeOne(TaggedValuePointable.class);
                 sp1.getEntry(j, tempTvp);
                 addPair(tempTvp, tempValue);
             }
diff --git a/vxquery-xtest/src/test/resources/ExpectedTestResults/project.txt b/vxquery-xtest/src/test/resources/ExpectedTestResults/project.txt
new file mode 100644 (file)
index 0000000..aefe4f5
--- /dev/null
@@ -0,0 +1,13 @@
+{"Captain":"Kirk","First Officer":"Spock"}
+[1,2,3,4]
+{"Captain":"Archer"}
+true
+1
+null
+{"Captain":"Archer"}
+true
+1
+null
+true
+1
+null
\ No newline at end of file
diff --git a/vxquery-xtest/src/test/resources/ExpectedTestResults/remove_keys.txt b/vxquery-xtest/src/test/resources/ExpectedTestResults/remove_keys.txt
new file mode 100644 (file)
index 0000000..3fa2a35
--- /dev/null
@@ -0,0 +1,14 @@
+{"Engineer":"Scott"}
+[1,2,3,4]
+{"Engineer":"Trip"}
+true
+1
+null
+{"Engineer":"Trip"}
+true
+1
+null
+{"Captain":"Archer","Engineer":"Trip"}
+true
+1
+null
\ No newline at end of file
diff --git a/vxquery-xtest/src/test/resources/Queries/XQuery/Json/Libraries/project.xq b/vxquery-xtest/src/test/resources/Queries/XQuery/Json/Libraries/project.xq
new file mode 100644 (file)
index 0000000..2e78867
--- /dev/null
@@ -0,0 +1,61 @@
+(: 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:project :)
+libjn:project(
+    (
+        {
+            "Captain" : "Kirk",
+            "First Officer" : "Spock",
+            "Engineer" : "Scott"
+        },
+        [ 1, 2, 3, 4 ],
+        {
+            "Captain" : "Archer",
+            "Engineer" : "Trip"
+        },
+        true(),
+        1,
+        jn:null()
+    ),
+    ("Captain", "First Officer", "XQuery Evangelist")
+),
+libjn:project(
+    (
+        {
+            "Captain" : "Archer",
+            "Engineer" : "Trip"
+        },
+        true(),
+        1,
+        jn:null()
+    ),
+    "Captain"
+),
+libjn:project(
+    (
+        {
+            "Captain" : "Archer",
+            "Engineer" : "Trip"
+        },
+        true(),
+        1,
+        jn:null()
+    ),
+    ()
+)
+
diff --git a/vxquery-xtest/src/test/resources/Queries/XQuery/Json/Libraries/remove_keys.xq b/vxquery-xtest/src/test/resources/Queries/XQuery/Json/Libraries/remove_keys.xq
new file mode 100644 (file)
index 0000000..348e57c
--- /dev/null
@@ -0,0 +1,60 @@
+(: 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:remove-keys :)
+libjn:remove-keys(
+    (
+        {
+            "Captain" : "Kirk",
+            "First Officer" : "Spock",
+            "Engineer" : "Scott"
+        },
+        [ 1, 2, 3, 4 ],
+        {
+            "Captain" : "Archer",
+            "Engineer" : "Trip"
+        },
+        true(),
+        1,
+        jn:null()
+    ),
+    ("Captain", "First Officer", "XQuery Evangelist")
+),
+libjn:remove-keys(
+    (
+        {
+            "Captain" : "Archer",
+            "Engineer" : "Trip"
+        },
+        true(),
+        1,
+        jn:null()
+    ),
+    "Captain"
+),
+libjn:remove-keys(
+    (
+        {
+            "Captain" : "Archer",
+            "Engineer" : "Trip"
+        },
+        true(),
+        1,
+        jn:null()
+    ),
+    ()
+)
index fcd0eac..66cab65 100644 (file)
         <query name="descendant_pairs" date="2016-07-29"/>
         <output-file compare="Text">descendant_pairs.txt</output-file>
     </test-case>
+   <test-case name="project" FilePath="Json/Libraries/" Creator="Riyafa Abdul Hameed">
+      <description>Json Libraries.</description>
+      <query name="project" date="2016-07-31"/>
+      <output-file compare="Text">project.txt</output-file>
+   </test-case>
+   <test-case name="remove-keys" FilePath="Json/Libraries/" Creator="Riyafa Abdul Hameed">
+      <description>Json Libraries.</description>
+      <query name="remove_keys" date="2016-07-31"/>
+      <output-file compare="Text">remove_keys.txt</output-file>
+   </test-case>
 </test-group>