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);
+ }
+
+}