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/06/28 10:05:49 UTC

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

Author: tillw
Date: Thu Jun 28 08:05:47 2012
New Revision: 1354848

URL: http://svn.apache.org/viewvc?rev=1354848&view=rev
Log:
improved and new string function implementations

Added:
    incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/AbstractCharacterIteratorCopyingEvaluator.java
    incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/AbstractCharacterIteratorCopyingEvaluatorFactory.java
    incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/AbstractTranscodingCharacterIterator.java
    incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/FnCodepointEqualEvaluatorFactory.java
    incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/FnCompareEvaluatorFactory.java
    incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/FnStartsWithEvaluatorFactory.java
    incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/ICharacterIterator.java
    incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/LowerCaseCharacterIterator.java
    incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/SubstringCharacterIterator.java
    incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/UTF8StringCharacterIterator.java
    incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/UpperCaseCharacterIterator.java
Modified:
    incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/functions/builtin-functions.xml
    incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/AbstractStringTranscodingFunction.java
    incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/FnLowerCaseEvaluatorFactory.java
    incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/FnStringLengthEvaluatorFactory.java
    incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/FnSubstringEvaluatorFactory.java
    incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/FnUpperCaseEvaluatorFactory.java

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=1354848&r1=1354847&r2=1354848&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 Thu Jun 28 08:05:47 2012
@@ -96,6 +96,7 @@
         <param name="comparand1" type="xs:string?"/>
         <param name="comparand2" type="xs:string?"/>
         <return type="xs:boolean?"/>
+        <runtime type="scalar" class="org.apache.vxquery.runtime.functions.strings.FnCodepointEqualEvaluatorFactory"/>
     </function>
     
     <!-- fn:codepoints-to-string( $arg as xs:integer*)  as xs:string -->
@@ -120,6 +121,7 @@
         <param name="comparand1" type="xs:string?"/>
         <param name="comparand2" type="xs:string?"/>
         <return type="xs:integer?"/>
+        <runtime type="scalar" class="org.apache.vxquery.runtime.functions.strings.FnCompareEvaluatorFactory"/>
     </function>
     
     <!-- fn:compare($comparand1  as xs:string?, $comparand2 as xs:string?, $collation as xs:string)  as xs:integer?  -->
@@ -128,6 +130,7 @@
         <param name="comparand2" type="xs:string?"/>
         <param name="collation" type="xs:string"/>
         <return type="xs:integer?"/>
+        <runtime type="scalar" class="org.apache.vxquery.runtime.functions.strings.FnCompareEvaluatorFactory"/>
     </function>
     
     <!-- fn:concat($arg1 as  xs:anyAtomicType?, $arg2 as xs:anyAtomicType?, ...) as xs:string -->
@@ -760,6 +763,7 @@
         <param name="arg1" type="xs:string?"/>
         <param name="arg2" type="xs:string?"/>
         <return type="xs:boolean"/>
+        <runtime type="scalar" class="org.apache.vxquery.runtime.functions.strings.FnStartsWithEvaluatorFactory"/>
     </function>
 
     <!-- fn:starts-with($arg1  as xs:string?, $arg2 as xs:string?, $collation as xs:string)  as xs:boolean -->
@@ -768,6 +772,7 @@
         <param name="arg2" type="xs:string?"/>
         <param name="collation" type="xs:string"/>
         <return type="xs:boolean"/>
+        <runtime type="scalar" class="org.apache.vxquery.runtime.functions.strings.FnStartsWithEvaluatorFactory"/>
     </function>
 
     <!-- fn:static-base-uri() as  xs:anyURI?  -->

Added: incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/AbstractCharacterIteratorCopyingEvaluator.java
URL: http://svn.apache.org/viewvc/incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/AbstractCharacterIteratorCopyingEvaluator.java?rev=1354848&view=auto
==============================================================================
--- incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/AbstractCharacterIteratorCopyingEvaluator.java (added)
+++ incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/AbstractCharacterIteratorCopyingEvaluator.java Thu Jun 28 08:05:47 2012
@@ -0,0 +1,67 @@
+package org.apache.vxquery.runtime.functions.strings;
+
+import java.io.DataOutput;
+import java.io.IOException;
+
+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 org.apache.vxquery.runtime.functions.base.AbstractTaggedValueArgumentScalarEvaluator;
+
+import edu.uci.ics.hyracks.algebricks.runtime.base.IScalarEvaluator;
+import edu.uci.ics.hyracks.data.std.api.IPointable;
+import edu.uci.ics.hyracks.dataflow.common.data.accessors.ArrayBackedValueStorage;
+
+public abstract class AbstractCharacterIteratorCopyingEvaluator extends AbstractTaggedValueArgumentScalarEvaluator {
+    private final ICharacterIterator charIterator;
+    private final ArrayBackedValueStorage abvs;
+
+    public AbstractCharacterIteratorCopyingEvaluator(IScalarEvaluator[] args, ICharacterIterator charIterator) {
+        super(args);
+        this.charIterator = charIterator;
+        abvs = new ArrayBackedValueStorage();
+    }
+
+    @Override
+    public final void evaluate(TaggedValuePointable[] args, IPointable result) throws SystemException {
+        preEvaluate(args);
+        abvs.reset();
+        charIterator.reset();
+        try {
+            // Byte Format: Type (1 byte) + String Length (2 bytes) + String.
+            DataOutput out = abvs.getDataOutput();
+            out.write(ValueTag.XS_STRING_TAG);
+
+            // Default values for the length and update later
+            out.write(0xFF);
+            out.write(0xFF);
+
+            int c;
+            while (ICharacterIterator.EOS_CHAR != (c = charIterator.next())) {
+                if ((c >= 0x0001) && (c <= 0x007F)) {
+                    out.write((byte) c);
+                } else if (c > 0x07FF) {
+                    out.write((byte) (0xE0 | ((c >> 12) & 0x0F)));
+                    out.write((byte) (0x80 | ((c >> 6) & 0x3F)));
+                    out.write((byte) (0x80 | ((c >> 0) & 0x3F)));
+                } else {
+                    out.write((byte) (0xC0 | ((c >> 6) & 0x1F)));
+                    out.write((byte) (0x80 | ((c >> 0) & 0x3F)));
+                }
+            }
+
+            // Update the full length string in the byte array.
+            byte[] stringResult = abvs.getByteArray();
+            stringResult[1] = (byte) (((abvs.getLength() - 3) >>> 8) & 0xFF);
+            stringResult[2] = (byte) (((abvs.getLength() - 3) >>> 0) & 0xFF);
+
+            result.set(stringResult, 0, abvs.getLength());
+        } catch (IOException e) {
+            throw new SystemException(ErrorCode.SYSE0001, e);
+        }
+    }
+
+    protected abstract void preEvaluate(TaggedValuePointable[] args) throws SystemException;
+
+}

Added: incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/AbstractCharacterIteratorCopyingEvaluatorFactory.java
URL: http://svn.apache.org/viewvc/incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/AbstractCharacterIteratorCopyingEvaluatorFactory.java?rev=1354848&view=auto
==============================================================================
--- incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/AbstractCharacterIteratorCopyingEvaluatorFactory.java (added)
+++ incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/AbstractCharacterIteratorCopyingEvaluatorFactory.java Thu Jun 28 08:05:47 2012
@@ -0,0 +1,14 @@
+package org.apache.vxquery.runtime.functions.strings;
+
+import org.apache.vxquery.runtime.functions.base.AbstractTaggedValueArgumentScalarEvaluatorFactory;
+
+import edu.uci.ics.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
+
+public abstract class AbstractCharacterIteratorCopyingEvaluatorFactory extends AbstractTaggedValueArgumentScalarEvaluatorFactory {
+    private static final long serialVersionUID = 1L;
+
+    public AbstractCharacterIteratorCopyingEvaluatorFactory(IScalarEvaluatorFactory[] args) {
+        super(args);
+    }
+
+}

Modified: incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/AbstractStringTranscodingFunction.java
URL: http://svn.apache.org/viewvc/incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/AbstractStringTranscodingFunction.java?rev=1354848&r1=1354847&r2=1354848&view=diff
==============================================================================
--- incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/AbstractStringTranscodingFunction.java (original)
+++ incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/AbstractStringTranscodingFunction.java Thu Jun 28 08:05:47 2012
@@ -1,92 +0,0 @@
-package org.apache.vxquery.runtime.functions.strings;
-
-import java.io.DataOutput;
-import java.io.IOException;
-
-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 org.apache.vxquery.runtime.functions.base.AbstractTaggedValueArgumentScalarEvaluator;
-
-import edu.uci.ics.hyracks.algebricks.runtime.base.IScalarEvaluator;
-import edu.uci.ics.hyracks.data.std.api.IPointable;
-import edu.uci.ics.hyracks.data.std.primitive.UTF8StringPointable;
-import edu.uci.ics.hyracks.dataflow.common.data.accessors.ArrayBackedValueStorage;
-
-public abstract class AbstractStringTranscodingFunction extends AbstractTaggedValueArgumentScalarEvaluator {
-    final UTF8StringPointable stringp = new UTF8StringPointable();
-    final ArrayBackedValueStorage abvs = new ArrayBackedValueStorage();
-
-    public AbstractStringTranscodingFunction(IScalarEvaluator[] args) {
-        super(args);
-    }
-
-    @Override
-    final protected void evaluate(TaggedValuePointable[] args, IPointable result) throws SystemException {
-        int c = 0;
-
-        abvs.reset();
-        TaggedValuePointable tvp1 = args[0];
-
-        // Only accept strings as input.
-        if (tvp1.getTag() != ValueTag.XS_STRING_TAG) {
-            throw new SystemException(ErrorCode.FORG0006);
-        }
-
-        tvp1.getValue(stringp);
-        int length = stringp.getStringLength();
-
-        try {
-            // Byte Format: Type (1 byte) + String Length (2 bytes) + String.
-            DataOutput out = abvs.getDataOutput();
-            out.write(ValueTag.XS_STRING_TAG);
-
-            // Default values for the length and update later
-            out.write(0xFF);
-            out.write(0xFF);
-
-            int i = 0;
-            int offset = 2;
-            // General case for characters.
-            for (; i < length; ++i) {
-                c = transcodeCharacter(stringp.charAt(offset));
-                if (!((c >= 0x0001) && (c <= 0x007F))) {
-                    break;
-                }
-                out.write((byte) c);
-                ++offset;
-            }
-
-            // Uncommon case: Must look at full range of characters.
-            for (; i < length; ++i) {
-                c = transcodeCharacter(stringp.charAt(offset));
-                if ((c >= 0x0001) && (c <= 0x007F)) {
-                    out.write((byte) c);
-                    ++offset;
-                } else if (c > 0x07FF) {
-                    out.write((byte) (0xE0 | ((c >> 12) & 0x0F)));
-                    out.write((byte) (0x80 | ((c >> 6) & 0x3F)));
-                    out.write((byte) (0x80 | ((c >> 0) & 0x3F)));
-                    offset += 3;
-                } else {
-                    out.write((byte) (0xC0 | ((c >> 6) & 0x1F)));
-                    out.write((byte) (0x80 | ((c >> 0) & 0x3F)));
-                    offset += 2;
-                }
-            }
-
-            // Update the full length string in the byte array.
-            byte[] stringResult = abvs.getByteArray();
-            stringResult[1] = (byte) (((abvs.getLength() - 3) >>> 8) & 0xFF);
-            stringResult[2] = (byte) (((abvs.getLength() - 3) >>> 0) & 0xFF);
-
-            result.set(stringResult, 0, abvs.getLength());
-        } catch (IOException e) {
-            throw new SystemException(ErrorCode.SYSE0001, e);
-        }
-    }
-
-    protected abstract char transcodeCharacter(char c);
-
-}

Added: incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/AbstractTranscodingCharacterIterator.java
URL: http://svn.apache.org/viewvc/incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/AbstractTranscodingCharacterIterator.java?rev=1354848&view=auto
==============================================================================
--- incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/AbstractTranscodingCharacterIterator.java (added)
+++ incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/AbstractTranscodingCharacterIterator.java Thu Jun 28 08:05:47 2012
@@ -0,0 +1,22 @@
+package org.apache.vxquery.runtime.functions.strings;
+
+public abstract class AbstractTranscodingCharacterIterator implements ICharacterIterator {
+    private ICharacterIterator in;
+
+    public AbstractTranscodingCharacterIterator(ICharacterIterator in) {
+        this.in = in;
+    }
+
+    final public char next() {
+        int c = in.next();
+        System.err.println( "  AbstractTranscodingCharacterIterator  " + c);
+        return c != ICharacterIterator.EOS_CHAR ? transcodeCharacter((char) c) : (char) ICharacterIterator.EOS_CHAR;
+    }
+
+    final public void reset() {
+        in.reset();
+    }
+
+    protected abstract char transcodeCharacter(char c);
+
+}

Added: incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/FnCodepointEqualEvaluatorFactory.java
URL: http://svn.apache.org/viewvc/incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/FnCodepointEqualEvaluatorFactory.java?rev=1354848&view=auto
==============================================================================
--- incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/FnCodepointEqualEvaluatorFactory.java (added)
+++ incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/FnCodepointEqualEvaluatorFactory.java Thu Jun 28 08:05:47 2012
@@ -0,0 +1,73 @@
+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 org.apache.vxquery.runtime.functions.base.AbstractTaggedValueArgumentScalarEvaluator;
+import org.apache.vxquery.runtime.functions.base.AbstractTaggedValueArgumentScalarEvaluatorFactory;
+
+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.api.IPointable;
+import edu.uci.ics.hyracks.data.std.primitive.UTF8StringPointable;
+
+public class FnCodepointEqualEvaluatorFactory extends AbstractTaggedValueArgumentScalarEvaluatorFactory {
+    private static final long serialVersionUID = 1L;
+
+    public FnCodepointEqualEvaluatorFactory(IScalarEvaluatorFactory[] args) {
+        super(args);
+    }
+
+    @Override
+    protected IScalarEvaluator createEvaluator(IScalarEvaluator[] args) throws AlgebricksException {
+        final UTF8StringPointable stringp1 = new UTF8StringPointable();
+        final UTF8StringPointable stringp2 = new UTF8StringPointable();
+        final ICharacterIterator charIterator1 = new UTF8StringCharacterIterator(stringp1);
+        final ICharacterIterator charIterator2 = new UTF8StringCharacterIterator(stringp2);
+
+        return new AbstractTaggedValueArgumentScalarEvaluator(args) {
+            @Override
+            protected void evaluate(TaggedValuePointable[] args, IPointable result) throws SystemException {
+                // Default result is false.
+                byte[] booleanResult = new byte[2];
+                booleanResult[0] = ValueTag.XS_BOOLEAN_TAG;
+                booleanResult[1] = 0;
+
+                TaggedValuePointable tvp1 = args[0];
+                TaggedValuePointable tvp2 = args[1];
+
+                // Only accept strings as input.
+                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);
+                charIterator1.reset();
+                charIterator2.reset();
+
+                int c1;
+                int c2;
+                while (true) {
+                    c1 = charIterator1.next();
+                    c2 = charIterator2.next();
+                    if (ICharacterIterator.EOS_CHAR == c1 && ICharacterIterator.EOS_CHAR == c2) {
+                        // Checked the full length of search string.
+                        booleanResult[1] = 1;
+                        break;
+                    }
+                    if (c1 != c2) {
+                        // Characters do not match
+                        break;
+                    }
+                }
+
+                result.set(booleanResult, 0, 2);
+            }
+        };
+    }
+};

Added: incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/FnCompareEvaluatorFactory.java
URL: http://svn.apache.org/viewvc/incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/FnCompareEvaluatorFactory.java?rev=1354848&view=auto
==============================================================================
--- incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/FnCompareEvaluatorFactory.java (added)
+++ incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/FnCompareEvaluatorFactory.java Thu Jun 28 08:05:47 2012
@@ -0,0 +1,92 @@
+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 org.apache.vxquery.runtime.functions.base.AbstractTaggedValueArgumentScalarEvaluator;
+import org.apache.vxquery.runtime.functions.base.AbstractTaggedValueArgumentScalarEvaluatorFactory;
+
+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.api.IPointable;
+import edu.uci.ics.hyracks.data.std.primitive.LongPointable;
+import edu.uci.ics.hyracks.data.std.primitive.UTF8StringPointable;
+
+public class FnCompareEvaluatorFactory extends AbstractTaggedValueArgumentScalarEvaluatorFactory {
+    private static final long serialVersionUID = 1L;
+
+    public FnCompareEvaluatorFactory(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 ICharacterIterator charIterator1 = new UTF8StringCharacterIterator(stringp1);
+        final ICharacterIterator charIterator2 = new UTF8StringCharacterIterator(stringp2);
+        final byte[] integerResult = new byte[LongPointable.TYPE_TRAITS.getFixedLength() + 1];
+
+        return new AbstractTaggedValueArgumentScalarEvaluator(args) {
+            @Override
+            protected void evaluate(TaggedValuePointable[] args, IPointable result) throws SystemException {
+                // Default result is false.
+                int intResult;
+
+                TaggedValuePointable tvp1 = args[0];
+                TaggedValuePointable tvp2 = args[1];
+
+                // Only accept strings as input.
+                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);
+                charIterator1.reset();
+                charIterator2.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);
+                }
+                // TODO use the third value as collation
+
+                int c1;
+                int c2;
+                while (true) {
+                    c1 = charIterator1.next();
+                    c2 = charIterator2.next();
+                    if (ICharacterIterator.EOS_CHAR == c1 && ICharacterIterator.EOS_CHAR == c2) {
+                        // Checked the full length of search string.
+                        intResult = 0;
+                        break;
+                    }
+                    if (c1 > c2) {
+                        // Character in string one is larger.
+                        intResult = -1;
+                        break;
+                    }
+                    if (c1 < c2) {
+                        // Character in string two is larger.
+                        intResult = 1;
+                        break;
+                    }
+                }
+
+                integerResult[0] = ValueTag.XS_INTEGER_TAG;
+                LongPointable.setLong(integerResult, 1, (long) intResult);
+                result.set(integerResult, 0, LongPointable.TYPE_TRAITS.getFixedLength() + 1);
+            }
+        };
+    }
+};

Modified: incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/FnLowerCaseEvaluatorFactory.java
URL: http://svn.apache.org/viewvc/incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/FnLowerCaseEvaluatorFactory.java?rev=1354848&r1=1354847&r2=1354848&view=diff
==============================================================================
--- incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/FnLowerCaseEvaluatorFactory.java (original)
+++ incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/FnLowerCaseEvaluatorFactory.java Thu Jun 28 08:05:47 2012
@@ -1,12 +1,16 @@
 package org.apache.vxquery.runtime.functions.strings;
 
-import org.apache.vxquery.runtime.functions.base.AbstractTaggedValueArgumentScalarEvaluatorFactory;
+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 FnLowerCaseEvaluatorFactory extends AbstractTaggedValueArgumentScalarEvaluatorFactory {
+public class FnLowerCaseEvaluatorFactory extends AbstractCharacterIteratorCopyingEvaluatorFactory {
     private static final long serialVersionUID = 1L;
 
     public FnLowerCaseEvaluatorFactory(IScalarEvaluatorFactory[] args) {
@@ -15,9 +19,20 @@ public class FnLowerCaseEvaluatorFactory
 
     @Override
     protected IScalarEvaluator createEvaluator(IScalarEvaluator[] args) throws AlgebricksException {
-        return new AbstractStringTranscodingFunction(args) {
-            protected char transcodeCharacter(char c) {
-                return Character.toLowerCase(c);
+        final UTF8StringPointable stringp = new UTF8StringPointable();
+        final ICharacterIterator charIterator = new LowerCaseCharacterIterator(new UTF8StringCharacterIterator(stringp));
+        return new AbstractCharacterIteratorCopyingEvaluator(args, charIterator) {
+            
+            @Override
+            protected void preEvaluate(TaggedValuePointable[] args) throws SystemException {
+                TaggedValuePointable tvp1 = args[0];
+
+                // Only accept strings as input.
+                if (tvp1.getTag() != ValueTag.XS_STRING_TAG) {
+                    throw new SystemException(ErrorCode.FORG0006);
+                }
+
+                tvp1.getValue(stringp);
             }
         };
     }

Added: incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/FnStartsWithEvaluatorFactory.java
URL: http://svn.apache.org/viewvc/incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/FnStartsWithEvaluatorFactory.java?rev=1354848&view=auto
==============================================================================
--- incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/FnStartsWithEvaluatorFactory.java (added)
+++ incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/FnStartsWithEvaluatorFactory.java Thu Jun 28 08:05:47 2012
@@ -0,0 +1,89 @@
+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 org.apache.vxquery.runtime.functions.base.AbstractTaggedValueArgumentScalarEvaluator;
+import org.apache.vxquery.runtime.functions.base.AbstractTaggedValueArgumentScalarEvaluatorFactory;
+
+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.api.IPointable;
+import edu.uci.ics.hyracks.data.std.primitive.UTF8StringPointable;
+
+public class FnStartsWithEvaluatorFactory extends AbstractTaggedValueArgumentScalarEvaluatorFactory {
+    private static final long serialVersionUID = 1L;
+
+    public FnStartsWithEvaluatorFactory(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 ICharacterIterator charIterator1 = new UTF8StringCharacterIterator(stringp1);
+        final ICharacterIterator charIterator2 = new UTF8StringCharacterIterator(stringp2);
+
+        return new AbstractTaggedValueArgumentScalarEvaluator(args) {
+            @Override
+            protected void evaluate(TaggedValuePointable[] args, IPointable result) throws SystemException {
+                // Default result is false.
+                byte[] booleanResult = new byte[2];
+                booleanResult[0] = ValueTag.XS_BOOLEAN_TAG;
+                booleanResult[1] = 0;
+
+                TaggedValuePointable tvp1 = args[0];
+                TaggedValuePointable tvp2 = args[1];
+
+                // Only accept strings as input.
+                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);
+                charIterator1.reset();
+                charIterator2.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);
+                }
+                // TODO use the third value as collation
+
+                // Only need to run comparisons if they both have a non empty string.
+                if (stringp1.getLength() > 2 && stringp2.getLength() > 2) {
+                    int c1;
+                    int c2;
+                    while (true) {
+                        c1 = charIterator1.next();
+                        c2 = charIterator2.next();
+                        if (ICharacterIterator.EOS_CHAR == c2) {
+                            // Checked the full length of search string.
+                            booleanResult[1] = 1;
+                            break;
+                        }
+                        if (c1 != c2) {
+                            // Characters do not match
+                            break;
+                        }
+                    }
+                } else if (stringp2.getLength() == 2) {
+                    booleanResult[1] = 1;
+                }
+
+                result.set(booleanResult, 0, 2);
+            }
+        };
+    }
+}

Modified: incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/FnStringLengthEvaluatorFactory.java
URL: http://svn.apache.org/viewvc/incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/FnStringLengthEvaluatorFactory.java?rev=1354848&r1=1354847&r2=1354848&view=diff
==============================================================================
--- incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/FnStringLengthEvaluatorFactory.java (original)
+++ incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/FnStringLengthEvaluatorFactory.java Thu Jun 28 08:05:47 2012
@@ -24,7 +24,7 @@ public class FnStringLengthEvaluatorFact
     @Override
     protected IScalarEvaluator createEvaluator(IScalarEvaluator[] args) throws AlgebricksException {
         final UTF8StringPointable stringp = new UTF8StringPointable();
-        final byte[] integerResult = new byte[9];
+        final byte[] integerResult = new byte[LongPointable.TYPE_TRAITS.getFixedLength() + 1];
 
         return new AbstractTaggedValueArgumentScalarEvaluator(args) {
             @Override

Modified: incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/FnSubstringEvaluatorFactory.java
URL: http://svn.apache.org/viewvc/incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/FnSubstringEvaluatorFactory.java?rev=1354848&r1=1354847&r2=1354848&view=diff
==============================================================================
--- incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/FnSubstringEvaluatorFactory.java (original)
+++ incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/FnSubstringEvaluatorFactory.java Thu Jun 28 08:05:47 2012
@@ -1,159 +1,73 @@
 package org.apache.vxquery.runtime.functions.strings;
 
-import java.io.DataOutput;
-import java.io.IOException;
-
 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 org.apache.vxquery.runtime.functions.base.AbstractTaggedValueArgumentScalarEvaluator;
-import org.apache.vxquery.runtime.functions.base.AbstractTaggedValueArgumentScalarEvaluatorFactory;
 
 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.api.IPointable;
 import edu.uci.ics.hyracks.data.std.primitive.DoublePointable;
 import edu.uci.ics.hyracks.data.std.primitive.LongPointable;
 import edu.uci.ics.hyracks.data.std.primitive.UTF8StringPointable;
 import edu.uci.ics.hyracks.dataflow.common.data.accessors.ArrayBackedValueStorage;
 
-public class FnSubstringEvaluatorFactory extends AbstractTaggedValueArgumentScalarEvaluatorFactory {
+public class FnSubstringEvaluatorFactory extends AbstractCharacterIteratorCopyingEvaluatorFactory {
     private static final long serialVersionUID = 1L;
 
     public FnSubstringEvaluatorFactory(IScalarEvaluatorFactory[] args) {
         super(args);
     }
 
+    protected static int getIntParameter(final TaggedValuePointable tvp, final DoublePointable doublep,
+            final LongPointable longp) throws SystemException {
+        switch (tvp.getTag()) {
+            case ValueTag.XS_INTEGER_TAG:
+                tvp.getValue(longp);
+                return longp.intValue();
+            case ValueTag.XS_DOUBLE_TAG:
+                tvp.getValue(doublep);
+                // TODO Double needs to be rounded
+                return doublep.intValue();
+            default:
+                throw new SystemException(ErrorCode.FORG0006);
+        }
+    }
+
     @Override
     protected IScalarEvaluator createEvaluator(IScalarEvaluator[] args) throws AlgebricksException {
         final UTF8StringPointable stringp = new UTF8StringPointable();
-        final DoublePointable doublep1 = new DoublePointable();
-        final DoublePointable doublep2 = new DoublePointable();
-        final LongPointable longp1 = new LongPointable();
-        final LongPointable longp2 = new LongPointable();
+        final DoublePointable doublep = new DoublePointable();
+        final LongPointable longp = new LongPointable();
         final ArrayBackedValueStorage abvs = new ArrayBackedValueStorage();
+        final SubstringCharacterIterator charIterator = new SubstringCharacterIterator(new UTF8StringCharacterIterator(
+                stringp));
 
-        return new AbstractTaggedValueArgumentScalarEvaluator(args) {
+        return new AbstractCharacterIteratorCopyingEvaluator(args, charIterator) {
             @Override
-            protected void evaluate(TaggedValuePointable[] args, IPointable result) throws SystemException {
-                int startingLoc = 0;
-                int endingLoc;
-                byte[] stringResult;
-
+            protected void preEvaluate(TaggedValuePointable[] args) throws SystemException {
+                int startingLocation = 0;
+                int length = Integer.MAX_VALUE;
                 abvs.reset();
-                TaggedValuePointable tvp1 = args[0];
-                TaggedValuePointable tvp2 = args[1];
+                charIterator.reset();
 
                 // Only accept string, double, and optional double as input.
+                TaggedValuePointable tvp1 = args[0];
                 if (tvp1.getTag() != ValueTag.XS_STRING_TAG) {
                     throw new SystemException(ErrorCode.FORG0006);
                 }
                 tvp1.getValue(stringp);
-                int length = stringp.getStringLength();
 
                 // TODO Check specification to see if only double? If so change passing function.
-                switch (tvp2.getTag()) {
-                    case ValueTag.XS_INTEGER_TAG:
-                        tvp2.getValue(longp1);
-                        startingLoc = longp1.intValue();
-                        break;
-                    case ValueTag.XS_DOUBLE_TAG:
-                        tvp2.getValue(doublep1);
-                        // TODO Double needs to be rounded
-                        startingLoc = doublep1.intValue();
-                        break;
-                    default:
-                        throw new SystemException(ErrorCode.FORG0006);
-                }
+                startingLocation = getIntParameter(args[1], doublep, longp);
 
                 // Third parameter may override default endingLoc.
                 if (args.length > 2) {
-                    TaggedValuePointable tvp3 = args[2];
-                    int lengthp = 0;
-                    // TODO Check specification to see if only double? If so change passing function.
-                    switch (tvp3.getTag()) {
-                        case ValueTag.XS_INTEGER_TAG:
-                            tvp3.getValue(longp2);
-                            lengthp = longp2.intValue();
-                            break;
-                        case ValueTag.XS_DOUBLE_TAG:
-                            tvp3.getValue(doublep2);
-                            // TODO Double needs to be rounded
-                            lengthp = doublep2.intValue();
-                            break;
-                        default:
-                            throw new SystemException(ErrorCode.FORG0006);
-                    }
-                    tvp3.getValue(doublep2);
-                    endingLoc = startingLoc + lengthp;
-                } else {
-                    endingLoc = length;
+                    length = getIntParameter(args[2], doublep, longp);
                 }
 
-                try {
-                    // Byte Format: Type (1 byte) + String Length (2 bytes) + String.
-                    DataOutput out = abvs.getDataOutput();
-                    out.write(ValueTag.XS_STRING_TAG);
-
-                    // Default length to zero and update later if needed.
-                    out.write(0xFF);
-                    out.write(0xFF);
-
-                    // Only check if the section is logically in the string.
-                    if (endingLoc > startingLoc) {
-                        int c = 0;
-                        int i = 0;
-                        int offset = 2;
-                        for (; i < endingLoc && i < length; ++i) {
-                            c = stringp.charAt(offset);
-                            if (!((c >= 0x0001) && (c <= 0x007F))) {
-                                break;
-                            }
-                            if (i >= startingLoc) {
-                                out.write((byte) c);
-                            }
-                            ++offset;
-                        }
-
-                        // Must look at full range of characters.
-                        for (; i < endingLoc && i < length; ++i) {
-                            c = stringp.charAt(offset);
-                            if ((c >= 0x0001) && (c <= 0x007F)) {
-                                if (i >= startingLoc) {
-                                    out.write((byte) c);
-                                }
-                                ++offset;
-                            } else if (c > 0x07FF) {
-                                if (i >= startingLoc) {
-                                    out.write((byte) (0xE0 | ((c >> 12) & 0x0F)));
-                                    out.write((byte) (0x80 | ((c >> 6) & 0x3F)));
-                                    out.write((byte) (0x80 | ((c >> 0) & 0x3F)));
-                                }
-                                offset += 3;
-                            } else {
-                                if (i >= startingLoc) {
-                                    out.write((byte) (0xC0 | ((c >> 6) & 0x1F)));
-                                    out.write((byte) (0x80 | ((c >> 0) & 0x3F)));
-                                }
-                                offset += 2;
-                            }
-                        }
-
-                        // Update the full length string in the byte array.
-                        stringResult = abvs.getByteArray();
-                        stringResult[1] = (byte) (((abvs.getLength() - 3) >>> 8) & 0xFF);
-                        stringResult[2] = (byte) (((abvs.getLength() - 3) >>> 0) & 0xFF);
-
-                        result.set(stringResult, 0, abvs.getLength());
-                    } else {
-                        // Return an empty string;
-                        result.set(abvs.getByteArray(), 0, abvs.getLength());
-                    }
-                } catch (IOException e) {
-                    throw new SystemException(ErrorCode.SYSE0001, e);
-                }
+                charIterator.setBounds(startingLocation, length);
             }
         };
     }

Modified: incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/FnUpperCaseEvaluatorFactory.java
URL: http://svn.apache.org/viewvc/incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/FnUpperCaseEvaluatorFactory.java?rev=1354848&r1=1354847&r2=1354848&view=diff
==============================================================================
--- incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/FnUpperCaseEvaluatorFactory.java (original)
+++ incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/FnUpperCaseEvaluatorFactory.java Thu Jun 28 08:05:47 2012
@@ -1,12 +1,16 @@
 package org.apache.vxquery.runtime.functions.strings;
 
-import org.apache.vxquery.runtime.functions.base.AbstractTaggedValueArgumentScalarEvaluatorFactory;
+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 FnUpperCaseEvaluatorFactory extends AbstractTaggedValueArgumentScalarEvaluatorFactory {
+public class FnUpperCaseEvaluatorFactory extends AbstractCharacterIteratorCopyingEvaluatorFactory {
     private static final long serialVersionUID = 1L;
 
     public FnUpperCaseEvaluatorFactory(IScalarEvaluatorFactory[] args) {
@@ -15,9 +19,20 @@ public class FnUpperCaseEvaluatorFactory
 
     @Override
     protected IScalarEvaluator createEvaluator(IScalarEvaluator[] args) throws AlgebricksException {
-        return new AbstractStringTranscodingFunction(args) {
-            protected char transcodeCharacter(char c) {
-                return Character.toUpperCase(c);
+        final UTF8StringPointable stringp = new UTF8StringPointable();
+        final ICharacterIterator charIterator = new UpperCaseCharacterIterator(new UTF8StringCharacterIterator(stringp));
+        return new AbstractCharacterIteratorCopyingEvaluator(args, charIterator) {
+            
+            @Override
+            protected void preEvaluate(TaggedValuePointable[] args) throws SystemException {
+                TaggedValuePointable tvp1 = args[0];
+
+                // Only accept strings as input.
+                if (tvp1.getTag() != ValueTag.XS_STRING_TAG) {
+                    throw new SystemException(ErrorCode.FORG0006);
+                }
+
+                tvp1.getValue(stringp);
             }
         };
     }

Added: incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/ICharacterIterator.java
URL: http://svn.apache.org/viewvc/incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/ICharacterIterator.java?rev=1354848&view=auto
==============================================================================
--- incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/ICharacterIterator.java (added)
+++ incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/ICharacterIterator.java Thu Jun 28 08:05:47 2012
@@ -0,0 +1,9 @@
+package org.apache.vxquery.runtime.functions.strings;
+
+public interface ICharacterIterator {
+    public static final char EOS_CHAR = 0;
+
+    public char next();
+
+    public void reset();
+}

Added: incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/LowerCaseCharacterIterator.java
URL: http://svn.apache.org/viewvc/incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/LowerCaseCharacterIterator.java?rev=1354848&view=auto
==============================================================================
--- incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/LowerCaseCharacterIterator.java (added)
+++ incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/LowerCaseCharacterIterator.java Thu Jun 28 08:05:47 2012
@@ -0,0 +1,14 @@
+package org.apache.vxquery.runtime.functions.strings;
+
+public class LowerCaseCharacterIterator extends AbstractTranscodingCharacterIterator implements ICharacterIterator {
+
+    public LowerCaseCharacterIterator(ICharacterIterator in) {
+        super(in);
+    }
+
+    @Override
+    protected char transcodeCharacter(char c) {
+        return Character.toLowerCase(c);
+    }
+
+}

Added: incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/SubstringCharacterIterator.java
URL: http://svn.apache.org/viewvc/incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/SubstringCharacterIterator.java?rev=1354848&view=auto
==============================================================================
--- incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/SubstringCharacterIterator.java (added)
+++ incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/SubstringCharacterIterator.java Thu Jun 28 08:05:47 2012
@@ -0,0 +1,40 @@
+package org.apache.vxquery.runtime.functions.strings;
+
+
+public class SubstringCharacterIterator implements ICharacterIterator {
+    private final ICharacterIterator in;
+    private int start;
+    private int end;
+    private int charOffset;
+    
+    public SubstringCharacterIterator(ICharacterIterator in) {
+        this.in = in;
+    }
+
+    public void setBounds(int start, int end) {
+        this.start = start;
+        this.end = end;
+    }
+
+    @Override
+    public char next() {
+        char c = in.next();
+        if (charOffset <= start) {
+            ++charOffset;
+            return next();
+        }
+        else if (charOffset <= end) {
+            ++charOffset;
+            return c;
+        }
+        else {
+            return (char) 0;
+        }
+    }
+
+    @Override
+    public void reset() {
+        charOffset = 0;
+    }
+
+}

Added: incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/UTF8StringCharacterIterator.java
URL: http://svn.apache.org/viewvc/incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/UTF8StringCharacterIterator.java?rev=1354848&view=auto
==============================================================================
--- incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/UTF8StringCharacterIterator.java (added)
+++ incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/UTF8StringCharacterIterator.java Thu Jun 28 08:05:47 2012
@@ -0,0 +1,46 @@
+package org.apache.vxquery.runtime.functions.strings;
+
+import edu.uci.ics.hyracks.data.std.primitive.UTF8StringPointable;
+
+public class UTF8StringCharacterIterator implements ICharacterIterator {
+    private int byteOffset;
+    private final UTF8StringPointable stringp;
+
+    public UTF8StringCharacterIterator(UTF8StringPointable stringp) {
+        this.stringp = stringp;
+    }
+
+    public int getByteOffset() {
+        return byteOffset;
+    }
+
+    @Override
+    public char next() {
+        // Default - no character exists.
+        int c = 0;
+        if (byteOffset < stringp.getLength()) {
+            c = stringp.charAt(byteOffset);
+            System.err.println( "  UTF8StringCharacterIterator char[" + byteOffset + "] = " + c);
+                // Increment cursor
+            if ((c >= 0x0001) && (c <= 0x007F)) {
+                ++byteOffset;
+            } else if (c > 0x07FF) {
+                byteOffset += 3;
+            } else {
+                byteOffset += 2;
+            }
+        }
+        System.err.println( "  END UTF8StringCharacterIterator char[" + byteOffset + "] = " + c);
+        return (char) c;
+    }
+
+    @Override
+    public void reset() {
+        byteOffset = 2;
+    }
+
+    public void setByteOffset(int byteOffset) {
+        this.byteOffset = byteOffset;
+    }
+
+}

Added: incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/UpperCaseCharacterIterator.java
URL: http://svn.apache.org/viewvc/incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/UpperCaseCharacterIterator.java?rev=1354848&view=auto
==============================================================================
--- incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/UpperCaseCharacterIterator.java (added)
+++ incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/UpperCaseCharacterIterator.java Thu Jun 28 08:05:47 2012
@@ -0,0 +1,14 @@
+package org.apache.vxquery.runtime.functions.strings;
+
+public class UpperCaseCharacterIterator extends AbstractTranscodingCharacterIterator implements ICharacterIterator {
+
+    public UpperCaseCharacterIterator(ICharacterIterator in) {
+        super(in);
+    }
+
+    @Override
+    protected char transcodeCharacter(char c) {
+        return Character.toUpperCase(c);
+    }
+
+}