You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@vxquery.apache.org by ti...@apache.org on 2012/07/08 12:06:51 UTC
svn commit: r1358714 - in
/incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery:
functions/ runtime/functions/strings/
Author: tillw
Date: Sun Jul 8 10:06:51 2012
New Revision: 1358714
URL: http://svn.apache.org/viewvc?rev=1358714&view=rev
Log:
add implementations for fn:substring-before and fn:substring-after as attached to VXQUERY-35
register these implementations in builtin-functions.xml
Added:
incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/FnSubstringAfterEvaluatorFactory.java
incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/FnSubstringBeforeEvaluatorFactory.java
incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/SubstringAfterCharacterIterator.java
incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/SubstringBeforeCharacterIterator.java
Modified:
incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/functions/builtin-functions.xml
Modified: incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/functions/builtin-functions.xml
URL: http://svn.apache.org/viewvc/incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/functions/builtin-functions.xml?rev=1358714&r1=1358713&r2=1358714&view=diff
==============================================================================
--- incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/functions/builtin-functions.xml (original)
+++ incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/functions/builtin-functions.xml Sun Jul 8 10:06:51 2012
@@ -855,6 +855,7 @@
<param name="arg1" type="xs:string?"/>
<param name="arg2" type="xs:string?"/>
<return type="xs:string"/>
+ <runtime type="scalar" class="org.apache.vxquery.runtime.functions.strings.FnSubstringAfterEvaluatorFactory"/>
</function>
<!-- fn:substring-after($arg1 as xs:string?, $arg2 as xs:string?, $collation as xs:string) as xs:string -->
@@ -863,6 +864,7 @@
<param name="arg2" type="xs:string?"/>
<param name="collation" type="xs:string"/>
<return type="xs:string"/>
+ <runtime type="scalar" class="org.apache.vxquery.runtime.functions.strings.FnSubstringAfterEvaluatorFactory"/>
</function>
<!-- fn:substring-before( $arg1 as xs:string?, $arg2 as xs:string?) as xs:string -->
@@ -870,6 +872,7 @@
<param name="arg1" type="xs:string?"/>
<param name="arg2" type="xs:string?"/>
<return type="xs:string"/>
+ <runtime type="scalar" class="org.apache.vxquery.runtime.functions.strings.FnSubstringBeforeEvaluatorFactory"/>
</function>
<!-- fn:substring-before( $arg1 as xs:string?, $arg2 as xs:string?, $collation as xs:string) as xs:string -->
@@ -878,6 +881,7 @@
<param name="arg2" type="xs:string?"/>
<param name="collation" type="xs:string"/>
<return type="xs:string"/>
+ <runtime type="scalar" class="org.apache.vxquery.runtime.functions.strings.FnSubstringBeforeEvaluatorFactory"/>
</function>
<!-- fn:sum($arg as xs:anyAtomicType*) as xs:anyAtomicType -->
Added: incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/FnSubstringAfterEvaluatorFactory.java
URL: http://svn.apache.org/viewvc/incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/FnSubstringAfterEvaluatorFactory.java?rev=1358714&view=auto
==============================================================================
--- incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/FnSubstringAfterEvaluatorFactory.java (added)
+++ incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/FnSubstringAfterEvaluatorFactory.java Sun Jul 8 10:06:51 2012
@@ -0,0 +1,60 @@
+package org.apache.vxquery.runtime.functions.strings;
+
+import org.apache.vxquery.datamodel.accessors.TaggedValuePointable;
+import org.apache.vxquery.datamodel.values.ValueTag;
+import org.apache.vxquery.exceptions.ErrorCode;
+import org.apache.vxquery.exceptions.SystemException;
+
+import edu.uci.ics.hyracks.algebricks.common.exceptions.AlgebricksException;
+import edu.uci.ics.hyracks.algebricks.runtime.base.IScalarEvaluator;
+import edu.uci.ics.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
+import edu.uci.ics.hyracks.data.std.primitive.UTF8StringPointable;
+
+public class FnSubstringAfterEvaluatorFactory extends AbstractCharacterIteratorCopyingEvaluatorFactory {
+ private static final long serialVersionUID = 1L;
+
+ public FnSubstringAfterEvaluatorFactory(IScalarEvaluatorFactory[] args) {
+ super(args);
+ }
+
+ @Override
+ protected IScalarEvaluator createEvaluator(IScalarEvaluator[] args) throws AlgebricksException {
+ final UTF8StringPointable stringp1 = new UTF8StringPointable();
+ final UTF8StringPointable stringp2 = new UTF8StringPointable();
+ final UTF8StringPointable stringp3 = new UTF8StringPointable();
+ final SubstringAfterCharacterIterator stringIterator = new SubstringAfterCharacterIterator(
+ new UTF8StringCharacterIterator(stringp1));
+ final UTF8StringCharacterIterator searchIterator = new UTF8StringCharacterIterator(stringp2);
+
+ return new AbstractCharacterIteratorCopyingEvaluator(args, stringIterator) {
+ @Override
+ protected void preEvaluate(TaggedValuePointable[] args) throws SystemException {
+ // Only accept strings as input.
+ TaggedValuePointable tvp1 = args[0];
+ TaggedValuePointable tvp2 = args[1];
+
+ if (tvp1.getTag() != ValueTag.XS_STRING_TAG) {
+ throw new SystemException(ErrorCode.FORG0006);
+ }
+ if (tvp2.getTag() != ValueTag.XS_STRING_TAG) {
+ throw new SystemException(ErrorCode.FORG0006);
+ }
+ tvp1.getValue(stringp1);
+ tvp2.getValue(stringp2);
+ stringIterator.reset();
+ searchIterator.reset();
+
+ // Third parameter is optional.
+ if (args.length > 2) {
+ TaggedValuePointable tvp3 = args[2];
+ if (tvp3.getTag() != ValueTag.XS_STRING_TAG) {
+ throw new SystemException(ErrorCode.FORG0006);
+ }
+ tvp3.getValue(stringp3);
+ }
+
+ stringIterator.setSearch(searchIterator);
+ }
+ };
+ }
+}
Added: incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/FnSubstringBeforeEvaluatorFactory.java
URL: http://svn.apache.org/viewvc/incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/FnSubstringBeforeEvaluatorFactory.java?rev=1358714&view=auto
==============================================================================
--- incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/FnSubstringBeforeEvaluatorFactory.java (added)
+++ incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/FnSubstringBeforeEvaluatorFactory.java Sun Jul 8 10:06:51 2012
@@ -0,0 +1,60 @@
+package org.apache.vxquery.runtime.functions.strings;
+
+import org.apache.vxquery.datamodel.accessors.TaggedValuePointable;
+import org.apache.vxquery.datamodel.values.ValueTag;
+import org.apache.vxquery.exceptions.ErrorCode;
+import org.apache.vxquery.exceptions.SystemException;
+
+import edu.uci.ics.hyracks.algebricks.common.exceptions.AlgebricksException;
+import edu.uci.ics.hyracks.algebricks.runtime.base.IScalarEvaluator;
+import edu.uci.ics.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
+import edu.uci.ics.hyracks.data.std.primitive.UTF8StringPointable;
+
+public class FnSubstringBeforeEvaluatorFactory extends AbstractCharacterIteratorCopyingEvaluatorFactory {
+ private static final long serialVersionUID = 1L;
+
+ public FnSubstringBeforeEvaluatorFactory(IScalarEvaluatorFactory[] args) {
+ super(args);
+ }
+
+ @Override
+ protected IScalarEvaluator createEvaluator(IScalarEvaluator[] args) throws AlgebricksException {
+ final UTF8StringPointable stringp1 = new UTF8StringPointable();
+ final UTF8StringPointable stringp2 = new UTF8StringPointable();
+ final UTF8StringPointable stringp3 = new UTF8StringPointable();
+ final SubstringBeforeCharacterIterator stringIterator = new SubstringBeforeCharacterIterator(
+ new UTF8StringCharacterIterator(stringp1));
+ final UTF8StringCharacterIterator searchIterator = new UTF8StringCharacterIterator(stringp2);
+
+ return new AbstractCharacterIteratorCopyingEvaluator(args, stringIterator) {
+ @Override
+ protected void preEvaluate(TaggedValuePointable[] args) throws SystemException {
+ // Only accept strings as input.
+ TaggedValuePointable tvp1 = args[0];
+ TaggedValuePointable tvp2 = args[1];
+
+ if (tvp1.getTag() != ValueTag.XS_STRING_TAG) {
+ throw new SystemException(ErrorCode.FORG0006);
+ }
+ if (tvp2.getTag() != ValueTag.XS_STRING_TAG) {
+ throw new SystemException(ErrorCode.FORG0006);
+ }
+ tvp1.getValue(stringp1);
+ tvp2.getValue(stringp2);
+ stringIterator.reset();
+ searchIterator.reset();
+
+ // Third parameter is optional.
+ if (args.length > 2) {
+ TaggedValuePointable tvp3 = args[2];
+ if (tvp3.getTag() != ValueTag.XS_STRING_TAG) {
+ throw new SystemException(ErrorCode.FORG0006);
+ }
+ tvp3.getValue(stringp3);
+ }
+
+ stringIterator.setSearch(searchIterator);
+ }
+ };
+ }
+}
Added: incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/SubstringAfterCharacterIterator.java
URL: http://svn.apache.org/viewvc/incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/SubstringAfterCharacterIterator.java?rev=1358714&view=auto
==============================================================================
--- incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/SubstringAfterCharacterIterator.java (added)
+++ incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/SubstringAfterCharacterIterator.java Sun Jul 8 10:06:51 2012
@@ -0,0 +1,59 @@
+package org.apache.vxquery.runtime.functions.strings;
+
+public class SubstringAfterCharacterIterator implements ICharacterIterator {
+ private ICharacterIterator searchIterator;
+ private final UTF8StringCharacterIterator stringIterator;
+ private boolean found = false;
+
+ public SubstringAfterCharacterIterator(UTF8StringCharacterIterator stringIterator) {
+ this.stringIterator = stringIterator;
+ }
+
+ public void setSearch(ICharacterIterator searchIterator) {
+ this.searchIterator = searchIterator;
+ }
+
+ @Override
+ public char next() {
+ int c1 = ICharacterIterator.EOS_CHAR;
+ if (!found) {
+ searchIterator.reset();
+ int currentByteOffset = 0;
+ boolean firstPass = true;
+ while (true) {
+ c1 = stringIterator.next();
+ int c2 = searchIterator.next();
+ if (firstPass) {
+ // Save character and location for next call.
+ currentByteOffset = stringIterator.getByteOffset();
+ firstPass = false;
+ }
+ if (c2 == ICharacterIterator.EOS_CHAR) {
+ // End of search string. Found the substring.
+ found = true;
+ break;
+ }
+ if (c1 == ICharacterIterator.EOS_CHAR) {
+ // End of string. Stop.
+ return (char) 0;
+ }
+ if (c1 != c2) {
+ // No match found. Move the next character.
+ searchIterator.reset();
+ stringIterator.setByteOffset(currentByteOffset);
+ firstPass = true;
+ }
+ }
+ }
+
+ if (c1 != ICharacterIterator.EOS_CHAR) {
+ return (char) c1;
+ }
+ return stringIterator.next();
+ }
+
+ @Override
+ public void reset() {
+ stringIterator.reset();
+ }
+}
Added: incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/SubstringBeforeCharacterIterator.java
URL: http://svn.apache.org/viewvc/incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/SubstringBeforeCharacterIterator.java?rev=1358714&view=auto
==============================================================================
--- incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/SubstringBeforeCharacterIterator.java (added)
+++ incubator/vxquery/branches/vxquery_algebricks/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/strings/SubstringBeforeCharacterIterator.java Sun Jul 8 10:06:51 2012
@@ -0,0 +1,51 @@
+package org.apache.vxquery.runtime.functions.strings;
+
+public class SubstringBeforeCharacterIterator implements ICharacterIterator {
+ private ICharacterIterator searchIterator;
+ private final UTF8StringCharacterIterator stringIterator;
+ private int currentByteOffset;
+
+ public SubstringBeforeCharacterIterator(UTF8StringCharacterIterator stringIterator) {
+ this.stringIterator = stringIterator;
+ }
+
+ public void setSearch(ICharacterIterator searchIterator) {
+ this.searchIterator = searchIterator;
+ }
+
+ @Override
+ public char next() {
+ // Default - no character exists.
+ int c = ICharacterIterator.EOS_CHAR;
+ boolean firstPass = true;
+ searchIterator.reset();
+
+ while (true) {
+ int c1 = stringIterator.next();
+ int c2 = searchIterator.next();
+ if (firstPass) {
+ // Save character and location for next call.
+ currentByteOffset = stringIterator.getByteOffset();
+ c = c1;
+ firstPass = false;
+ }
+ if (c2 == ICharacterIterator.EOS_CHAR) {
+ // End of string.
+ c = ICharacterIterator.EOS_CHAR;
+ break;
+ }
+ if (c1 != c2) {
+ // No match found.
+ break;
+ }
+ }
+
+ stringIterator.setByteOffset(currentByteOffset);
+ return (char) c;
+ }
+
+ @Override
+ public void reset() {
+ stringIterator.reset();
+ }
+}