/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with this
* work for additional information regarding copyright ownership. The ASF
* licenses this file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*
* Copyright 2013 Josh Elser
*
*/
package cosmos.results;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.NoSuchElementException;
import java.util.Set;
import org.apache.accumulo.core.client.BatchScanner;
import org.apache.accumulo.core.client.Scanner;
import org.apache.accumulo.core.data.Key;
import org.apache.accumulo.core.data.Range;
import org.apache.accumulo.core.data.Value;
import org.apache.accumulo.core.security.Authorizations;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Multimap;
import com.google.common.collect.Sets;
import cosmos.Cosmos;
import cosmos.impl.CosmosImpl;
import cosmos.options.Defaults;
import cosmos.options.Index;
import cosmos.options.Order;
import cosmos.options.Paging;
import cosmos.records.Record;
import cosmos.records.impl.MultimapRecord;
import cosmos.records.values.RecordValue;
import cosmos.store.PersistedStores;
import cosmos.store.Store;
import cosmos.util.IdentitySet;
@RunWith(JUnit4.class)
public class BasicIndexingTest extends AbstractSortableTest {
protected List<Multimap<Column,RecordValue<?>>> data;
@Test
public void test() throws Exception {
Multimap<Column,RecordValue<?>> data = HashMultimap.create();
data.put(Column.create("TEXT"), RecordValue.create("foo", VIZ));
data.put(Column.create("TEXT"), RecordValue.create("bar", VIZ));
MultimapRecord mqr = new MultimapRecord(data, "1", VIZ);
Set<Index> columnsToIndex = Collections.singleton(Index.define("TEXT"));
Store id = Store.create(c, AUTHS, columnsToIndex);
Cosmos s = new CosmosImpl(zkConnectString());
s.register(id);
s.addResults(id, Collections.<Record<?>> singleton(mqr));
mqr = new MultimapRecord(mqr, "2");
s.addResults(id, Collections.<Record<?>> singleton(mqr));
Scanner scanner = c.createScanner(Defaults.DATA_TABLE, new Authorizations("test"));
Assert.assertEquals(8, Iterables.size(scanner));
scanner = c.createScanner(Defaults.METADATA_TABLE, new Authorizations("test"));
Assert.assertEquals(2, Iterables.size(scanner));
s.finalize(id);
CloseableIterable<MultimapRecord> results = s.fetch(id);
Assert.assertEquals(2, Iterables.size(results));
results.close();
results = s.fetch(id, Index.define("TEXT"));
// This should really be two, but w/e because we allow dupes
Assert.assertEquals(4, Iterables.size(results));
results.close();
results = s.fetch(id, Index.define("TEXT"), false);
Assert.assertEquals(2, Iterables.size(results));
results.close();
s.close();
}
@Test
public void totalDeletion() throws Exception {
Multimap<Column,RecordValue<?>> data = HashMultimap.create();
data.put(Column.create("TEXT"), RecordValue.create("foo", VIZ));
data.put(Column.create("TEXT"), RecordValue.create("bar", VIZ));
MultimapRecord mqr = new MultimapRecord(data, "1", VIZ);
Store id = Store.create(c, AUTHS, Collections.singleton(Index.define("TEXT")));
Cosmos s = new CosmosImpl(zkConnectString());
s.register(id);
s.addResults(id, Collections.<Record<?>> singleton(mqr));
Scanner scanner = c.createScanner(Defaults.DATA_TABLE, new Authorizations("test"));
Assert.assertEquals(4, Iterables.size(scanner));
scanner = c.createScanner(Defaults.METADATA_TABLE, new Authorizations("test"));
Assert.assertEquals(2, Iterables.size(scanner));
s.finalize(id);
s.delete(id);
scanner = c.createScanner(Defaults.DATA_TABLE, new Authorizations("test"));
Assert.assertEquals(0, Iterables.size(scanner));
scanner = c.createScanner(Defaults.METADATA_TABLE, new Authorizations("test"));
Assert.assertEquals(0, Iterables.size(scanner));
s.close();
}
@Test
public void postIndex() throws Exception {
Multimap<Column,RecordValue<?>> data = HashMultimap.create();
data.put(Column.create("TEXT"), RecordValue.create("foo", VIZ));
data.put(Column.create("TEXT"), RecordValue.create("bar", VIZ));
MultimapRecord mqr = new MultimapRecord(data, "1", VIZ);
Store id = Store.create(c, AUTHS, Collections.<Index> emptySet());
Cosmos s = new CosmosImpl(zkConnectString());
s.register(id);
s.addResults(id, Collections.<Record<?>> singleton(mqr));
Scanner scanner = c.createScanner(Defaults.DATA_TABLE, new Authorizations("test"));
Assert.assertEquals(2, Iterables.size(scanner));
scanner = c.createScanner(Defaults.METADATA_TABLE, new Authorizations("test"));
Assert.assertEquals(2, Iterables.size(scanner));
s.index(id, Collections.singleton(Index.define("TEXT")));
scanner = c.createScanner(Defaults.DATA_TABLE, new Authorizations("test"));
Assert.assertEquals(4, Iterables.size(scanner));
scanner = c.createScanner(Defaults.METADATA_TABLE, new Authorizations("test"));
Assert.assertEquals(2, Iterables.size(scanner));
s.close();
}
@Test
public void addResultsWithIndexOverSparseData() throws Exception {
Multimap<Column,RecordValue<?>> data = HashMultimap.create();
data.put(Column.create("TEXT"), RecordValue.create("foo", VIZ));
data.put(Column.create("TEXT"), RecordValue.create("bar", VIZ));
MultimapRecord mqr = new MultimapRecord(data, "1", VIZ);
Set<Index> columnsToIndex = Sets.newHashSet(Index.define("TEXT"), Index.define("DOESNTEXIST"));
Store id = Store.create(c, AUTHS, columnsToIndex);
Cosmos s = new CosmosImpl(zkConnectString());
s.register(id);
s.addResults(id, Collections.<Record<?>> singleton(mqr));
mqr = new MultimapRecord(mqr, "2");
s.addResults(id, Collections.<Record<?>> singleton(mqr));
Scanner scanner = c.createScanner(Defaults.DATA_TABLE, new Authorizations("test"));
Assert.assertEquals(8, Iterables.size(scanner));
scanner = c.createScanner(Defaults.METADATA_TABLE, new Authorizations("test"));
Assert.assertEquals(2, Iterables.size(scanner));
s.finalize(id);
CloseableIterable<MultimapRecord> results = s.fetch(id);
Assert.assertEquals(2, Iterables.size(results));
results.close();
s.close();
}
@Test
public void indexEverything() throws Exception {
Multimap<Column,RecordValue<?>> data = HashMultimap.create();
data.put(Column.create("TEXT"), RecordValue.create("foo", VIZ));
data.put(Column.create("SIZE"), RecordValue.create("2", VIZ));
MultimapRecord mqr = new MultimapRecord(data, "1", VIZ);
Set<Index> columnsToIndex = IdentitySet.<Index> create();
Store id = Store.create(c, AUTHS, columnsToIndex);
Cosmos s = new CosmosImpl(zkConnectString());
s.register(id);
s.addResults(id, Collections.<Record<?>> singleton(mqr));
data = HashMultimap.create();
data.put(Column.create("TEXT"), RecordValue.create("bar", VIZ));
data.put(Column.create("SIZE"), RecordValue.create("3", VIZ));
mqr = new MultimapRecord(data, "2", VIZ);
s.addResults(id, Collections.<Record<?>> singleton(mqr));
// 2 records with 2 columns (forward and reverse), plus the UID pointer (8+2=10)
Scanner scanner = c.createScanner(Defaults.DATA_TABLE, new Authorizations("test"));
Assert.assertEquals(12, Iterables.size(scanner));
scanner = c.createScanner(Defaults.METADATA_TABLE, new Authorizations("test"));
Assert.assertEquals(3, Iterables.size(scanner));
s.finalize(id);
CloseableIterable<MultimapRecord> results = s.fetch(id);
Assert.assertEquals(2, Iterables.size(results));
results.close();
// Sort by TEXT: should be docid "2" then "1"
results = s.fetch(id, Index.define("TEXT"));
Iterator<MultimapRecord> resultsIter = results.iterator();
Assert.assertTrue(resultsIter.hasNext());
Assert.assertEquals("2", resultsIter.next().docId());
Assert.assertTrue(resultsIter.hasNext());
Assert.assertEquals("1", resultsIter.next().docId());
Assert.assertFalse(resultsIter.hasNext());
results.close();
// Sort by SIZE: should be docid "1" then "2"
results = s.fetch(id, Index.define("SIZE"));
resultsIter = results.iterator();
Assert.assertTrue(resultsIter.hasNext());
Assert.assertEquals("1", resultsIter.next().docId());
Assert.assertTrue(resultsIter.hasNext());
Assert.assertEquals("2", resultsIter.next().docId());
Assert.assertFalse(resultsIter.hasNext());
results.close();
// Sort by TEXT descending, 1 then 2
results = s.fetch(id, Index.define("TEXT", Order.DESCENDING));
resultsIter = results.iterator();
Assert.assertTrue(resultsIter.hasNext());
Assert.assertEquals("1", resultsIter.next().docId());
Assert.assertTrue(resultsIter.hasNext());
Assert.assertEquals("2", resultsIter.next().docId());
Assert.assertFalse(resultsIter.hasNext());
results.close();
// Sort by SIZE descending: should be docid "2" then "1"\
// TODO Fix this test so I can actually test the reverse over this
// results = s.fetch(id, Index.define("SIZE", Order.DESCENDING));
// resultsIter = results.iterator();
//
// Assert.assertTrue(resultsIter.hasNext());
// Assert.assertEquals("2", resultsIter.next().docId());
//
// Assert.assertTrue(resultsIter.hasNext());
// Assert.assertEquals("1", resultsIter.next().docId());
//
// Assert.assertFalse(resultsIter.hasNext());
// results.close();
s.delete(id);
s.close();
}
@Test
public void postIndexSparseData() throws Exception {
Multimap<Column,RecordValue<?>> data = HashMultimap.create();
data.put(Column.create("TEXT"), RecordValue.create("foo", VIZ));
data.put(Column.create("TEXT"), RecordValue.create("bar", VIZ));
data.put(Column.create("TEXT"), RecordValue.create("foobar", VIZ));
MultimapRecord mqr = new MultimapRecord(data, "1", VIZ);
Store id = Store.create(c, AUTHS, Collections.<Index> emptySet());
Cosmos s = new CosmosImpl(zkConnectString());
s.register(id);
s.addResults(id, Collections.<Record<?>> singleton(mqr));
Scanner scanner = c.createScanner(Defaults.DATA_TABLE, new Authorizations("test"));
Assert.assertEquals(2, Iterables.size(scanner));
scanner = c.createScanner(Defaults.METADATA_TABLE, new Authorizations("test"));
Assert.assertEquals(2, Iterables.size(scanner));
s.index(id, Sets.newHashSet(Index.define("TEXT"), Index.define("DOESNTEXIST")));
scanner = c.createScanner(Defaults.DATA_TABLE, new Authorizations("test"));
Assert.assertEquals(5, Iterables.size(scanner));
scanner = c.createScanner(Defaults.METADATA_TABLE, new Authorizations("test"));
Assert.assertEquals(2, Iterables.size(scanner));
s.close();
}
@Test
public void pagedResults() throws Exception {
Multimap<Column,RecordValue<?>> data = HashMultimap.create();
data.put(Column.create("TEXT"), RecordValue.create("foo", VIZ));
data.put(Column.create("TEXT"), RecordValue.create("bar", VIZ));
data.put(Column.create("TEXT"), RecordValue.create("foobar", VIZ));
List<Record<?>> mqrs = Lists.newArrayListWithCapacity(20);
for (int i = 0; i < 16; i++) {
mqrs.add(new MultimapRecord(data, Integer.toString(i), VIZ));
}
Store id = Store.create(c, AUTHS, Collections.singleton(Index.define("TEXT")));
Cosmos s = new CosmosImpl(zkConnectString());
s.register(id);
s.addResults(id, mqrs);
s.finalize(id);
PagedResults<MultimapRecord> pqr = s.fetch(id, Paging.create(5, 20));
int pageCount = 0;
int numRecords = 0;
for (List<MultimapRecord> page : pqr) {
pageCount++;
int nextSize = page.size();
Assert.assertTrue(nextSize <= 5);
numRecords += nextSize;
}
Assert.assertEquals(16, numRecords);
Assert.assertEquals(4, pageCount);
pqr = s.fetch(id, Paging.create(3, 10));
pageCount = 0;
numRecords = 0;
for (List<MultimapRecord> page : pqr) {
pageCount++;
int nextSize = page.size();
Assert.assertTrue(nextSize <= 3);
numRecords += nextSize;
}
Assert.assertEquals(10, numRecords);
Assert.assertEquals(4, pageCount);
s.close();
}
@Test
public void columns() throws Exception {
Store id = Store.create(c, AUTHS,
Sets.newHashSet(Index.define("NAME"), Index.define("AGE"), Index.define("HEIGHT"), Index.define("WEIGHT")));
Multimap<Column,RecordValue<?>> data = HashMultimap.create();
data.put(Column.create("NAME"), RecordValue.create("George", VIZ));
data.put(Column.create("AGE"), RecordValue.create("25", VIZ));
data.put(Column.create("HEIGHT"), RecordValue.create("70", VIZ));
Cosmos s = new CosmosImpl(zkConnectString());
s.register(id);
s.addResults(id, Collections.<Record<?>> singleton(new MultimapRecord(data, "1", VIZ)));
Set<Column> actual = Sets.newHashSet(s.columns(id));
Set<Column> expected = Sets.newHashSet(data.keySet());
Assert.assertEquals(expected, actual);
data.removeAll(Column.create("HEIGHT"));
s.addResults(id, Collections.<Record<?>> singleton(new MultimapRecord(data, "2", VIZ)));
Assert.assertEquals(expected, Sets.newHashSet(s.columns(id)));
data.removeAll(Column.create("AGE"));
data.put(Column.create("WEIGHT"), RecordValue.create("100", VIZ));
s.addResults(id, Collections.<Record<?>> singleton(new MultimapRecord(data, "3", VIZ)));
expected.add(Column.create("WEIGHT"));
Assert.assertEquals(expected, Sets.newHashSet(s.columns(id)));
s.delete(id);
BatchScanner bs = c.createBatchScanner(id.metadataTable(), id.auths(), 1);
bs.setRanges(Collections.singleton(Range.exact(id.uuid())));
bs.fetchColumnFamily(PersistedStores.COLUMN_COLFAM);
long count = 0;
for (Entry<Key,Value> e : bs) {
count++;
}
bs.close();
Assert.assertEquals(0, count);
s.close();
}
@Test
public void projectToSingleValueInColumn() throws Exception {
Column name = Column.create("NAME"), age = Column.create("AGE"), height = Column.create("HEIGHT"), weight = Column.create("WEIGHT");
Store id = Store.create(c, AUTHS, Sets.newHashSet(Index.define(name), Index.define(age), Index.define(height), Index.define(weight)));
Multimap<Column,RecordValue<?>> data = HashMultimap.create();
data.put(name, RecordValue.create("George", VIZ));
data.put(Column.create("AGE"), RecordValue.create("25", VIZ));
data.put(Column.create("HEIGHT"), RecordValue.create("70", VIZ));
Cosmos s = new CosmosImpl(zkConnectString());
s.register(id);
s.addResults(id, Collections.<Record<?>> singleton(new MultimapRecord(data, "1", VIZ)));
data.removeAll(name);
data.put(name, RecordValue.create("Steve", VIZ));
s.addResults(id, Collections.<Record<?>> singleton(new MultimapRecord(data, "2", VIZ)));
data.removeAll(name);
data.put(name, RecordValue.create("Frank", VIZ));
data.put(Column.create("WEIGHT"), RecordValue.create("100", VIZ));
s.addResults(id, Collections.<Record<?>> singleton(new MultimapRecord(data, "3", VIZ)));
CloseableIterable<MultimapRecord> iter = s.fetch(id, name, "George");
ArrayList<MultimapRecord> results = Lists.newArrayList(iter);
iter.close();
Assert.assertEquals(1, results.size());
Assert.assertEquals("1", results.get(0).docId());
data.removeAll(height);
data.put(height, RecordValue.create("75", VIZ));
s.addResults(id, Collections.<Record<?>> singleton(new MultimapRecord(data, "4", VIZ)));
iter = s.fetch(id, name, "Frank");
results = Lists.newArrayList(iter);
iter.close();
Assert.assertEquals(2, results.size());
Set<String> docids = Sets.newHashSet("3", "4");
for (MultimapRecord r : results) {
Assert.assertTrue("Did not find " + r.docId() + " to remove from " + docids, docids.remove(r.docId()));
}
Assert.assertTrue("Expected empty set of docids: " + docids, docids.isEmpty());
CloseableIterable<MultimapRecord> empty = s.fetch(id, age, "0");
Assert.assertEquals(0, Iterables.size(empty));
empty.close();
s.close();
}
@Test
public void groupResults() throws Exception {
Column name = Column.create("NAME"), age = Column.create("AGE"), height = Column.create("HEIGHT"), weight = Column.create("WEIGHT");
Store id = Store.create(c, AUTHS, Sets.newHashSet(Index.define(name), Index.define(age), Index.define(height), Index.define(weight)));
Multimap<Column,RecordValue<?>> data = HashMultimap.create();
data.put(name, RecordValue.create("George", VIZ));
data.put(Column.create("AGE"), RecordValue.create("25", VIZ));
data.put(Column.create("HEIGHT"), RecordValue.create("70", VIZ));
Cosmos s = new CosmosImpl(zkConnectString());
s.register(id);
s.addResults(id, Collections.<Record<?>> singleton(new MultimapRecord(data, "1", VIZ)));
data.removeAll(name);
data.put(name, RecordValue.create("Steve", VIZ));
s.addResults(id, Collections.<Record<?>> singleton(new MultimapRecord(data, "2", VIZ)));
data.removeAll(name);
data.put(name, RecordValue.create("Frank", VIZ));
data.put(Column.create("WEIGHT"), RecordValue.create("100", VIZ));
s.addResults(id, Collections.<Record<?>> singleton(new MultimapRecord(data, "3", VIZ)));
// Plain groupBy over three records with unique values in said column
CloseableIterable<Entry<RecordValue<?>,Long>> groups = s.groupResults(id, name);
Map<RecordValue<?>,Long> expectedGroups = ImmutableMap.<RecordValue<?>,Long>of(RecordValue.create("George", VIZ), 1l, RecordValue.create("Steve", VIZ), 1l, RecordValue.create("Frank", VIZ), 1l);
int count = 0;
for (Entry<RecordValue<?>,Long> group : groups) {
Assert.assertTrue(expectedGroups.containsKey(group.getKey()));
Assert.assertEquals(expectedGroups.get(group.getKey()), group.getValue());
count++;
}
groups.close();
// Group by weight which only has one value
groups = s.groupResults(id, weight);
expectedGroups = ImmutableMap.<RecordValue<?>,Long>of(RecordValue.create("100", VIZ), 1l);
count = 0;
for (Entry<RecordValue<?>,Long> group : groups) {
Assert.assertTrue(expectedGroups.containsKey(group.getKey()));
Assert.assertEquals(expectedGroups.get(group.getKey()), group.getValue());
count++;
}
groups.close();
// Group by height which is the same for everyone
groups = s.groupResults(id, height);
expectedGroups = ImmutableMap.<RecordValue<?>,Long>of(RecordValue.create("70", VIZ), 3l);
count = 0;
for (Entry<RecordValue<?>,Long> group : groups) {
Assert.assertTrue(expectedGroups.containsKey(group.getKey()));
Assert.assertEquals(expectedGroups.get(group.getKey()), group.getValue());
count++;
}
groups.close();
Assert.assertEquals(expectedGroups.size(), count);
s.close();
}
@Test
public void pagedGroupResults() throws Exception {
Column name = Column.create("NAME"), age = Column.create("AGE"), height = Column.create("HEIGHT"), weight = Column.create("WEIGHT");
Store id = Store.create(c, AUTHS, Sets.newHashSet(Index.define(name), Index.define(age), Index.define(height), Index.define(weight)));
Multimap<Column,RecordValue<?>> data = HashMultimap.create();
data.put(name, RecordValue.create("George", VIZ));
data.put(Column.create("AGE"), RecordValue.create("25", VIZ));
data.put(Column.create("HEIGHT"), RecordValue.create("70", VIZ));
Cosmos s = new CosmosImpl(zkConnectString());
s.register(id);
s.addResults(id, Collections.<Record<?>> singleton(new MultimapRecord(data, "1", VIZ)));
data.removeAll(name);
data.put(name, RecordValue.create("Steve", VIZ));
s.addResults(id, Collections.<Record<?>> singleton(new MultimapRecord(data, "2", VIZ)));
data.removeAll(name);
data.put(name, RecordValue.create("Frank", VIZ));
data.put(Column.create("WEIGHT"), RecordValue.create("100", VIZ));
s.addResults(id, Collections.<Record<?>> singleton(new MultimapRecord(data, "3", VIZ)));
int pageSize = 1;
// Plain groupBy over three records with unique values in said column
PagedResults<Entry<RecordValue<?>,Long>> groups = s.groupResults(id, name, Paging.create(pageSize, Integer.MAX_VALUE));
Map<RecordValue<?>,Long> expectedGroups = ImmutableMap.<RecordValue<?>,Long>of(RecordValue.create("George", VIZ), 1l, RecordValue.create("Steve", VIZ), 1l, RecordValue.create("Frank", VIZ), 1l);
int count = 0;
for (List<Entry<RecordValue<?>,Long>> groupPage : groups) {
Assert.assertEquals(pageSize, groupPage.size());
for (Entry<RecordValue<?>,Long> group : groupPage) {
Assert.assertTrue(expectedGroups.containsKey(group.getKey()));
Assert.assertEquals(expectedGroups.get(group.getKey()), group.getValue());
count++;
}
}
groups.close();
Assert.assertEquals(expectedGroups.size(), count);
s.close();
}
@Test
public void reverseSorting() throws Exception {
Multimap<Column,RecordValue<?>> data = HashMultimap.create();
data.put(Column.create("TEXT"), RecordValue.create("aaa", VIZ));
MultimapRecord mqr = new MultimapRecord(data, "1", VIZ);
Set<Index> columnsToIndex = IdentitySet.<Index> create();
Store id = Store.create(c, AUTHS, columnsToIndex);
Cosmos s = new CosmosImpl(zkConnectString());
s.register(id);
s.addResults(id, Collections.<Record<?>> singleton(mqr));
data = HashMultimap.create();
data.put(Column.create("TEXT"), RecordValue.create("aab", VIZ));
mqr = new MultimapRecord(data, "2", VIZ);
s.addResults(id, Collections.<Record<?>> singleton(mqr));
s.finalize(id);
CloseableIterable<MultimapRecord> results = s.fetch(id);
Assert.assertEquals(2, Iterables.size(results));
results.close();
// Sort by TEXT descending, 1 then 2
results = s.fetch(id, Index.define("TEXT", Order.DESCENDING));
Iterator<MultimapRecord> resultsIter = results.iterator();
Assert.assertTrue(resultsIter.hasNext());
Assert.assertEquals("2", resultsIter.next().docId());
Assert.assertTrue(resultsIter.hasNext());
Assert.assertEquals("1", resultsIter.next().docId());
Assert.assertFalse(resultsIter.hasNext());
results.close();
// Sort by TEXT descending, 1 then 2
results = s.fetch(id, Index.define("TEXT", Order.ASCENDING));
resultsIter = results.iterator();
Assert.assertTrue(resultsIter.hasNext());
Assert.assertEquals("1", resultsIter.next().docId());
Assert.assertTrue(resultsIter.hasNext());
Assert.assertEquals("2", resultsIter.next().docId());
Assert.assertFalse(resultsIter.hasNext());
results.close();
s.delete(id);
s.close();
}
@Test
public void addHighColumnCardinalityResults() throws Exception {
Multimap<Column,RecordValue<?>> data = HashMultimap.create();
for (int i = 0; i < 100; i++) {
data.put(Column.create("TEXT" + i), RecordValue.create("foo", VIZ));
}
MultimapRecord mqr = new MultimapRecord(data, "1", VIZ);
Set<Index> columnsToIndex = Sets.newHashSet(Index.define("TEXT0"), Index.define("TEXT1"), Index.define("TEXT2"));
Store id = Store.create(c, AUTHS, Collections.<Index> emptySet());
Cosmos s = new CosmosImpl(zkConnectString());
s.register(id);
s.addResults(id, Collections.<Record<?>> singleton(mqr));
// Trigger the case where our record has more columns than what we're indexing
s.index(id, columnsToIndex);
for (int i = 0; i < 3; i++) {
Assert.assertEquals(1, Iterables.size(s.fetch(id, Index.define("TEXT" + i))));
}
// Trigger the case where we have more columns than the record
s.index(id, IdentitySet.<Index> create());
for (int i = 3; i < 100; i++) {
Assert.assertEquals(1, Iterables.size(s.fetch(id, Index.define("TEXT" + i))));
}
s.close();
}
@Test(expected = NoSuchElementException.class)
public void testNonExistentContent() throws Exception {
Column name = Column.create("NAME"), age = Column.create("AGE"), height = Column.create("HEIGHT"), weight = Column.create("WEIGHT");
Store id = Store.create(c, AUTHS, Sets.newHashSet(Index.define(name), Index.define(age), Index.define(height), Index.define(weight)));
Multimap<Column,RecordValue<?>> data = HashMultimap.create();
data.put(name, RecordValue.create("George", VIZ));
data.put(Column.create("AGE"), RecordValue.create("25", VIZ));
data.put(Column.create("HEIGHT"), RecordValue.create("70", VIZ));
Cosmos s = new CosmosImpl(zkConnectString());
s.register(id);
s.addResults(id, Collections.<Record<?>> singleton(new MultimapRecord(data, "1", VIZ)));
try {
// A different ID than what we just added
s.contents(id, "2");
} finally {
s.close();
}
}
}