You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@vxquery.apache.org by ti...@apache.org on 2012/07/08 12:06:51 UTC

svn commit: r1358714 - in /incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery: functions/ runtime/functions/strings/

Author: tillw
Date: Sun Jul  8 10:06:51 2012
New Revision: 1358714

URL: http://svn.apache.org/viewvc?rev=1358714&view=rev
Log:
add implementations for fn:substring-before and fn:substring-after as attached to VXQUERY-35
register these implementations in builtin-functions.xml

Added:
    incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/FnSubstringAfterEvaluatorFactory.java
    incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/FnSubstringBeforeEvaluatorFactory.java
    incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/SubstringAfterCharacterIterator.java
    incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/SubstringBeforeCharacterIterator.java
Modified:
    incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/functions/builtin-functions.xml

Modified: incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/functions/builtin-functions.xml
URL: http://svn.apache.org/viewvc/incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/functions/builtin-functions.xml?rev=1358714&r1=1358713&r2=1358714&view=diff
==============================================================================
--- incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/functions/builtin-functions.xml (original)
+++ incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/functions/builtin-functions.xml Sun Jul  8 10:06:51 2012
@@ -855,6 +855,7 @@
         <param name="arg1" type="xs:string?"/>
         <param name="arg2" type="xs:string?"/>
         <return type="xs:string"/>
+        <runtime type="scalar" class="org.apache.vxquery.runtime.functions.strings.FnSubstringAfterEvaluatorFactory"/>
     </function>
 
     <!-- fn:substring-after($arg1  as xs:string?, $arg2 as xs:string?, $collation as xs:string)  as xs:string -->
@@ -863,6 +864,7 @@
         <param name="arg2" type="xs:string?"/>
         <param name="collation" type="xs:string"/>
         <return type="xs:string"/>
+        <runtime type="scalar" class="org.apache.vxquery.runtime.functions.strings.FnSubstringAfterEvaluatorFactory"/>
     </function>
 
     <!-- fn:substring-before( $arg1 as xs:string?, $arg2 as xs:string?)  as xs:string -->
@@ -870,6 +872,7 @@
         <param name="arg1" type="xs:string?"/>
         <param name="arg2" type="xs:string?"/>
         <return type="xs:string"/>
+        <runtime type="scalar" class="org.apache.vxquery.runtime.functions.strings.FnSubstringBeforeEvaluatorFactory"/>
     </function>
 
     <!-- fn:substring-before( $arg1 as xs:string?, $arg2 as xs:string?, $collation as xs:string)  as xs:string -->
@@ -878,6 +881,7 @@
         <param name="arg2" type="xs:string?"/>
         <param name="collation" type="xs:string"/>
         <return type="xs:string"/>
+        <runtime type="scalar" class="org.apache.vxquery.runtime.functions.strings.FnSubstringBeforeEvaluatorFactory"/>
     </function>
 
     <!-- fn:sum($arg as  xs:anyAtomicType*) as xs:anyAtomicType -->

Added: incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/FnSubstringAfterEvaluatorFactory.java
URL: http://svn.apache.org/viewvc/incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/FnSubstringAfterEvaluatorFactory.java?rev=1358714&view=auto
==============================================================================
--- incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/FnSubstringAfterEvaluatorFactory.java (added)
+++ incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/FnSubstringAfterEvaluatorFactory.java Sun Jul  8 10:06:51 2012
@@ -0,0 +1,60 @@
+package org.apache.vxquery.runtime.functions.strings;
+
+import org.apache.vxquery.datamodel.accessors.TaggedValuePointable;
+import org.apache.vxquery.datamodel.values.ValueTag;
+import org.apache.vxquery.exceptions.ErrorCode;
+import org.apache.vxquery.exceptions.SystemException;
+
+import edu.uci.ics.hyracks.algebricks.common.exceptions.AlgebricksException;
+import edu.uci.ics.hyracks.algebricks.runtime.base.IScalarEvaluator;
+import edu.uci.ics.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
+import edu.uci.ics.hyracks.data.std.primitive.UTF8StringPointable;
+
+public class FnSubstringAfterEvaluatorFactory extends AbstractCharacterIteratorCopyingEvaluatorFactory {
+    private static final long serialVersionUID = 1L;
+
+    public FnSubstringAfterEvaluatorFactory(IScalarEvaluatorFactory[] args) {
+        super(args);
+    }
+
+    @Override
+    protected IScalarEvaluator createEvaluator(IScalarEvaluator[] args) throws AlgebricksException {
+        final UTF8StringPointable stringp1 = new UTF8StringPointable();
+        final UTF8StringPointable stringp2 = new UTF8StringPointable();
+        final UTF8StringPointable stringp3 = new UTF8StringPointable();
+        final SubstringAfterCharacterIterator stringIterator = new SubstringAfterCharacterIterator(
+                new UTF8StringCharacterIterator(stringp1));
+        final UTF8StringCharacterIterator searchIterator = new UTF8StringCharacterIterator(stringp2);
+
+        return new AbstractCharacterIteratorCopyingEvaluator(args, stringIterator) {
+            @Override
+            protected void preEvaluate(TaggedValuePointable[] args) throws SystemException {
+                // Only accept strings as input.
+                TaggedValuePointable tvp1 = args[0];
+                TaggedValuePointable tvp2 = args[1];
+
+                if (tvp1.getTag() != ValueTag.XS_STRING_TAG) {
+                    throw new SystemException(ErrorCode.FORG0006);
+                }
+                if (tvp2.getTag() != ValueTag.XS_STRING_TAG) {
+                    throw new SystemException(ErrorCode.FORG0006);
+                }
+                tvp1.getValue(stringp1);
+                tvp2.getValue(stringp2);
+                stringIterator.reset();
+                searchIterator.reset();
+
+                // Third parameter is optional.
+                if (args.length > 2) {
+                    TaggedValuePointable tvp3 = args[2];
+                    if (tvp3.getTag() != ValueTag.XS_STRING_TAG) {
+                        throw new SystemException(ErrorCode.FORG0006);
+                    }
+                    tvp3.getValue(stringp3);
+                }
+
+                stringIterator.setSearch(searchIterator);
+            }
+        };
+    }
+}

Added: incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/FnSubstringBeforeEvaluatorFactory.java
URL: http://svn.apache.org/viewvc/incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/FnSubstringBeforeEvaluatorFactory.java?rev=1358714&view=auto
==============================================================================
--- incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/FnSubstringBeforeEvaluatorFactory.java (added)
+++ incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/FnSubstringBeforeEvaluatorFactory.java Sun Jul  8 10:06:51 2012
@@ -0,0 +1,60 @@
+package org.apache.vxquery.runtime.functions.strings;
+
+import org.apache.vxquery.datamodel.accessors.TaggedValuePointable;
+import org.apache.vxquery.datamodel.values.ValueTag;
+import org.apache.vxquery.exceptions.ErrorCode;
+import org.apache.vxquery.exceptions.SystemException;
+
+import edu.uci.ics.hyracks.algebricks.common.exceptions.AlgebricksException;
+import edu.uci.ics.hyracks.algebricks.runtime.base.IScalarEvaluator;
+import edu.uci.ics.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
+import edu.uci.ics.hyracks.data.std.primitive.UTF8StringPointable;
+
+public class FnSubstringBeforeEvaluatorFactory extends AbstractCharacterIteratorCopyingEvaluatorFactory {
+    private static final long serialVersionUID = 1L;
+
+    public FnSubstringBeforeEvaluatorFactory(IScalarEvaluatorFactory[] args) {
+        super(args);
+    }
+
+    @Override
+    protected IScalarEvaluator createEvaluator(IScalarEvaluator[] args) throws AlgebricksException {
+        final UTF8StringPointable stringp1 = new UTF8StringPointable();
+        final UTF8StringPointable stringp2 = new UTF8StringPointable();
+        final UTF8StringPointable stringp3 = new UTF8StringPointable();
+        final SubstringBeforeCharacterIterator stringIterator = new SubstringBeforeCharacterIterator(
+                new UTF8StringCharacterIterator(stringp1));
+        final UTF8StringCharacterIterator searchIterator = new UTF8StringCharacterIterator(stringp2);
+
+        return new AbstractCharacterIteratorCopyingEvaluator(args, stringIterator) {
+            @Override
+            protected void preEvaluate(TaggedValuePointable[] args) throws SystemException {
+                // Only accept strings as input.
+                TaggedValuePointable tvp1 = args[0];
+                TaggedValuePointable tvp2 = args[1];
+
+                if (tvp1.getTag() != ValueTag.XS_STRING_TAG) {
+                    throw new SystemException(ErrorCode.FORG0006);
+                }
+                if (tvp2.getTag() != ValueTag.XS_STRING_TAG) {
+                    throw new SystemException(ErrorCode.FORG0006);
+                }
+                tvp1.getValue(stringp1);
+                tvp2.getValue(stringp2);
+                stringIterator.reset();
+                searchIterator.reset();
+
+                // Third parameter is optional.
+                if (args.length > 2) {
+                    TaggedValuePointable tvp3 = args[2];
+                    if (tvp3.getTag() != ValueTag.XS_STRING_TAG) {
+                        throw new SystemException(ErrorCode.FORG0006);
+                    }
+                    tvp3.getValue(stringp3);
+                }
+
+                stringIterator.setSearch(searchIterator);
+            }
+        };
+    }
+}

Added: incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/SubstringAfterCharacterIterator.java
URL: http://svn.apache.org/viewvc/incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/SubstringAfterCharacterIterator.java?rev=1358714&view=auto
==============================================================================
--- incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/SubstringAfterCharacterIterator.java (added)
+++ incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/SubstringAfterCharacterIterator.java Sun Jul  8 10:06:51 2012
@@ -0,0 +1,59 @@
+package org.apache.vxquery.runtime.functions.strings;
+
+public class SubstringAfterCharacterIterator implements ICharacterIterator {
+    private ICharacterIterator searchIterator;
+    private final UTF8StringCharacterIterator stringIterator;
+    private boolean found = false;
+
+    public SubstringAfterCharacterIterator(UTF8StringCharacterIterator stringIterator) {
+        this.stringIterator = stringIterator;
+    }
+
+    public void setSearch(ICharacterIterator searchIterator) {
+        this.searchIterator = searchIterator;
+    }
+
+    @Override
+    public char next() {
+        int c1 = ICharacterIterator.EOS_CHAR;
+        if (!found) {
+            searchIterator.reset();
+            int currentByteOffset = 0;
+            boolean firstPass = true;
+            while (true) {
+                c1 = stringIterator.next();
+                int c2 = searchIterator.next();
+                if (firstPass) {
+                    // Save character and location for next call.
+                    currentByteOffset = stringIterator.getByteOffset();
+                    firstPass = false;
+                }
+                if (c2 == ICharacterIterator.EOS_CHAR) {
+                    // End of search string. Found the substring.
+                    found = true;
+                    break;
+                }
+                if (c1 == ICharacterIterator.EOS_CHAR) {
+                    // End of string. Stop.
+                    return (char) 0;
+                }
+                if (c1 != c2) {
+                    // No match found. Move the next character.
+                    searchIterator.reset();
+                    stringIterator.setByteOffset(currentByteOffset);
+                    firstPass = true;
+                }
+            }
+        }
+
+        if (c1 != ICharacterIterator.EOS_CHAR) {
+            return (char) c1;
+        }
+        return stringIterator.next();
+    }
+
+    @Override
+    public void reset() {
+        stringIterator.reset();
+    }
+}

Added: incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/SubstringBeforeCharacterIterator.java
URL: http://svn.apache.org/viewvc/incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/SubstringBeforeCharacterIterator.java?rev=1358714&view=auto
==============================================================================
--- incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/SubstringBeforeCharacterIterator.java (added)
+++ incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/SubstringBeforeCharacterIterator.java Sun Jul  8 10:06:51 2012
@@ -0,0 +1,51 @@
+package org.apache.vxquery.runtime.functions.strings;
+
+public class SubstringBeforeCharacterIterator implements ICharacterIterator {
+    private ICharacterIterator searchIterator;
+    private final UTF8StringCharacterIterator stringIterator;
+    private int currentByteOffset;
+
+    public SubstringBeforeCharacterIterator(UTF8StringCharacterIterator stringIterator) {
+        this.stringIterator = stringIterator;
+    }
+
+    public void setSearch(ICharacterIterator searchIterator) {
+        this.searchIterator = searchIterator;
+    }
+
+    @Override
+    public char next() {
+        // Default - no character exists.
+        int c = ICharacterIterator.EOS_CHAR;
+        boolean firstPass = true;
+        searchIterator.reset();
+
+        while (true) {
+            int c1 = stringIterator.next();
+            int c2 = searchIterator.next();
+            if (firstPass) {
+                // Save character and location for next call.
+                currentByteOffset = stringIterator.getByteOffset();
+                c = c1;
+                firstPass = false;
+            }
+            if (c2 == ICharacterIterator.EOS_CHAR) {
+                // End of string.
+                c = ICharacterIterator.EOS_CHAR;
+                break;
+            }
+            if (c1 != c2) {
+                // No match found.
+                break;
+            }
+        }
+
+        stringIterator.setByteOffset(currentByteOffset);
+        return (char) c;
+    }
+
+    @Override
+    public void reset() {
+        stringIterator.reset();
+    }
+}