From: <bra...@us...> - 2009-12-09 06:48:35
|
Revision: 2937 http://archive-access.svn.sourceforge.net/archive-access/?rev=2937&view=rev Author: bradtofel Date: 2009-12-09 06:48:28 +0000 (Wed, 09 Dec 2009) Log Message: ----------- FEATURE: added method to allow searching for greatest line <= search term Modified Paths: -------------- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/flatfile/FlatFile.java Modified: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/flatfile/FlatFile.java =================================================================== --- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/flatfile/FlatFile.java 2009-12-09 06:47:35 UTC (rev 2936) +++ trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/flatfile/FlatFile.java 2009-12-09 06:48:28 UTC (rev 2937) @@ -126,6 +126,39 @@ fh.seek(min); return min; } + public long findKeyOffsetLT(RandomAccessFile fh, String key) throws IOException { + int blockSize = 8192; + long fileSize = fh.length(); + long min = 0; + long max = (long) fileSize / blockSize; + long mid; + String line; + while (max - min > 1) { + mid = min + (long)((max - min) / 2); + fh.seek(mid * blockSize); + if(mid > 0) line = fh.readLine(); // probably a partial line + line = fh.readLine(); + if (key.compareTo(line) > 0) { + min = mid; + } else { + max = mid; + } + } + // find the right line + min = min * blockSize; + fh.seek(min); + if(min > 0) line = fh.readLine(); + long last = min; + while(true) { + min = fh.getFilePointer(); + line = fh.readLine(); + if(line == null) break; + if(line.compareTo(key) >= 0) break; + last = min; + } + fh.seek(last); + return last; + } /** * @return Returns the lastMatchOffset. */ @@ -157,6 +190,16 @@ return itr; } + public Iterator<String> getRecordIteratorLT(final String prefix) throws IOException { + RecordIterator itr = null; + RandomAccessFile raf = new RandomAccessFile(file,"r"); + long offset = findKeyOffsetLT(raf,prefix); + lastMatchOffset = offset; + BufferedReader br = new BufferedReader(new FileReader(raf.getFD())); + itr = new RecordIterator(br); + return itr; + } + /** * * @param prefix This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |