Skip to content

Commit

Permalink
[MOD] XQuery, file:read-text-lines. Faster evaluation
Browse files Browse the repository at this point in the history
  • Loading branch information
ChristianGruen committed Jul 18, 2017
1 parent 776787d commit a3a2107
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 13 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import org.basex.query.*;
import org.basex.query.func.fn.*;
import org.basex.query.iter.*;
import org.basex.query.value.*;

/**
* Function implementation.
Expand All @@ -14,6 +15,12 @@ public final class FileReadTextLines extends FileRead {
@Override
public Iter iter(final QueryContext qc) throws QueryException {
checkCreate(qc);
return Parse.textIter(text(qc).string(info));
return Parse.lineIter(text(qc).string(info));
}

@Override
public Value value(final QueryContext qc) throws QueryException {
checkCreate(qc);
return Parse.lines(text(qc).string(info));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,13 @@ public final class FnUnparsedTextLines extends Parse {
@Override
public Iter iter(final QueryContext qc) throws QueryException {
final Item it = unparsedText(qc, false, true);
return it == null ? Empty.ITER : textIter(it.string(info));
return it == null ? Empty.ITER : lineIter(it.string(info));
}

@Override
public Value value(final QueryContext qc) throws QueryException {
return iter(qc).value(qc);
final Item it = unparsedText(qc, false, true);
return it == null ? Empty.SEQ : lines(it.string(info));
}

@Override
Expand Down
61 changes: 51 additions & 10 deletions basex-core/src/main/java/org/basex/query/func/fn/Parse.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import static org.basex.util.Token.*;

import java.io.*;
import java.util.*;

import org.basex.build.*;
import org.basex.build.xml.*;
Expand All @@ -13,9 +14,12 @@
import org.basex.query.*;
import org.basex.query.func.*;
import org.basex.query.iter.*;
import org.basex.query.value.*;
import org.basex.query.value.item.*;
import org.basex.query.value.node.*;
import org.basex.query.value.seq.*;
import org.basex.util.*;
import org.basex.util.list.*;

/**
* Parse functions.
Expand Down Expand Up @@ -111,27 +115,64 @@ ANode parseXml(final QueryContext qc, final boolean frag) throws QueryException
}

/**
* Returns the specified text as lines.
* @param str text input
* @return result
* Returns a line iterator for the specified text.
* @param string text string
* @return iterator
*/
public static Iter lineIter(final byte[] string) {
return new Iter() {
final Iterator<byte[]> iter = iter(string);
@Override
public Str next() {
return iter.hasNext() ? Str.get(iter.next()) : null;
}
};
}

/**
* Returns all line of the specified text.
* @param string text string
* @return text lines
*/
public static Value lines(final byte[] string) {
final TokenList tl = new TokenList();
final Iterator<byte[]> iter = iter(string);
while(iter.hasNext()) tl.add(iter.next());
return StrSeq.get(tl);
}


/**
* Returns an iterator for the lines of the specified text.
* @param string text string
* @return line iterator
*/
public static Iter textIter(final byte[] str) {
private static Iterator<byte[]> iter(final byte[] string) {
final TokenBuilder tb = new TokenBuilder();
final ArrayInput ai = new ArrayInput(string);
try {
final NewlineInput nli = new NewlineInput(new ArrayInput(str));
final TokenBuilder tb = new TokenBuilder();
return new Iter() {
final NewlineInput nli = new NewlineInput(ai);
return new Iterator<byte[]>() {
@Override
public Item next() {
public boolean hasNext() {
try {
return nli.readLine(tb) ? Str.get(tb.toArray()) : null;
return nli.readLine(tb);
} catch(final IOException ex) {
// no I/O exception expected, as input is a main-memory array
throw Util.notExpected(ex);
}
}
@Override
public byte[] next() {
return tb.toArray();
}
@Override
public void remove() {
throw Util.notExpected();
}
};
} catch(final IOException ex) {
throw Util.notExpected(ex);
}
}

}

0 comments on commit a3a2107

Please sign in to comment.