From: Pierrick B. <br...@us...> - 2006-01-04 18:14:08
|
Update of /cvsroot/exist/eXist-1.0/src/org/exist/xquery In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv16149/src/org/exist/xquery Modified Files: GeneralComparison.java Predicate.java Log Message: Fixed an important bug when computing position() in a predicate. Don't know if it is the most effective way to solve it, but it seems to work. Added some tests to avoid any future regression on this topic. Index: Predicate.java =================================================================== RCS file: /cvsroot/exist/eXist-1.0/src/org/exist/xquery/Predicate.java,v retrieving revision 1.33 retrieving revision 1.34 diff -C2 -d -r1.33 -r1.34 *** Predicate.java 30 Dec 2005 20:07:18 -0000 1.33 --- Predicate.java 4 Jan 2006 18:13:58 -0000 1.34 *************** *** 118,123 **** else { // just to be sure: change mode to boolean if the predicate expression returns a number ! //TODO : the code, likely correct, seems to implement the exact contrary ! if(Type.subTypeOf(inner.returnsType(), Type.NUMBER) && executionMode == BOOLEAN) { executionMode = POSITIONAL; } --- 118,123 ---- else { // just to be sure: change mode to boolean if the predicate expression returns a number ! //TODO : the code, likely to be correct, implements the exact contrary ! if (Type.subTypeOf(inner.returnsType(), Type.NUMBER) && executionMode == BOOLEAN) { executionMode = POSITIONAL; } *************** *** 162,171 **** Sequence result = new ValueSequence(); int p = 0; ! //TODO : as such the following expression is useless : do we have a 0 or 1 based sequence ? ! context.setContextPosition(0); ! for(SequenceIterator i = contextSequence.iterate(); i.hasNext(); p++) { Item item = i.nextItem(); ! context.setContextPosition(p); ! Sequence innerSeq = inner.eval(contextSequence, item); if(innerSeq.effectiveBooleanValue()) result.add(item); --- 162,170 ---- Sequence result = new ValueSequence(); int p = 0; ! for (SequenceIterator i = contextSequence.iterate(); i.hasNext(); p++) { Item item = i.nextItem(); ! context.setContextPosition(p); ! Sequence innerSeq; ! innerSeq = inner.eval(contextSequence, item); if(innerSeq.effectiveBooleanValue()) result.add(item); Index: GeneralComparison.java =================================================================== RCS file: /cvsroot/exist/eXist-1.0/src/org/exist/xquery/GeneralComparison.java,v retrieving revision 1.52 retrieving revision 1.53 diff -C2 -d -r1.52 -r1.53 *** GeneralComparison.java 30 Dec 2005 20:07:18 -0000 1.52 --- GeneralComparison.java 4 Jan 2006 18:13:58 -0000 1.53 *************** *** 36,44 **** import org.exist.storage.IndexSpec; import org.exist.storage.Indexable; - import org.exist.storage.NativeTextEngine; - import org.exist.storage.analysis.SimpleTokenizer; - import org.exist.storage.analysis.TextToken; - import org.exist.storage.serializers.Serializer; - import org.exist.xquery.functions.ExtFulltext; import org.exist.xquery.util.ExpressionDumper; import org.exist.xquery.value.AtomicValue; --- 36,39 ---- *************** *** 47,51 **** import org.exist.xquery.value.Sequence; import org.exist.xquery.value.SequenceIterator; - import org.exist.xquery.value.StringValue; import org.exist.xquery.value.Type; --- 42,45 ---- *************** *** 181,188 **** context.getProfiler().message(this, Profiler.START_SEQUENCES, "CONTEXT ITEM", contextItem.toSequence()); } ! ! if(contextItem != null) ! contextSequence = contextItem.toSequence(); ! Sequence result = null; /* --- 175,179 ---- context.getProfiler().message(this, Profiler.START_SEQUENCES, "CONTEXT ITEM", contextItem.toSequence()); } ! Sequence result = null; /* *************** *** 193,199 **** */ if (inPredicate) ! { ! if((getDependencies() & Dependency.CONTEXT_ITEM) == 0 && Type.subTypeOf(getLeft().returnsType(), Type.NODE)) ! { /* * TODO quickNodeSetCompare() is NOT being called for xqueries like - --- 184,194 ---- */ if (inPredicate) ! { ! if (!(Dependency.dependsOn(getDependencies(), Dependency.CONTEXT_ITEM))&& ! Type.subTypeOf(getLeft().returnsType(), Type.NODE)) { ! ! if(contextItem != null) ! contextSequence = contextItem.toSequence(); ! /* * TODO quickNodeSetCompare() is NOT being called for xqueries like - *************** *** 219,223 **** result = nodeSetCompare(contextSequence); } ! } } --- 214,218 ---- result = nodeSetCompare(contextSequence); } ! } } |