Merge "[Refactor] Add DictDecoder.getTerminalPosition."

main
Ken Wakasa 2013-08-26 07:44:41 +00:00 committed by Android (Google) Code Review
commit 918336b7e7
7 changed files with 35 additions and 18 deletions

View File

@ -323,7 +323,7 @@ public final class BinaryDictDecoderUtils {
/** /**
* Reads and returns the PtNode count out of a buffer and forwards the pointer. * Reads and returns the PtNode count out of a buffer and forwards the pointer.
*/ */
public static int readPtNodeCount(final DictBuffer dictBuffer) { /* package */ static int readPtNodeCount(final DictBuffer dictBuffer) {
final int msb = dictBuffer.readUnsignedByte(); final int msb = dictBuffer.readUnsignedByte();
if (FormatSpec.MAX_PTNODES_FOR_ONE_BYTE_PTNODE_COUNT >= msb) { if (FormatSpec.MAX_PTNODES_FOR_ONE_BYTE_PTNODE_COUNT >= msb) {
return msb; return msb;

View File

@ -169,7 +169,7 @@ public final class BinaryDictIOUtils {
* @throws UnsupportedFormatException if the format of the file is not recognized. * @throws UnsupportedFormatException if the format of the file is not recognized.
*/ */
@UsedForTesting @UsedForTesting
public static int getTerminalPosition(final Ver3DictDecoder dictDecoder, /* package */ static int getTerminalPosition(final Ver3DictDecoder dictDecoder,
final String word) throws IOException, UnsupportedFormatException { final String word) throws IOException, UnsupportedFormatException {
final DictBuffer dictBuffer = dictDecoder.getDictBuffer(); final DictBuffer dictBuffer = dictDecoder.getDictBuffer();
if (word == null) return FormatSpec.NOT_VALID_WORD; if (word == null) return FormatSpec.NOT_VALID_WORD;

View File

@ -58,6 +58,19 @@ public interface DictDecoder {
public FusionDictionary readDictionaryBinary(final FusionDictionary dict) public FusionDictionary readDictionaryBinary(final FusionDictionary dict)
throws FileNotFoundException, IOException, UnsupportedFormatException; throws FileNotFoundException, IOException, UnsupportedFormatException;
/**
* Gets the address of the last PtNode of the exact matching word in the dictionary.
* If no match is found, returns NOT_VALID_WORD.
*
* @param word the word we search for.
* @return the address of the terminal node.
* @throws IOException if the file can't be read.
* @throws UnsupportedFormatException if the format of the file is not recognized.
*/
@UsedForTesting
public int getTerminalPosition(final String word)
throws IOException, UnsupportedFormatException;
// Flags for DictionaryBufferFactory. // Flags for DictionaryBufferFactory.
public static final int USE_READONLY_BYTEBUFFER = 0x01000000; public static final int USE_READONLY_BYTEBUFFER = 0x01000000;
public static final int USE_BYTEARRAY = 0x02000000; public static final int USE_BYTEARRAY = 0x02000000;

View File

@ -60,7 +60,7 @@ public final class DynamicBinaryDictIOUtils {
final DictBuffer dictBuffer = dictDecoder.getDictBuffer(); final DictBuffer dictBuffer = dictDecoder.getDictBuffer();
dictBuffer.position(0); dictBuffer.position(0);
final FileHeader header = dictDecoder.readHeader(); final FileHeader header = dictDecoder.readHeader();
final int wordPosition = BinaryDictIOUtils.getTerminalPosition(dictDecoder, word); final int wordPosition = dictDecoder.getTerminalPosition(word);
if (wordPosition == FormatSpec.NOT_VALID_WORD) return; if (wordPosition == FormatSpec.NOT_VALID_WORD) return;
dictBuffer.position(wordPosition); dictBuffer.position(wordPosition);
@ -263,7 +263,7 @@ public final class DynamicBinaryDictIOUtils {
final DictBuffer dictBuffer = dictDecoder.getDictBuffer(); final DictBuffer dictBuffer = dictDecoder.getDictBuffer();
if (bigramStrings != null) { if (bigramStrings != null) {
for (final WeightedString bigram : bigramStrings) { for (final WeightedString bigram : bigramStrings) {
int position = BinaryDictIOUtils.getTerminalPosition(dictDecoder, bigram.mWord); int position = dictDecoder.getTerminalPosition(bigram.mWord);
if (position == FormatSpec.NOT_VALID_WORD) { if (position == FormatSpec.NOT_VALID_WORD) {
// TODO: figure out what is the correct thing to do here. // TODO: figure out what is the correct thing to do here.
} else { } else {

View File

@ -309,4 +309,12 @@ public class Ver3DictDecoder implements DictDecoder {
} }
return BinaryDictDecoderUtils.readDictionaryBinary(this, dict); return BinaryDictDecoderUtils.readDictionaryBinary(this, dict);
} }
@Override
public int getTerminalPosition(String word) throws IOException, UnsupportedFormatException {
if (mDictBuffer == null) {
openDictBuffer();
}
return BinaryDictIOUtils.getTerminalPosition(this, word);
}
} }

View File

@ -555,7 +555,7 @@ public class BinaryDictDecoderEncoderTests extends AndroidTestCase {
int position = -1; int position = -1;
try { try {
final long now = System.nanoTime(); final long now = System.nanoTime();
position = BinaryDictIOUtils.getTerminalPosition(dictDecoder, word); position = dictDecoder.getTerminalPosition(word);
diff = System.nanoTime() - now; diff = System.nanoTime() - now;
} catch (IOException e) { } catch (IOException e) {
Log.e(TAG, "IOException while getTerminalPosition", e); Log.e(TAG, "IOException while getTerminalPosition", e);
@ -596,16 +596,13 @@ public class BinaryDictDecoderEncoderTests extends AndroidTestCase {
try { try {
// too long word // too long word
final String longWord = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz"; final String longWord = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz";
assertEquals(FormatSpec.NOT_VALID_WORD, assertEquals(FormatSpec.NOT_VALID_WORD, dictDecoder.getTerminalPosition(longWord));
BinaryDictIOUtils.getTerminalPosition(dictDecoder, longWord));
// null // null
assertEquals(FormatSpec.NOT_VALID_WORD, assertEquals(FormatSpec.NOT_VALID_WORD, dictDecoder.getTerminalPosition(null));
BinaryDictIOUtils.getTerminalPosition(dictDecoder, null));
// empty string // empty string
assertEquals(FormatSpec.NOT_VALID_WORD, assertEquals(FormatSpec.NOT_VALID_WORD, dictDecoder.getTerminalPosition(""));
BinaryDictIOUtils.getTerminalPosition(dictDecoder, ""));
} catch (IOException e) { } catch (IOException e) {
} catch (UnsupportedFormatException e) { } catch (UnsupportedFormatException e) {
} }
@ -655,16 +652,16 @@ public class BinaryDictDecoderEncoderTests extends AndroidTestCase {
try { try {
MoreAsserts.assertNotEqual(FormatSpec.NOT_VALID_WORD, MoreAsserts.assertNotEqual(FormatSpec.NOT_VALID_WORD,
BinaryDictIOUtils.getTerminalPosition(dictDecoder, sWords.get(0))); dictDecoder.getTerminalPosition(sWords.get(0)));
DynamicBinaryDictIOUtils.deleteWord(dictDecoder, sWords.get(0)); DynamicBinaryDictIOUtils.deleteWord(dictDecoder, sWords.get(0));
assertEquals(FormatSpec.NOT_VALID_WORD, assertEquals(FormatSpec.NOT_VALID_WORD,
BinaryDictIOUtils.getTerminalPosition(dictDecoder, sWords.get(0))); dictDecoder.getTerminalPosition(sWords.get(0)));
MoreAsserts.assertNotEqual(FormatSpec.NOT_VALID_WORD, MoreAsserts.assertNotEqual(FormatSpec.NOT_VALID_WORD,
BinaryDictIOUtils.getTerminalPosition(dictDecoder, sWords.get(5))); dictDecoder.getTerminalPosition(sWords.get(5)));
DynamicBinaryDictIOUtils.deleteWord(dictDecoder, sWords.get(5)); DynamicBinaryDictIOUtils.deleteWord(dictDecoder, sWords.get(5));
assertEquals(FormatSpec.NOT_VALID_WORD, assertEquals(FormatSpec.NOT_VALID_WORD,
BinaryDictIOUtils.getTerminalPosition(dictDecoder, sWords.get(5))); dictDecoder.getTerminalPosition(sWords.get(5)));
} catch (IOException e) { } catch (IOException e) {
} catch (UnsupportedFormatException e) { } catch (UnsupportedFormatException e) {
} }

View File

@ -142,8 +142,7 @@ public class BinaryDictIOUtilsTests extends AndroidTestCase {
try { try {
final Ver3DictDecoder dictDecoder = new Ver3DictDecoder(file); final Ver3DictDecoder dictDecoder = new Ver3DictDecoder(file);
dictDecoder.openDictBuffer(); position = dictDecoder.getTerminalPosition(word);
position = BinaryDictIOUtils.getTerminalPosition(dictDecoder, word);
} catch (IOException e) { } catch (IOException e) {
} catch (UnsupportedFormatException e) { } catch (UnsupportedFormatException e) {
} }
@ -161,7 +160,7 @@ public class BinaryDictIOUtilsTests extends AndroidTestCase {
*/ */
private static PtNodeInfo findWordByBinaryDictReader(final Ver3DictDecoder dictDecoder, private static PtNodeInfo findWordByBinaryDictReader(final Ver3DictDecoder dictDecoder,
final String word) throws IOException, UnsupportedFormatException { final String word) throws IOException, UnsupportedFormatException {
int position = BinaryDictIOUtils.getTerminalPosition(dictDecoder, word); int position = dictDecoder.getTerminalPosition(word);
final DictBuffer dictBuffer = dictDecoder.getDictBuffer(); final DictBuffer dictBuffer = dictDecoder.getDictBuffer();
if (position != FormatSpec.NOT_VALID_WORD) { if (position != FormatSpec.NOT_VALID_WORD) {
dictBuffer.position(0); dictBuffer.position(0);