X-Git-Url: https://git.mdrn.pl/pylucene.git/blobdiff_plain/a2e61f0c04805cfcb8706176758d1283c7e3a55c..aaeed5504b982cf3545252ab528713250aa33eed:/lucene-java-3.5.0/lucene/src/java/org/apache/lucene/util/fst/BytesRefFSTEnum.java diff --git a/lucene-java-3.5.0/lucene/src/java/org/apache/lucene/util/fst/BytesRefFSTEnum.java b/lucene-java-3.5.0/lucene/src/java/org/apache/lucene/util/fst/BytesRefFSTEnum.java new file mode 100644 index 0000000..9a192ed --- /dev/null +++ b/lucene-java-3.5.0/lucene/src/java/org/apache/lucene/util/fst/BytesRefFSTEnum.java @@ -0,0 +1,108 @@ +package org.apache.lucene.util.fst; + +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import java.io.IOException; + +import org.apache.lucene.util.BytesRef; + +/** Can next() and advance() through the terms in an FST + * + * @lucene.experimental +*/ + +public final class BytesRefFSTEnum extends FSTEnum { + private final BytesRef current = new BytesRef(10); + private final InputOutput result = new InputOutput(); + private BytesRef target; + + public static class InputOutput { + public BytesRef input; + public T output; + } + + /** doFloor controls the behavior of advance: if it's true + * doFloor is true, advance positions to the biggest + * term before target. */ + public BytesRefFSTEnum(FST fst) { + super(fst); + result.input = current; + current.offset = 1; + } + + public InputOutput current() { + return result; + } + + public InputOutput next() throws IOException { + //System.out.println(" enum.next"); + doNext(); + return setResult(); + } + + /** Seeks to smallest term that's >= target. */ + public InputOutput seekCeil(BytesRef target) throws IOException { + this.target = target; + targetLength = target.length; + super.doSeekCeil(); + return setResult(); + } + + /** Seeks to biggest term that's <= target. */ + public InputOutput seekFloor(BytesRef target) throws IOException { + this.target = target; + targetLength = target.length; + super.doSeekFloor(); + return setResult(); + } + + @Override + protected int getTargetLabel() { + if (upto-1 == target.length) { + return FST.END_LABEL; + } else { + return target.bytes[target.offset + upto - 1] & 0xFF; + } + } + + @Override + protected int getCurrentLabel() { + // current.offset fixed at 1 + return current.bytes[upto] & 0xFF; + } + + @Override + protected void setCurrentLabel(int label) { + current.bytes[upto] = (byte) label; + } + + @Override + protected void grow() { + current.grow(upto+1); + } + + private InputOutput setResult() { + if (upto == 0) { + return null; + } else { + current.length = upto-1; + result.output = output[upto]; + return result; + } + } +}