You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@vxquery.apache.org by pr...@apache.org on 2012/09/05 23:15:19 UTC

svn commit: r1381373 - in /incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery: functions/ runtime/functions/comparison/ runtime/functions/sequence/

Author: prestonc
Date: Wed Sep  5 21:15:19 2012
New Revision: 1381373

URL: http://svn.apache.org/viewvc?rev=1381373&view=rev
Log:
VXQUERY-75 Added FnIndexOf and FnInsertBefore.

Added:
    incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/sequence/FnIndexOfScalarEvaluatorFactory.java   (with props)
    incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/sequence/FnInsertBeforeScalarEvaluatorFactory.java   (with props)
Modified:
    incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/functions/builtin-functions.xml
    incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/comparison/AbstractValueComparisonScalarEvaluatorFactory.java

Modified: incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/functions/builtin-functions.xml
URL: http://svn.apache.org/viewvc/incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/functions/builtin-functions.xml?rev=1381373&r1=1381372&r2=1381373&view=diff
==============================================================================
--- incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/functions/builtin-functions.xml (original)
+++ incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/functions/builtin-functions.xml Wed Sep  5 21:15:19 2012
@@ -429,6 +429,7 @@
         <param name="seqParam" type="xs:anyAtomicType*"/>
         <param name="srcParam" type="xs:anyAtomicType"/>
         <return type="xs:integer*"/>
+        <runtime type="scalar" class="org.apache.vxquery.runtime.functions.sequence.FnIndexOfScalarEvaluatorFactory"/>
     </function>
 
     <!-- fn:index-of($seqParam  as xs:anyAtomicType*, $srchParam as xs:anyAtomicType, $collation as xs:string)  as xs:integer* -->
@@ -437,6 +438,7 @@
         <param name="srcParam" type="xs:anyAtomicType"/>
         <param name="collation" type="xs:string"/>
         <return type="xs:integer*"/>
+        <runtime type="scalar" class="org.apache.vxquery.runtime.functions.sequence.FnIndexOfScalarEvaluatorFactory"/>
     </function>
 
     <!-- fn:insert-before($target  as item()*, $position as xs:integer, $inserts as item()*)  as item()* -->
@@ -445,6 +447,7 @@
         <param name="position" type="xs:integer"/>
         <param name="inserts" type="item()*"/>
         <return type="item()*"/>
+        <runtime type="scalar" class="org.apache.vxquery.runtime.functions.sequence.FnInsertBeforeScalarEvaluatorFactory"/>
     </function>
 
     <!-- fn:iri-to-uri($iri  as xs:string?) as  xs:string -->

Modified: incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/comparison/AbstractValueComparisonScalarEvaluatorFactory.java
URL: http://svn.apache.org/viewvc/incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/comparison/AbstractValueComparisonScalarEvaluatorFactory.java?rev=1381373&r1=1381372&r2=1381373&view=diff
==============================================================================
--- incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/comparison/AbstractValueComparisonScalarEvaluatorFactory.java (original)
+++ incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/comparison/AbstractValueComparisonScalarEvaluatorFactory.java Wed Sep  5 21:15:19 2012
@@ -53,6 +53,14 @@ import edu.uci.ics.hyracks.data.std.util
 public abstract class AbstractValueComparisonScalarEvaluatorFactory extends
         AbstractTaggedValueArgumentScalarEvaluatorFactory {
     private static final long serialVersionUID = 1L;
+    private static final ArrayBackedValueStorage abvsInteger1 = new ArrayBackedValueStorage();
+    private static final DataOutput dOutInteger1 = abvsInteger1.getDataOutput();
+    private static final ArrayBackedValueStorage abvsInteger2 = new ArrayBackedValueStorage();
+    private static final DataOutput dOutInteger2 = abvsInteger2.getDataOutput();
+    private static final TypedPointables tp1 = new TypedPointables();
+    private static final TypedPointables tp2 = new TypedPointables();
+    private static final LongPointable longp1 = (LongPointable) LongPointable.FACTORY.createPointable();
+    private static final LongPointable longp2 = (LongPointable) LongPointable.FACTORY.createPointable();
 
     public AbstractValueComparisonScalarEvaluatorFactory(IScalarEvaluatorFactory[] args) {
         super(args);
@@ -61,471 +69,476 @@ public abstract class AbstractValueCompa
     @Override
     protected IScalarEvaluator createEvaluator(IHyracksTaskContext ctx, IScalarEvaluator[] args)
             throws AlgebricksException {
+        final ArrayBackedValueStorage abvs = new ArrayBackedValueStorage();
+        final DataOutput dOut = abvs.getDataOutput();
         final AbstractValueComparisonOperation aOp = createValueComparisonOperation();
-        final ArrayBackedValueStorage abvsInteger1 = new ArrayBackedValueStorage();
-        final DataOutput dOutInteger1 = abvsInteger1.getDataOutput();
-        final ArrayBackedValueStorage abvsInteger2 = new ArrayBackedValueStorage();
-        final DataOutput dOutInteger2 = abvsInteger2.getDataOutput();
-        final TypedPointables tp1 = new TypedPointables();
-        final TypedPointables tp2 = new TypedPointables();
         final DynamicContext dCtx = (DynamicContext) ctx.getJobletContext().getGlobalJobData();
-        final LongPointable longp1 = (LongPointable) LongPointable.FACTORY.createPointable();
-        final LongPointable longp2 = (LongPointable) LongPointable.FACTORY.createPointable();
-
+        
         return new AbstractTaggedValueArgumentScalarEvaluator(args) {
             @Override
             protected void evaluate(TaggedValuePointable[] args, IPointable result) throws SystemException {
-                boolean booleanResult = false;
                 TaggedValuePointable tvp1 = args[0];
                 TaggedValuePointable tvp2 = args[1];
-                int tid1 = getBaseTypeForComparisons(tvp1.getTag());
-                int tid2 = getBaseTypeForComparisons(tvp2.getTag());
-                if (tid1 == ValueTag.XS_UNTYPED_ATOMIC_TAG) {
-                    // TODO Convert to double
-                    tid1 = ValueTag.XS_DOUBLE_TAG;
-                    throw new UnsupportedOperationException();
-                }
-                if (tid2 == ValueTag.XS_UNTYPED_ATOMIC_TAG) {
-                    // TODO Convert to double
-                    tid2 = ValueTag.XS_DOUBLE_TAG;
-                    throw new UnsupportedOperationException();
-                }
+                boolean booleanResult = compareTaggedValues(aOp, tvp1, tvp2, dCtx);
+
                 try {
-                    switch (tvp1.getTag()) {
+                    abvs.reset();
+                    dOut.write(ValueTag.XS_BOOLEAN_TAG);
+                    dOut.write(booleanResult ? 1 : 0);
+                    result.set(abvs);
+                } catch (Exception e) {
+                    throw new SystemException(ErrorCode.SYSE0001, e);
+                }
+            }
+
+        };
+    }
+
+    public static boolean compareTaggedValues(AbstractValueComparisonOperation aOp, TaggedValuePointable tvp1, TaggedValuePointable tvp2, DynamicContext dCtx) throws SystemException {
+        boolean booleanResult = false;
+        int tid1 = getBaseTypeForComparisons(tvp1.getTag());
+        int tid2 = getBaseTypeForComparisons(tvp2.getTag());
+        if (tid1 == ValueTag.XS_UNTYPED_ATOMIC_TAG) {
+            // TODO Convert to double
+            tid1 = ValueTag.XS_DOUBLE_TAG;
+            throw new UnsupportedOperationException();
+        }
+        if (tid2 == ValueTag.XS_UNTYPED_ATOMIC_TAG) {
+            // TODO Convert to double
+            tid2 = ValueTag.XS_DOUBLE_TAG;
+            throw new UnsupportedOperationException();
+        }
+        try {
+            switch (tvp1.getTag()) {
+                case ValueTag.XS_INTEGER_TAG:
+                case ValueTag.XS_NON_POSITIVE_INTEGER_TAG:
+                case ValueTag.XS_NEGATIVE_INTEGER_TAG:
+                case ValueTag.XS_LONG_TAG:
+                case ValueTag.XS_NON_NEGATIVE_INTEGER_TAG:
+                case ValueTag.XS_UNSIGNED_LONG_TAG:
+                case ValueTag.XS_POSITIVE_INTEGER_TAG:
+                case ValueTag.XS_INT_TAG:
+                case ValueTag.XS_UNSIGNED_INT_TAG:
+                case ValueTag.XS_SHORT_TAG:
+                case ValueTag.XS_UNSIGNED_SHORT_TAG:
+                case ValueTag.XS_BYTE_TAG:
+                case ValueTag.XS_UNSIGNED_BYTE_TAG:
+                    abvsInteger1.reset();
+                    getIntegerPointable(tp1, tvp1, dOutInteger1);
+                    longp1.set(abvsInteger1.getByteArray(), abvsInteger1.getStartOffset() + 1,
+                            LongPointable.TYPE_TRAITS.getFixedLength());
+            }
+            switch (tvp2.getTag()) {
+                case ValueTag.XS_INTEGER_TAG:
+                case ValueTag.XS_NON_POSITIVE_INTEGER_TAG:
+                case ValueTag.XS_NEGATIVE_INTEGER_TAG:
+                case ValueTag.XS_LONG_TAG:
+                case ValueTag.XS_NON_NEGATIVE_INTEGER_TAG:
+                case ValueTag.XS_UNSIGNED_LONG_TAG:
+                case ValueTag.XS_POSITIVE_INTEGER_TAG:
+                case ValueTag.XS_INT_TAG:
+                case ValueTag.XS_UNSIGNED_INT_TAG:
+                case ValueTag.XS_SHORT_TAG:
+                case ValueTag.XS_UNSIGNED_SHORT_TAG:
+                case ValueTag.XS_BYTE_TAG:
+                case ValueTag.XS_UNSIGNED_BYTE_TAG:
+                    abvsInteger2.reset();
+                    getIntegerPointable(tp2, tvp2, dOutInteger2);
+                    longp2.set(abvsInteger2.getByteArray(), abvsInteger2.getStartOffset() + 1,
+                            LongPointable.TYPE_TRAITS.getFixedLength());
+            }
+            switch (tid1) {
+                case ValueTag.XS_DECIMAL_TAG:
+                    tvp1.getValue(tp1.decp);
+                    switch (tid2) {
+                        case ValueTag.XS_DECIMAL_TAG:
+                            tvp2.getValue(tp2.decp);
+                            booleanResult = aOp.operateDecimalDecimal(tp1.decp, tp2.decp);
+                            break;
+
+                        case ValueTag.XS_INTEGER_TAG:
+                            booleanResult = aOp.operateDecimalInteger(tp1.decp, longp2);
+                            break;
+
+                        case ValueTag.XS_FLOAT_TAG:
+                            tvp2.getValue(tp2.floatp);
+                            booleanResult = aOp.operateDecimalFloat(tp1.decp, tp2.floatp);
+                            break;
+
+                        case ValueTag.XS_DOUBLE_TAG:
+                            tvp2.getValue(tp2.doublep);
+                            booleanResult = aOp.operateDecimalDouble(tp1.decp, tp2.doublep);
+                            break;
+                    }
+                    break;
+
+                case ValueTag.XS_INTEGER_TAG:
+                    switch (tid2) {
+                        case ValueTag.XS_DECIMAL_TAG:
+                            tvp2.getValue(tp2.decp);
+                            booleanResult = aOp.operateIntegerDecimal(longp1, tp2.decp);
+                            break;
+
                         case ValueTag.XS_INTEGER_TAG:
-                        case ValueTag.XS_NON_POSITIVE_INTEGER_TAG:
-                        case ValueTag.XS_NEGATIVE_INTEGER_TAG:
-                        case ValueTag.XS_LONG_TAG:
-                        case ValueTag.XS_NON_NEGATIVE_INTEGER_TAG:
-                        case ValueTag.XS_UNSIGNED_LONG_TAG:
-                        case ValueTag.XS_POSITIVE_INTEGER_TAG:
-                        case ValueTag.XS_INT_TAG:
-                        case ValueTag.XS_UNSIGNED_INT_TAG:
-                        case ValueTag.XS_SHORT_TAG:
-                        case ValueTag.XS_UNSIGNED_SHORT_TAG:
-                        case ValueTag.XS_BYTE_TAG:
-                        case ValueTag.XS_UNSIGNED_BYTE_TAG:
-                            abvsInteger1.reset();
-                            getIntegerPointable(tp1, tvp1, dOutInteger1);
-                            longp1.set(abvsInteger1.getByteArray(), abvsInteger1.getStartOffset() + 1,
-                                    LongPointable.TYPE_TRAITS.getFixedLength());
+                            booleanResult = aOp.operateIntegerInteger(longp1, longp2);
+                            break;
+
+                        case ValueTag.XS_FLOAT_TAG:
+                            tvp2.getValue(tp2.floatp);
+                            booleanResult = aOp.operateIntegerFloat(longp1, tp2.floatp);
+                            break;
+
+                        case ValueTag.XS_DOUBLE_TAG:
+                            tvp2.getValue(tp2.doublep);
+                            booleanResult = aOp.operateIntegerDouble(longp1, tp2.doublep);
+                            break;
                     }
-                    switch (tvp2.getTag()) {
+                    break;
+
+                case ValueTag.XS_FLOAT_TAG:
+                    tvp1.getValue(tp1.floatp);
+                    switch (tid2) {
+                        case ValueTag.XS_DECIMAL_TAG:
+                            tvp2.getValue(tp2.decp);
+                            booleanResult = aOp.operateFloatDecimal(tp1.floatp, tp2.decp);
+                            break;
+
                         case ValueTag.XS_INTEGER_TAG:
-                        case ValueTag.XS_NON_POSITIVE_INTEGER_TAG:
-                        case ValueTag.XS_NEGATIVE_INTEGER_TAG:
-                        case ValueTag.XS_LONG_TAG:
-                        case ValueTag.XS_NON_NEGATIVE_INTEGER_TAG:
-                        case ValueTag.XS_UNSIGNED_LONG_TAG:
-                        case ValueTag.XS_POSITIVE_INTEGER_TAG:
-                        case ValueTag.XS_INT_TAG:
-                        case ValueTag.XS_UNSIGNED_INT_TAG:
-                        case ValueTag.XS_SHORT_TAG:
-                        case ValueTag.XS_UNSIGNED_SHORT_TAG:
-                        case ValueTag.XS_BYTE_TAG:
-                        case ValueTag.XS_UNSIGNED_BYTE_TAG:
-                            abvsInteger2.reset();
-                            getIntegerPointable(tp2, tvp2, dOutInteger2);
-                            longp2.set(abvsInteger2.getByteArray(), abvsInteger2.getStartOffset() + 1,
-                                    LongPointable.TYPE_TRAITS.getFixedLength());
+                            booleanResult = aOp.operateFloatInteger(tp1.floatp, longp2);
+                            break;
+
+                        case ValueTag.XS_FLOAT_TAG:
+                            tvp2.getValue(tp2.floatp);
+                            booleanResult = aOp.operateFloatFloat(tp1.floatp, tp2.floatp);
+                            break;
+
+                        case ValueTag.XS_DOUBLE_TAG:
+                            tvp2.getValue(tp2.doublep);
+                            booleanResult = aOp.operateFloatDouble(tp1.floatp, tp2.doublep);
+                            break;
                     }
-                    switch (tid1) {
+                    break;
+
+                case ValueTag.XS_DOUBLE_TAG:
+                    tvp1.getValue(tp1.doublep);
+                    switch (tid2) {
                         case ValueTag.XS_DECIMAL_TAG:
-                            tvp1.getValue(tp1.decp);
-                            switch (tid2) {
-                                case ValueTag.XS_DECIMAL_TAG:
-                                    tvp2.getValue(tp2.decp);
-                                    booleanResult = aOp.operateDecimalDecimal(tp1.decp, tp2.decp);
-                                    break;
-
-                                case ValueTag.XS_INTEGER_TAG:
-                                    booleanResult = aOp.operateDecimalInteger(tp1.decp, longp2);
-                                    break;
-
-                                case ValueTag.XS_FLOAT_TAG:
-                                    tvp2.getValue(tp2.floatp);
-                                    booleanResult = aOp.operateDecimalFloat(tp1.decp, tp2.floatp);
-                                    break;
-
-                                case ValueTag.XS_DOUBLE_TAG:
-                                    tvp2.getValue(tp2.doublep);
-                                    booleanResult = aOp.operateDecimalDouble(tp1.decp, tp2.doublep);
-                                    break;
-                            }
+                            tvp2.getValue(tp2.decp);
+                            booleanResult = aOp.operateDoubleDecimal(tp1.doublep, tp2.decp);
                             break;
 
                         case ValueTag.XS_INTEGER_TAG:
-                            switch (tid2) {
-                                case ValueTag.XS_DECIMAL_TAG:
-                                    tvp2.getValue(tp2.decp);
-                                    booleanResult = aOp.operateIntegerDecimal(longp1, tp2.decp);
-                                    break;
-
-                                case ValueTag.XS_INTEGER_TAG:
-                                    booleanResult = aOp.operateIntegerInteger(longp1, longp2);
-                                    break;
-
-                                case ValueTag.XS_FLOAT_TAG:
-                                    tvp2.getValue(tp2.floatp);
-                                    booleanResult = aOp.operateIntegerFloat(longp1, tp2.floatp);
-                                    break;
-
-                                case ValueTag.XS_DOUBLE_TAG:
-                                    tvp2.getValue(tp2.doublep);
-                                    booleanResult = aOp.operateIntegerDouble(longp1, tp2.doublep);
-                                    break;
-                            }
+                            booleanResult = aOp.operateDoubleInteger(tp1.doublep, longp2);
                             break;
 
                         case ValueTag.XS_FLOAT_TAG:
-                            tvp1.getValue(tp1.floatp);
-                            switch (tid2) {
-                                case ValueTag.XS_DECIMAL_TAG:
-                                    tvp2.getValue(tp2.decp);
-                                    booleanResult = aOp.operateFloatDecimal(tp1.floatp, tp2.decp);
-                                    break;
-
-                                case ValueTag.XS_INTEGER_TAG:
-                                    booleanResult = aOp.operateFloatInteger(tp1.floatp, longp2);
-                                    break;
-
-                                case ValueTag.XS_FLOAT_TAG:
-                                    tvp2.getValue(tp2.floatp);
-                                    booleanResult = aOp.operateFloatFloat(tp1.floatp, tp2.floatp);
-                                    break;
-
-                                case ValueTag.XS_DOUBLE_TAG:
-                                    tvp2.getValue(tp2.doublep);
-                                    booleanResult = aOp.operateFloatDouble(tp1.floatp, tp2.doublep);
-                                    break;
-                            }
+                            tvp2.getValue(tp2.floatp);
+                            booleanResult = aOp.operateDoubleFloat(tp1.doublep, tp2.floatp);
                             break;
 
                         case ValueTag.XS_DOUBLE_TAG:
-                            tvp1.getValue(tp1.doublep);
-                            switch (tid2) {
-                                case ValueTag.XS_DECIMAL_TAG:
-                                    tvp2.getValue(tp2.decp);
-                                    booleanResult = aOp.operateDoubleDecimal(tp1.doublep, tp2.decp);
-                                    break;
-
-                                case ValueTag.XS_INTEGER_TAG:
-                                    booleanResult = aOp.operateDoubleInteger(tp1.doublep, longp2);
-                                    break;
-
-                                case ValueTag.XS_FLOAT_TAG:
-                                    tvp2.getValue(tp2.floatp);
-                                    booleanResult = aOp.operateDoubleFloat(tp1.doublep, tp2.floatp);
-                                    break;
-
-                                case ValueTag.XS_DOUBLE_TAG:
-                                    tvp2.getValue(tp2.doublep);
-                                    booleanResult = aOp.operateDoubleDouble(tp1.doublep, tp2.doublep);
-                                    break;
-                            }
+                            tvp2.getValue(tp2.doublep);
+                            booleanResult = aOp.operateDoubleDouble(tp1.doublep, tp2.doublep);
                             break;
+                    }
+                    break;
 
+                case ValueTag.XS_BOOLEAN_TAG:
+                    tvp1.getValue(tp1.boolp);
+                    switch (tid2) {
                         case ValueTag.XS_BOOLEAN_TAG:
-                            tvp1.getValue(tp1.boolp);
-                            switch (tid2) {
-                                case ValueTag.XS_BOOLEAN_TAG:
-                                    tvp2.getValue(tp2.boolp);
-                                    booleanResult = aOp.operateBooleanBoolean(tp1.boolp, tp2.boolp);
-                                    break;
-                            }
+                            tvp2.getValue(tp2.boolp);
+                            booleanResult = aOp.operateBooleanBoolean(tp1.boolp, tp2.boolp);
                             break;
+                    }
+                    break;
 
+                case ValueTag.XS_STRING_TAG:
+                    tvp1.getValue(tp1.utf8sp);
+                    switch (tid2) {
                         case ValueTag.XS_STRING_TAG:
-                            tvp1.getValue(tp1.utf8sp);
-                            switch (tid2) {
-                                case ValueTag.XS_STRING_TAG:
-                                    tvp2.getValue(tp2.utf8sp);
-                                    booleanResult = aOp.operateStringString(tp1.utf8sp, tp2.utf8sp);
-                                    break;
-                            }
+                            tvp2.getValue(tp2.utf8sp);
+                            booleanResult = aOp.operateStringString(tp1.utf8sp, tp2.utf8sp);
                             break;
+                    }
+                    break;
 
+                case ValueTag.XS_DATE_TAG:
+                    tvp1.getValue(tp1.datep);
+                    switch (tid2) {
                         case ValueTag.XS_DATE_TAG:
-                            tvp1.getValue(tp1.datep);
-                            switch (tid2) {
-                                case ValueTag.XS_DATE_TAG:
-                                    tvp2.getValue(tp2.datep);
-                                    booleanResult = aOp.operateDateDate(tp1.datep, tp2.datep, dCtx);
-                                    break;
-                                default:
-                                    // Cross comparisons between DateTime, Date and Time are not supported.
-                                    throw new SystemException(ErrorCode.XPTY0004);
-                            }
+                            tvp2.getValue(tp2.datep);
+                            booleanResult = aOp.operateDateDate(tp1.datep, tp2.datep, dCtx);
                             break;
+                        default:
+                            // Cross comparisons between DateTime, Date and Time are not supported.
+                            throw new SystemException(ErrorCode.XPTY0004);
+                    }
+                    break;
 
+                case ValueTag.XS_DATETIME_TAG:
+                    tvp1.getValue(tp1.datetimep);
+                    switch (tid2) {
                         case ValueTag.XS_DATETIME_TAG:
-                            tvp1.getValue(tp1.datetimep);
-                            switch (tid2) {
-                                case ValueTag.XS_DATETIME_TAG:
-                                    tvp2.getValue(tp2.datetimep);
-                                    booleanResult = aOp.operateDatetimeDatetime(tp1.datetimep, tp2.datetimep, dCtx);
-                                    break;
-                                default:
-                                    // Cross comparisons between DateTime, Date and Time are not supported.
-                                    throw new SystemException(ErrorCode.XPTY0004);
-                            }
+                            tvp2.getValue(tp2.datetimep);
+                            booleanResult = aOp.operateDatetimeDatetime(tp1.datetimep, tp2.datetimep, dCtx);
                             break;
+                        default:
+                            // Cross comparisons between DateTime, Date and Time are not supported.
+                            throw new SystemException(ErrorCode.XPTY0004);
+                    }
+                    break;
 
+                case ValueTag.XS_TIME_TAG:
+                    tvp1.getValue(tp1.timep);
+                    switch (tid2) {
                         case ValueTag.XS_TIME_TAG:
-                            tvp1.getValue(tp1.timep);
-                            switch (tid2) {
-                                case ValueTag.XS_TIME_TAG:
-                                    tvp2.getValue(tp2.timep);
-                                    booleanResult = aOp.operateTimeTime(tp1.timep, tp2.timep, dCtx);
-                                    break;
-                                default:
-                                    // Cross comparisons between DateTime, Date and Time are not supported.
-                                    throw new SystemException(ErrorCode.XPTY0004);
-                            }
+                            tvp2.getValue(tp2.timep);
+                            booleanResult = aOp.operateTimeTime(tp1.timep, tp2.timep, dCtx);
                             break;
+                        default:
+                            // Cross comparisons between DateTime, Date and Time are not supported.
+                            throw new SystemException(ErrorCode.XPTY0004);
+                    }
+                    break;
 
+                case ValueTag.XS_DURATION_TAG:
+                    tvp1.getValue(tp1.durationp);
+                    switch (tid2) {
+                        case ValueTag.XS_DAY_TIME_DURATION_TAG:
+                            tvp2.getValue(tp2.longp);
+                            booleanResult = aOp.operateDurationDTDuration(tp1.durationp, tp2.longp);
+                            break;
                         case ValueTag.XS_DURATION_TAG:
-                            tvp1.getValue(tp1.durationp);
-                            switch (tid2) {
-                                case ValueTag.XS_DAY_TIME_DURATION_TAG:
-                                    tvp2.getValue(tp2.longp);
-                                    booleanResult = aOp.operateDurationDTDuration(tp1.durationp, tp2.longp);
-                                    break;
-                                case ValueTag.XS_DURATION_TAG:
-                                    tvp2.getValue(tp2.durationp);
-                                    booleanResult = aOp.operateDurationDuration(tp1.durationp, tp2.durationp);
-                                    break;
-                                case ValueTag.XS_YEAR_MONTH_DURATION_TAG:
-                                    tvp2.getValue(tp2.intp);
-                                    booleanResult = aOp.operateDurationYMDuration(tp1.durationp, tp2.intp);
-                                    break;
-                            }
+                            tvp2.getValue(tp2.durationp);
+                            booleanResult = aOp.operateDurationDuration(tp1.durationp, tp2.durationp);
+                            break;
+                        case ValueTag.XS_YEAR_MONTH_DURATION_TAG:
+                            tvp2.getValue(tp2.intp);
+                            booleanResult = aOp.operateDurationYMDuration(tp1.durationp, tp2.intp);
                             break;
+                    }
+                    break;
 
+                case ValueTag.XS_DAY_TIME_DURATION_TAG:
+                    tvp1.getValue(tp1.longp);
+                    switch (tid2) {
                         case ValueTag.XS_DAY_TIME_DURATION_TAG:
-                            tvp1.getValue(tp1.longp);
-                            switch (tid2) {
-                                case ValueTag.XS_DAY_TIME_DURATION_TAG:
-                                    tvp2.getValue(tp2.longp);
-                                    booleanResult = aOp.operateDTDurationDTDuration(tp1.longp, tp2.longp);
-                                    break;
-                                case ValueTag.XS_DURATION_TAG:
-                                    tvp2.getValue(tp2.durationp);
-                                    booleanResult = aOp.operateDTDurationDuration(tp1.longp, tp2.durationp);
-                                    break;
-                                case ValueTag.XS_YEAR_MONTH_DURATION_TAG:
-                                    tvp2.getValue(tp2.intp);
-                                    booleanResult = aOp.operateDTDurationYMDuration(tp1.longp, tp2.intp);
-                                    break;
-                            }
+                            tvp2.getValue(tp2.longp);
+                            booleanResult = aOp.operateDTDurationDTDuration(tp1.longp, tp2.longp);
+                            break;
+                        case ValueTag.XS_DURATION_TAG:
+                            tvp2.getValue(tp2.durationp);
+                            booleanResult = aOp.operateDTDurationDuration(tp1.longp, tp2.durationp);
                             break;
+                        case ValueTag.XS_YEAR_MONTH_DURATION_TAG:
+                            tvp2.getValue(tp2.intp);
+                            booleanResult = aOp.operateDTDurationYMDuration(tp1.longp, tp2.intp);
+                            break;
+                    }
+                    break;
 
+                case ValueTag.XS_YEAR_MONTH_DURATION_TAG:
+                    tvp1.getValue(tp1.intp);
+                    switch (tid2) {
+                        case ValueTag.XS_DAY_TIME_DURATION_TAG:
+                            tvp2.getValue(tp2.longp);
+                            booleanResult = aOp.operateYMDurationDTDuration(tp1.intp, tp2.longp);
+                            break;
+                        case ValueTag.XS_DURATION_TAG:
+                            tvp2.getValue(tp2.durationp);
+                            booleanResult = aOp.operateYMDurationDuration(tp1.intp, tp2.durationp);
+                            break;
                         case ValueTag.XS_YEAR_MONTH_DURATION_TAG:
-                            tvp1.getValue(tp1.intp);
-                            switch (tid2) {
-                                case ValueTag.XS_DAY_TIME_DURATION_TAG:
-                                    tvp2.getValue(tp2.longp);
-                                    booleanResult = aOp.operateYMDurationDTDuration(tp1.intp, tp2.longp);
-                                    break;
-                                case ValueTag.XS_DURATION_TAG:
-                                    tvp2.getValue(tp2.durationp);
-                                    booleanResult = aOp.operateYMDurationDuration(tp1.intp, tp2.durationp);
-                                    break;
-                                case ValueTag.XS_YEAR_MONTH_DURATION_TAG:
-                                    tvp2.getValue(tp2.intp);
-                                    booleanResult = aOp.operateYMDurationYMDuration(tp1.intp, tp2.intp);
-                                    break;
-                            }
+                            tvp2.getValue(tp2.intp);
+                            booleanResult = aOp.operateYMDurationYMDuration(tp1.intp, tp2.intp);
                             break;
+                    }
+                    break;
 
+                case ValueTag.XS_G_DAY_TAG:
+                    tvp1.getValue(tp1.datep);
+                    switch (tid2) {
                         case ValueTag.XS_G_DAY_TAG:
-                            tvp1.getValue(tp1.datep);
-                            switch (tid2) {
-                                case ValueTag.XS_G_DAY_TAG:
-                                    tvp2.getValue(tp2.datep);
-                                    booleanResult = aOp.operateGDayGDay(tp1.datep, tp2.datep, dCtx);
-                                    break;
-                            }
+                            tvp2.getValue(tp2.datep);
+                            booleanResult = aOp.operateGDayGDay(tp1.datep, tp2.datep, dCtx);
                             break;
+                    }
+                    break;
 
+                case ValueTag.XS_G_MONTH_DAY_TAG:
+                    tvp1.getValue(tp1.datep);
+                    switch (tid2) {
                         case ValueTag.XS_G_MONTH_DAY_TAG:
-                            tvp1.getValue(tp1.datep);
-                            switch (tid2) {
-                                case ValueTag.XS_G_MONTH_DAY_TAG:
-                                    tvp2.getValue(tp2.datep);
-                                    booleanResult = aOp.operateGMonthDayGMonthDay(tp1.datep, tp2.datep, dCtx);
-                                    break;
-                            }
+                            tvp2.getValue(tp2.datep);
+                            booleanResult = aOp.operateGMonthDayGMonthDay(tp1.datep, tp2.datep, dCtx);
                             break;
+                    }
+                    break;
 
+                case ValueTag.XS_G_MONTH_TAG:
+                    tvp1.getValue(tp1.datep);
+                    switch (tid2) {
                         case ValueTag.XS_G_MONTH_TAG:
-                            tvp1.getValue(tp1.datep);
-                            switch (tid2) {
-                                case ValueTag.XS_G_MONTH_TAG:
-                                    tvp2.getValue(tp2.datep);
-                                    booleanResult = aOp.operateGMonthGMonth(tp1.datep, tp2.datep, dCtx);
-                                    break;
-                            }
+                            tvp2.getValue(tp2.datep);
+                            booleanResult = aOp.operateGMonthGMonth(tp1.datep, tp2.datep, dCtx);
                             break;
+                    }
+                    break;
 
+                case ValueTag.XS_G_YEAR_MONTH_TAG:
+                    tvp1.getValue(tp1.datep);
+                    switch (tid2) {
                         case ValueTag.XS_G_YEAR_MONTH_TAG:
-                            tvp1.getValue(tp1.datep);
-                            switch (tid2) {
-                                case ValueTag.XS_G_YEAR_MONTH_TAG:
-                                    tvp2.getValue(tp2.datep);
-                                    booleanResult = aOp.operateGYearMonthGYearMonth(tp1.datep, tp2.datep, dCtx);
-                                    break;
-                            }
+                            tvp2.getValue(tp2.datep);
+                            booleanResult = aOp.operateGYearMonthGYearMonth(tp1.datep, tp2.datep, dCtx);
                             break;
+                    }
+                    break;
 
+                case ValueTag.XS_G_YEAR_TAG:
+                    tvp1.getValue(tp1.datep);
+                    switch (tid2) {
                         case ValueTag.XS_G_YEAR_TAG:
-                            tvp1.getValue(tp1.datep);
-                            switch (tid2) {
-                                case ValueTag.XS_G_YEAR_TAG:
-                                    tvp2.getValue(tp2.datep);
-                                    booleanResult = aOp.operateGYearGYear(tp1.datep, tp2.datep, dCtx);
-                                    break;
-                            }
+                            tvp2.getValue(tp2.datep);
+                            booleanResult = aOp.operateGYearGYear(tp1.datep, tp2.datep, dCtx);
                             break;
+                    }
+                    break;
 
+                case ValueTag.XS_HEX_BINARY_TAG:
+                    tvp1.getValue(tp1.binaryp);
+                    switch (tid2) {
                         case ValueTag.XS_HEX_BINARY_TAG:
-                            tvp1.getValue(tp1.binaryp);
-                            switch (tid2) {
-                                case ValueTag.XS_HEX_BINARY_TAG:
-                                    tvp2.getValue(tp2.binaryp);
-                                    booleanResult = aOp.operateHexBinaryHexBinary(tp1.binaryp, tp2.binaryp);
-                                    break;
-                            }
+                            tvp2.getValue(tp2.binaryp);
+                            booleanResult = aOp.operateHexBinaryHexBinary(tp1.binaryp, tp2.binaryp);
                             break;
+                    }
+                    break;
 
+                case ValueTag.XS_BASE64_BINARY_TAG:
+                    tvp1.getValue(tp1.binaryp);
+                    switch (tid2) {
                         case ValueTag.XS_BASE64_BINARY_TAG:
-                            tvp1.getValue(tp1.binaryp);
-                            switch (tid2) {
-                                case ValueTag.XS_BASE64_BINARY_TAG:
-                                    tvp2.getValue(tp2.binaryp);
-                                    booleanResult = aOp.operateBase64BinaryBase64Binary(tp1.binaryp, tp2.binaryp);
-                                    break;
-                            }
+                            tvp2.getValue(tp2.binaryp);
+                            booleanResult = aOp.operateBase64BinaryBase64Binary(tp1.binaryp, tp2.binaryp);
                             break;
+                    }
+                    break;
 
+                case ValueTag.XS_ANY_URI_TAG:
+                    tvp1.getValue(tp1.utf8sp);
+                    switch (tid2) {
                         case ValueTag.XS_ANY_URI_TAG:
-                            tvp1.getValue(tp1.utf8sp);
-                            switch (tid2) {
-                                case ValueTag.XS_ANY_URI_TAG:
-                                    tvp2.getValue(tp2.utf8sp);
-                                    booleanResult = aOp.operateAnyURIAnyURI(tp1.utf8sp, tp2.utf8sp);
-                                    break;
-                            }
+                            tvp2.getValue(tp2.utf8sp);
+                            booleanResult = aOp.operateAnyURIAnyURI(tp1.utf8sp, tp2.utf8sp);
                             break;
+                    }
+                    break;
 
+                case ValueTag.XS_QNAME_TAG:
+                    tvp1.getValue(tp1.qnamep);
+                    switch (tid2) {
                         case ValueTag.XS_QNAME_TAG:
-                            tvp1.getValue(tp1.qnamep);
-                            switch (tid2) {
-                                case ValueTag.XS_QNAME_TAG:
-                                    tvp2.getValue(tp2.qnamep);
-                                    booleanResult = aOp.operateQNameQName(tp1.qnamep, tp2.qnamep);
-                                    break;
-                            }
+                            tvp2.getValue(tp2.qnamep);
+                            booleanResult = aOp.operateQNameQName(tp1.qnamep, tp2.qnamep);
                             break;
+                    }
+                    break;
 
+                case ValueTag.XS_NOTATION_TAG:
+                    tvp1.getValue(tp1.utf8sp);
+                    switch (tid2) {
                         case ValueTag.XS_NOTATION_TAG:
-                            tvp1.getValue(tp1.utf8sp);
-                            switch (tid2) {
-                                case ValueTag.XS_NOTATION_TAG:
-                                    tvp2.getValue(tp2.utf8sp);
-                                    booleanResult = aOp.operateNotationNotation(tp1.utf8sp, tp2.utf8sp);
-                                    break;
-                            }
+                            tvp2.getValue(tp2.utf8sp);
+                            booleanResult = aOp.operateNotationNotation(tp1.utf8sp, tp2.utf8sp);
                             break;
                     }
-
-                    byte[] byteResult = new byte[2];
-                    byteResult[0] = ValueTag.XS_BOOLEAN_TAG;
-                    byteResult[1] = (byte) (booleanResult ? 1 : 0);
-                    result.set(byteResult, 0, 2);
-                } catch (SystemException se) {
-                    throw se;
-                } catch (Exception e) {
-                    throw new SystemException(ErrorCode.SYSE0001, e);
-                }
+                    break;
             }
+            return booleanResult;
 
-            private void getIntegerPointable(TypedPointables tp, TaggedValuePointable tvp, DataOutput dOut)
-                    throws SystemException, IOException {
-                long value;
-                switch (tvp.getTag()) {
-                    case ValueTag.XS_INTEGER_TAG:
-                    case ValueTag.XS_LONG_TAG:
-                    case ValueTag.XS_NEGATIVE_INTEGER_TAG:
-                    case ValueTag.XS_NON_POSITIVE_INTEGER_TAG:
-                    case ValueTag.XS_NON_NEGATIVE_INTEGER_TAG:
-                    case ValueTag.XS_POSITIVE_INTEGER_TAG:
-                    case ValueTag.XS_UNSIGNED_INT_TAG:
-                    case ValueTag.XS_UNSIGNED_LONG_TAG:
-                        tvp.getValue(tp.longp);
-                        value = tp.longp.longValue();
-                        break;
-
-                    case ValueTag.XS_INT_TAG:
-                    case ValueTag.XS_UNSIGNED_SHORT_TAG:
-                        tvp.getValue(tp.intp);
-                        value = tp.intp.longValue();
-                        break;
-
-                    case ValueTag.XS_SHORT_TAG:
-                    case ValueTag.XS_UNSIGNED_BYTE_TAG:
-                        tvp.getValue(tp.shortp);
-                        value = tp.shortp.longValue();
-                        break;
-
-                    case ValueTag.XS_BYTE_TAG:
-                        tvp.getValue(tp.bytep);
-                        value = tp.bytep.longValue();
-                        break;
+        } catch (SystemException se) {
+            throw se;
+        } catch (Exception e) {
+            throw new SystemException(ErrorCode.SYSE0001, e);
+        }
+    }
 
-                    default:
-                        value = 0;
-                }
-                dOut.write(ValueTag.XS_INTEGER_TAG);
-                dOut.writeLong(value);
-            }
+    private static void getIntegerPointable(TypedPointables tp, TaggedValuePointable tvp, DataOutput dOut)
+            throws SystemException, IOException {
+        long value;
+        switch (tvp.getTag()) {
+            case ValueTag.XS_INTEGER_TAG:
+            case ValueTag.XS_LONG_TAG:
+            case ValueTag.XS_NEGATIVE_INTEGER_TAG:
+            case ValueTag.XS_NON_POSITIVE_INTEGER_TAG:
+            case ValueTag.XS_NON_NEGATIVE_INTEGER_TAG:
+            case ValueTag.XS_POSITIVE_INTEGER_TAG:
+            case ValueTag.XS_UNSIGNED_INT_TAG:
+            case ValueTag.XS_UNSIGNED_LONG_TAG:
+                tvp.getValue(tp.longp);
+                value = tp.longp.longValue();
+                break;
+
+            case ValueTag.XS_INT_TAG:
+            case ValueTag.XS_UNSIGNED_SHORT_TAG:
+                tvp.getValue(tp.intp);
+                value = tp.intp.longValue();
+                break;
+
+            case ValueTag.XS_SHORT_TAG:
+            case ValueTag.XS_UNSIGNED_BYTE_TAG:
+                tvp.getValue(tp.shortp);
+                value = tp.shortp.longValue();
+                break;
+
+            case ValueTag.XS_BYTE_TAG:
+                tvp.getValue(tp.bytep);
+                value = tp.bytep.longValue();
+                break;
+
+            default:
+                value = 0;
+        }
+        dOut.write(ValueTag.XS_INTEGER_TAG);
+        dOut.writeLong(value);
+    }
 
-            private int getBaseTypeForComparisons(int tid) throws SystemException {
-                while (true) {
-                    switch (tid) {
-                        case ValueTag.XS_ANY_URI_TAG:
-                        case ValueTag.XS_BASE64_BINARY_TAG:
-                        case ValueTag.XS_BOOLEAN_TAG:
-                        case ValueTag.XS_DATE_TAG:
-                        case ValueTag.XS_DATETIME_TAG:
-                        case ValueTag.XS_DAY_TIME_DURATION_TAG:
-                        case ValueTag.XS_DECIMAL_TAG:
-                        case ValueTag.XS_DOUBLE_TAG:
-                        case ValueTag.XS_DURATION_TAG:
-                        case ValueTag.XS_FLOAT_TAG:
-                        case ValueTag.XS_HEX_BINARY_TAG:
-                        case ValueTag.XS_INTEGER_TAG:
-                        case ValueTag.XS_G_DAY_TAG:
-                        case ValueTag.XS_G_MONTH_DAY_TAG:
-                        case ValueTag.XS_G_MONTH_TAG:
-                        case ValueTag.XS_G_YEAR_MONTH_TAG:
-                        case ValueTag.XS_G_YEAR_TAG:
-                        case ValueTag.XS_QNAME_TAG:
-                        case ValueTag.XS_STRING_TAG:
-                        case ValueTag.XS_TIME_TAG:
-                        case ValueTag.XS_UNTYPED_ATOMIC_TAG:
-                        case ValueTag.XS_YEAR_MONTH_DURATION_TAG:
-                            return tid;
+    private static int getBaseTypeForComparisons(int tid) throws SystemException {
+        while (true) {
+            switch (tid) {
+                case ValueTag.XS_ANY_URI_TAG:
+                case ValueTag.XS_BASE64_BINARY_TAG:
+                case ValueTag.XS_BOOLEAN_TAG:
+                case ValueTag.XS_DATE_TAG:
+                case ValueTag.XS_DATETIME_TAG:
+                case ValueTag.XS_DAY_TIME_DURATION_TAG:
+                case ValueTag.XS_DECIMAL_TAG:
+                case ValueTag.XS_DOUBLE_TAG:
+                case ValueTag.XS_DURATION_TAG:
+                case ValueTag.XS_FLOAT_TAG:
+                case ValueTag.XS_HEX_BINARY_TAG:
+                case ValueTag.XS_INTEGER_TAG:
+                case ValueTag.XS_G_DAY_TAG:
+                case ValueTag.XS_G_MONTH_DAY_TAG:
+                case ValueTag.XS_G_MONTH_TAG:
+                case ValueTag.XS_G_YEAR_MONTH_TAG:
+                case ValueTag.XS_G_YEAR_TAG:
+                case ValueTag.XS_QNAME_TAG:
+                case ValueTag.XS_STRING_TAG:
+                case ValueTag.XS_TIME_TAG:
+                case ValueTag.XS_UNTYPED_ATOMIC_TAG:
+                case ValueTag.XS_YEAR_MONTH_DURATION_TAG:
+                    return tid;
 
-                        case ValueTag.XS_ANY_ATOMIC_TAG:
-                            throw new SystemException(ErrorCode.XPTY0004);
+                case ValueTag.XS_ANY_ATOMIC_TAG:
+                    throw new SystemException(ErrorCode.XPTY0004);
 
-                        default:
-                            tid = BuiltinTypeRegistry.INSTANCE.getSchemaTypeById(tid).getBaseType().getTypeId();
-                    }
-                }
+                default:
+                    tid = BuiltinTypeRegistry.INSTANCE.getSchemaTypeById(tid).getBaseType().getTypeId();
             }
-        };
+        }
     }
 
     private static class TypedPointables {

Added: incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/sequence/FnIndexOfScalarEvaluatorFactory.java
URL: http://svn.apache.org/viewvc/incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/sequence/FnIndexOfScalarEvaluatorFactory.java?rev=1381373&view=auto
==============================================================================
--- incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/sequence/FnIndexOfScalarEvaluatorFactory.java (added)
+++ incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/sequence/FnIndexOfScalarEvaluatorFactory.java Wed Sep  5 21:15:19 2012
@@ -0,0 +1,85 @@
+package org.apache.vxquery.runtime.functions.sequence;
+
+import java.io.DataOutput;
+import java.io.IOException;
+
+import org.apache.vxquery.context.DynamicContext;
+import org.apache.vxquery.datamodel.accessors.SequencePointable;
+import org.apache.vxquery.datamodel.accessors.TaggedValuePointable;
+import org.apache.vxquery.datamodel.builders.sequence.SequenceBuilder;
+import org.apache.vxquery.datamodel.values.ValueTag;
+import org.apache.vxquery.exceptions.ErrorCode;
+import org.apache.vxquery.exceptions.SystemException;
+import org.apache.vxquery.runtime.functions.base.AbstractTaggedValueArgumentScalarEvaluator;
+import org.apache.vxquery.runtime.functions.base.AbstractTaggedValueArgumentScalarEvaluatorFactory;
+import org.apache.vxquery.runtime.functions.comparison.AbstractValueComparisonOperation;
+import org.apache.vxquery.runtime.functions.comparison.AbstractValueComparisonScalarEvaluatorFactory;
+import org.apache.vxquery.runtime.functions.comparison.ValueEqComparisonOperation;
+
+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.api.context.IHyracksTaskContext;
+import edu.uci.ics.hyracks.data.std.api.IPointable;
+import edu.uci.ics.hyracks.data.std.primitive.VoidPointable;
+import edu.uci.ics.hyracks.data.std.util.ArrayBackedValueStorage;
+
+public class FnIndexOfScalarEvaluatorFactory extends AbstractTaggedValueArgumentScalarEvaluatorFactory {
+    private static final long serialVersionUID = 1L;
+
+    public FnIndexOfScalarEvaluatorFactory(IScalarEvaluatorFactory[] args) {
+        super(args);
+    }
+
+    @Override
+    protected IScalarEvaluator createEvaluator(IHyracksTaskContext ctx, IScalarEvaluator[] args)
+            throws AlgebricksException {
+        final ArrayBackedValueStorage abvs = new ArrayBackedValueStorage();
+        final ArrayBackedValueStorage abvsInner = new ArrayBackedValueStorage();
+        final DataOutput dOutInner = abvsInner.getDataOutput();
+        final SequenceBuilder sb = new SequenceBuilder();
+        final SequencePointable seq = new SequencePointable();
+        final DynamicContext dCtx = (DynamicContext) ctx.getJobletContext().getGlobalJobData();
+        final AbstractValueComparisonOperation aOp = new ValueEqComparisonOperation();
+        final TaggedValuePointable tvp = (TaggedValuePointable) TaggedValuePointable.FACTORY.createPointable();
+        final VoidPointable p = (VoidPointable) VoidPointable.FACTORY.createPointable();
+
+        return new AbstractTaggedValueArgumentScalarEvaluator(args) {
+            @Override
+            protected void evaluate(TaggedValuePointable[] args, IPointable result) throws SystemException {
+                try {
+                    abvs.reset();
+                    sb.reset(abvs);
+                    TaggedValuePointable tvp1 = args[0];
+                    TaggedValuePointable tvp2 = args[1];
+
+                    if (tvp1.getTag() == ValueTag.SEQUENCE_TAG) {
+                        tvp1.getValue(seq);
+                        int seqLen = seq.getEntryCount();
+                        for (int j = 0; j < seqLen; ++j) {
+                            seq.getEntry(j, p);
+                            tvp.set(p.getByteArray(), p.getStartOffset(), p.getLength());
+                            if (AbstractValueComparisonScalarEvaluatorFactory.compareTaggedValues(aOp, tvp, tvp2, dCtx)) {
+                                abvsInner.reset();
+                                dOutInner.write(ValueTag.XS_INTEGER_TAG);
+                                dOutInner.writeLong(j + 1);
+                                sb.addItem(abvsInner);
+                            }
+                        }
+                    } else {
+                        if (AbstractValueComparisonScalarEvaluatorFactory.compareTaggedValues(aOp, tvp1, tvp2, dCtx)) {
+                            abvsInner.reset();
+                            dOutInner.write(ValueTag.XS_INTEGER_TAG);
+                            dOutInner.writeLong(1);
+                            sb.addItem(abvsInner);
+                        }
+                    }
+                    sb.finish();
+                    result.set(abvs);
+                } catch (IOException e) {
+                    throw new SystemException(ErrorCode.SYSE0001);
+                }
+            }
+        };
+    }
+}
\ No newline at end of file

Propchange: incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/sequence/FnIndexOfScalarEvaluatorFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/sequence/FnInsertBeforeScalarEvaluatorFactory.java
URL: http://svn.apache.org/viewvc/incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/sequence/FnInsertBeforeScalarEvaluatorFactory.java?rev=1381373&view=auto
==============================================================================
--- incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/sequence/FnInsertBeforeScalarEvaluatorFactory.java (added)
+++ incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/sequence/FnInsertBeforeScalarEvaluatorFactory.java Wed Sep  5 21:15:19 2012
@@ -0,0 +1,106 @@
+package org.apache.vxquery.runtime.functions.sequence;
+
+import java.io.IOException;
+
+import org.apache.vxquery.datamodel.accessors.SequencePointable;
+import org.apache.vxquery.datamodel.accessors.TaggedValuePointable;
+import org.apache.vxquery.datamodel.builders.sequence.SequenceBuilder;
+import org.apache.vxquery.datamodel.values.ValueTag;
+import org.apache.vxquery.exceptions.ErrorCode;
+import org.apache.vxquery.exceptions.SystemException;
+import org.apache.vxquery.runtime.functions.base.AbstractTaggedValueArgumentScalarEvaluator;
+import org.apache.vxquery.runtime.functions.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.api.context.IHyracksTaskContext;
+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.VoidPointable;
+import edu.uci.ics.hyracks.data.std.util.ArrayBackedValueStorage;
+
+public class FnInsertBeforeScalarEvaluatorFactory extends AbstractTaggedValueArgumentScalarEvaluatorFactory {
+    private static final long serialVersionUID = 1L;
+
+    public FnInsertBeforeScalarEvaluatorFactory(IScalarEvaluatorFactory[] args) {
+        super(args);
+    }
+
+    @Override
+    protected IScalarEvaluator createEvaluator(IHyracksTaskContext ctx, IScalarEvaluator[] args)
+            throws AlgebricksException {
+        final ArrayBackedValueStorage abvs = new ArrayBackedValueStorage();
+        final SequenceBuilder sb = new SequenceBuilder();
+        final SequencePointable seq = new SequencePointable();
+        final SequencePointable seq2 = new SequencePointable();
+        final VoidPointable p = (VoidPointable) VoidPointable.FACTORY.createPointable();
+        final LongPointable longp = (LongPointable) LongPointable.FACTORY.createPointable();
+        return new AbstractTaggedValueArgumentScalarEvaluator(args) {
+            @Override
+            protected void evaluate(TaggedValuePointable[] args, IPointable result) throws SystemException {
+                try {
+                    TaggedValuePointable tvp2 = args[1];
+                    if (tvp2.getTag() != ValueTag.XS_INTEGER_TAG) {
+                        throw new SystemException(ErrorCode.FORG0006);
+                    }
+                    tvp2.getValue(longp);
+
+                    abvs.reset();
+                    sb.reset(abvs);
+                    TaggedValuePointable tvp1 = args[0];
+                    TaggedValuePointable tvp3 = args[2];
+                    if (tvp1.getTag() == ValueTag.SEQUENCE_TAG) {
+                        tvp1.getValue(seq);
+                        int seqLen = seq.getEntryCount();
+                        if (longp.getLong() < 1) {
+                            // Add to the beginning.
+                            addArgumentToSequence(tvp3);
+                        }
+                        if (seqLen > 0) {
+                            for (int j = 0; j < seqLen; ++j) {
+                                if (longp.getLong() == j + 1) {
+                                    addArgumentToSequence(tvp3);
+                                }
+                                seq.getEntry(j, p);
+                                sb.addItem(p);
+                            }
+                        }
+                        if (longp.getLong() > seqLen) {
+                            // Add to the end.
+                            addArgumentToSequence(tvp3);
+                        }
+
+                    } else {
+                        if (longp.getLong() <= 1) {
+                            addArgumentToSequence(tvp3);
+                            sb.addItem(tvp1);
+                        } else {
+                            sb.addItem(tvp1);
+                            addArgumentToSequence(tvp3);
+                        }
+                    }
+                    sb.finish();
+                    result.set(abvs);
+                } catch (IOException e) {
+                    throw new SystemException(ErrorCode.SYSE0001);
+                }
+            }
+
+            private void addArgumentToSequence(TaggedValuePointable tvp) throws IOException {
+                if (tvp.getTag() == ValueTag.SEQUENCE_TAG) {
+                    tvp.getValue(seq2);
+                    int seqLen = seq2.getEntryCount();
+                    if (seqLen > 0) {
+                        for (int j = 0; j < seqLen; ++j) {
+                            seq2.getEntry(j, p);
+                            sb.addItem(p);
+                        }
+                    }
+                } else {
+                    sb.addItem(tvp);
+                }
+            }
+        };
+    }
+}
\ No newline at end of file

Propchange: incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/sequence/FnInsertBeforeScalarEvaluatorFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native