public String query(String query) { try { if (index == null) { index = (WebIndex) Index.load(new URL(getCodeBase(), "index.db")); if (index == null) return "<h4>Unable to load index.db</h4>"; engine = new WebQueryEngine(); engine.useWebIndex(index); } Collection<URL> c = engine.query(query); if (c == null) return "<h4>There was an error in the query engine.</h4>"; StringBuffer result = new StringBuffer(); result.append("Results:<br>"); for (URL url : c) { result.append( "<a href=\"" + url + "\" onClick=\"parent.location='" + url + "'\">" + url + "</a><br>"); } return result.toString(); } catch (Throwable e) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); PrintStream ps = new PrintStream(baos); ps.println("An error occured in Java code:<br/>"); ps.println("<pre>"); e.printStackTrace(ps); ps.println("</pre>"); return baos.toString(); } }
@Test public void testEvictBase() throws IOException { int size = mSize; boolean autoLoad = mAutoLoad; Index ix = mDb.openIndex("test"); int initialRecordCount = 100_000 * (1024 / size); for (int i = 0; i < initialRecordCount; i++) { String key = textOfLength(i, 'k', size); String val = textOfLength(i, 'v', size); ix.store(null, key.getBytes(), val.getBytes()); } // basic eviction TestEvictionFilter evictionFilter = new TestEvictionFilter(); long evicted = ix.evict(null, null, null, evictionFilter, autoLoad); int recordCount = initialRecordCount - evictionFilter.mKeys.size(); long keyValueSize = 0; for (int i = 0; i < evictionFilter.mKeys.size(); ++i) { keyValueSize += evictionFilter.mKeys.get(i).length + evictionFilter.mValues.get(i).length; } assertEquals( evicted, autoLoad ? keyValueSize : keyValueSize * 2); // if autoload is not enabled, only keys are load assertEquals(recordCount, ix.count(null, null)); for (byte[] key : evictionFilter.mKeys) { assertNull(ix.load(null, key)); } assertTrue(evictionFilter.mKeys.size() >= 1); assertTrue(evictionFilter.mKeys.size() <= 1024 / size); // empty range evictionFilter = new TestEvictionFilter(); assertEquals(0, ix.evict(null, "a".getBytes(), "b".getBytes(), evictionFilter, autoLoad)); assertEquals(recordCount, ix.count(null, null)); assertEquals(0, evictionFilter.mKeys.size()); assertEquals(0, evictionFilter.mValues.size()); // evict nodes in a particular range evictionFilter = new TestEvictionFilter(); ix.newCursor(null).find("a".getBytes()); // loads rightmost nodes at all levels into cache assertEquals( size * 2, ix.evict(null, "009998".getBytes(), "009999".getBytes(), evictionFilter, autoLoad)); assertEquals(1, evictionFilter.mKeys.size()); assertEquals(1, evictionFilter.mValues.size()); assertTrue(new String(evictionFilter.mKeys.get(0)).startsWith("009998")); if (autoLoad) { assertTrue(new String(evictionFilter.mValues.get(0)).startsWith("009998")); } else { assertTrue(evictionFilter.mValues.get(0) == Cursor.NOT_LOADED); } assertEquals(--recordCount, ix.count(null, null)); // ghost records evictionFilter = new TestEvictionFilter(); Transaction txn = mDb.newTransaction(); int lowKey = initialRecordCount - 11; int highKey = initialRecordCount - 20; for (int i = lowKey; i <= highKey; i++) { String key = textOfLength(i, 'k', size); ix.delete(txn, key.getBytes()); } assertEquals( 0, ix.evict( null, String.valueOf(lowKey).getBytes(), String.valueOf(highKey).getBytes(), evictionFilter, autoLoad)); assertEquals(0, evictionFilter.mKeys.size()); assertEquals(0, evictionFilter.mValues.size()); txn.reset(); VerificationObserver observer = new VerificationObserver(); ix.verify(observer); assertFalse(observer.failed); }