@Test public void testDescendingIntAscendingKeyIndex() throws Exception { final String INDEX_NAME = "descendingIntAscendingKey"; IndexManager indexManager = new IndexManager(TEST_UTIL.getConfiguration()); IndexDefinition indexDef = new IndexDefinition(INDEX_NAME, INDEX_NAME); IntegerIndexFieldDefinition fieldDef = indexDef.addIntegerField("field1"); fieldDef.setOrder(Order.DESCENDING); indexManager.createIndex(indexDef); Index index = indexManager.getIndex(INDEX_NAME, INDEX_NAME); Integer[] values = {1, 1, 2, 2}; for (int i = 0; i < values.length; i++) { IndexEntry entry = new IndexEntry(); entry.addField("field1", values[i]); index.addEntry(entry, Bytes.toBytes("key" + (i + 1))); } // The index on the value is descending, the identifiers themselves are ascending! Query query = new Query(); query.setRangeCondition("field1", 2, 1); QueryResult result = index.performQuery(query); assertResultIds(result, "key3", "key4", "key1", "key2"); }
@Test public void testDataTypeChecks() throws Exception { final String INDEX_NAME = "dataTypeChecks"; IndexManager indexManager = new IndexManager(TEST_UTIL.getConfiguration()); IndexDefinition indexDef = new IndexDefinition(INDEX_NAME, INDEX_NAME); indexDef.addStringField("field1"); indexDef.addIntegerField("field2"); indexManager.createIndex(indexDef); Index index = indexManager.getIndex(INDEX_NAME, INDEX_NAME); // // Index entry checks // // First test correct situation IndexEntry entry = new IndexEntry(); entry.addField("field1", "a"); index.addEntry(entry, Bytes.toBytes("1")); // Now test incorrect situation entry = new IndexEntry(); entry.addField("field1", 55); try { index.addEntry(entry, Bytes.toBytes("1")); fail("Expected exception."); } catch (MalformedIndexEntryException e) { // System.out.println(e.getMessage()); } // // Query checks // // First test correct situation Query query = new Query(); query.addEqualsCondition("field1", "a"); index.performQuery(query); // Now test incorrect situation query = new Query(); query.addEqualsCondition("field1", 55); try { index.performQuery(query); fail("Expected exception."); } catch (MalformedQueryException e) { // System.out.println(e.getMessage()); } }
@Test public void testExclusiveRanges() throws Exception { final String INDEX_NAME = "exclusiveRanges"; IndexManager indexManager = new IndexManager(TEST_UTIL.getConfiguration()); IndexDefinition indexDef = new IndexDefinition(INDEX_NAME, INDEX_NAME); indexDef.addIntegerField("field1"); indexManager.createIndex(indexDef); Index index = indexManager.getIndex(INDEX_NAME, INDEX_NAME); int[] values = {1, 2, 3, 4}; for (int value : values) { IndexEntry entry = new IndexEntry(); entry.addField("field1", value); index.addEntry(entry, Bytes.toBytes("key" + value)); } { Query query = new Query(); query.setRangeCondition("field1", 1, 4); QueryResult result = index.performQuery(query); assertResultIds(result, "key1", "key2", "key3", "key4"); } { Query query = new Query(); query.setRangeCondition("field1", 1, 4, false, false); QueryResult result = index.performQuery(query); assertResultIds(result, "key2", "key3"); } { Query query = new Query(); query.setRangeCondition("field1", 1, 4, false, true); QueryResult result = index.performQuery(query); assertResultIds(result, "key2", "key3", "key4"); } { Query query = new Query(); query.setRangeCondition("field1", 1, 4, true, false); QueryResult result = index.performQuery(query); assertResultIds(result, "key1", "key2", "key3"); } }
@Test public void testMinMaxRanges() throws Exception { final String INDEX_NAME = "minmaxranges"; IndexManager indexManager = new IndexManager(TEST_UTIL.getConfiguration()); IndexDefinition indexDef = new IndexDefinition(INDEX_NAME, INDEX_NAME); indexDef.addIntegerField("field1"); indexManager.createIndex(indexDef); Index index = indexManager.getIndex(INDEX_NAME, INDEX_NAME); Integer[] values = {Integer.MIN_VALUE, 1, 2, Integer.MAX_VALUE, null}; for (int i = 0; i < values.length; i++) { IndexEntry entry = new IndexEntry(); entry.addField("field1", values[i]); index.addEntry(entry, Bytes.toBytes("key" + (i + 1))); } { Query query = new Query(); query.setRangeCondition("field1", Query.MIN_VALUE, Query.MAX_VALUE); QueryResult result = index.performQuery(query); assertResultIds(result, "key1", "key2", "key3", "key4", "key5"); } { Query query = new Query(); query.setRangeCondition("field1", Query.MIN_VALUE, 0); QueryResult result = index.performQuery(query); assertResultIds(result, "key1"); } { Query query = new Query(); query.setRangeCondition("field1", 0, Query.MAX_VALUE); QueryResult result = index.performQuery(query); assertResultIds(result, "key2", "key3", "key4", "key5"); } }
@Test public void testMultiFieldIndex() throws Exception { final String INDEX_NAME = "multiField"; IndexManager indexManager = new IndexManager(TEST_UTIL.getConfiguration()); IndexDefinition indexDef = new IndexDefinition(INDEX_NAME, INDEX_NAME); indexDef.addIntegerField("field1"); indexDef.addStringField("field2"); indexManager.createIndex(indexDef); Index index = indexManager.getIndex(INDEX_NAME, INDEX_NAME); IndexEntry entry = new IndexEntry(); entry.addField("field1", 10); entry.addField("field2", "a"); index.addEntry(entry, Bytes.toBytes("key1")); index.addEntry(entry, Bytes.toBytes("key2")); index.addEntry(entry, Bytes.toBytes("key3")); entry = new IndexEntry(); entry.addField("field1", 11); entry.addField("field2", "a"); index.addEntry(entry, Bytes.toBytes("key4")); entry = new IndexEntry(); entry.addField("field1", 10); entry.addField("field2", "b"); index.addEntry(entry, Bytes.toBytes("key5")); Query query = new Query(); query.addEqualsCondition("field1", 10); query.addEqualsCondition("field2", "a"); QueryResult result = index.performQuery(query); assertResultSize(3, result); }
@Test public void testSingleIntFieldIndex() throws Exception { final String INDEX_NAME = "singleIntField"; IndexManager indexManager = new IndexManager(TEST_UTIL.getConfiguration()); IndexDefinition indexDef = new IndexDefinition(INDEX_NAME, INDEX_NAME); indexDef.addIntegerField("field1"); indexManager.createIndex(indexDef); Index index = indexManager.getIndex(INDEX_NAME, INDEX_NAME); final int COUNT = 1000; final int MAXVALUE = Integer.MAX_VALUE; int[] values = new int[COUNT]; for (int i = 0; i < COUNT; i++) { values[i] = (int) (Math.random() * MAXVALUE); } for (int value : values) { IndexEntry entry = new IndexEntry(); entry.addField("field1", value); index.addEntry(entry, Bytes.toBytes("key" + value)); } Query query = new Query(); query.setRangeCondition("field1", new Integer(0), new Integer(MAXVALUE)); QueryResult result = index.performQuery(query); Arrays.sort(values); for (int value : values) { assertEquals("key" + value, Bytes.toString(result.next())); } assertNull(result.next()); }
/** Test searching on a subset of the fields. */ @Test public void testPartialQuery() throws Exception { final String INDEX_NAME = "partialQuery"; IndexManager indexManager = new IndexManager(TEST_UTIL.getConfiguration()); IndexDefinition indexDef = new IndexDefinition(INDEX_NAME, INDEX_NAME); indexDef.addStringField("field1"); indexDef.addIntegerField("field2"); indexDef.addStringField("field3"); indexManager.createIndex(indexDef); Index index = indexManager.getIndex(INDEX_NAME, INDEX_NAME); for (int i = 0; i < 3; i++) { IndexEntry entry = new IndexEntry(); entry.addField("field1", "value A " + i); entry.addField("field2", 10 + i); entry.addField("field3", "value B " + i); index.addEntry(entry, Bytes.toBytes("key" + i)); } // Search only on the leftmost field { Query query = new Query(); query.addEqualsCondition("field1", "value A 0"); QueryResult result = index.performQuery(query); assertResultIds(result, "key0"); } // Search only on the two leftmost fields { Query query = new Query(); query.addEqualsCondition("field1", "value A 0"); query.addEqualsCondition("field2", 10); QueryResult result = index.performQuery(query); assertResultIds(result, "key0"); } // Search only on the two leftmost fields, with range query on the second { Query query = new Query(); query.addEqualsCondition("field1", "value A 0"); query.setRangeCondition("field2", 9, 11); QueryResult result = index.performQuery(query); assertResultIds(result, "key0"); } // Try searching on just the second field, should give error { Query query = new Query(); query.addEqualsCondition("field2", 10); try { index.performQuery(query); fail("Exception expected"); } catch (MalformedQueryException e) { // System.out.println(e.getMessage()); } } // Try searching on just the second field, should give error { Query query = new Query(); query.setRangeCondition("field2", 9, 11); try { index.performQuery(query); fail("Exception expected"); } catch (MalformedQueryException e) { // System.out.println(e.getMessage()); } } // Try not using all fields from left to right, should give error { Query query = new Query(); query.addEqualsCondition("field1", "value A 0"); // skip field 2 query.addEqualsCondition("field3", "value B 0"); try { index.performQuery(query); fail("Exception expected"); } catch (MalformedQueryException e) { // System.out.println(e.getMessage()); } } // Try not using all fields from left to right, should give error { Query query = new Query(); query.addEqualsCondition("field1", "value A 0"); // skip field 2 query.setRangeCondition("field3", "a", "b"); try { index.performQuery(query); fail("Exception expected"); } catch (MalformedQueryException e) { // System.out.println(e.getMessage()); } } }