| 
      
      
      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.
 |