package mil.nga.giat.geowave.core.store.query;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.apache.commons.lang3.tuple.Pair;
import org.junit.Assert;
import org.junit.Test;
import mil.nga.giat.geowave.core.index.ByteArrayId;
import mil.nga.giat.geowave.core.store.AdapterToIndexMapping;
import mil.nga.giat.geowave.core.store.CloseableIterator;
import mil.nga.giat.geowave.core.store.adapter.AbstractDataAdapter;
import mil.nga.giat.geowave.core.store.adapter.AdapterIndexMappingStore;
import mil.nga.giat.geowave.core.store.adapter.AdapterStore;
import mil.nga.giat.geowave.core.store.adapter.DataAdapter;
import mil.nga.giat.geowave.core.store.adapter.MockComponents;
import mil.nga.giat.geowave.core.store.adapter.NativeFieldHandler;
import mil.nga.giat.geowave.core.store.adapter.PersistentIndexFieldHandler;
import mil.nga.giat.geowave.core.store.adapter.exceptions.MismatchedIndexToAdapterMapping;
import mil.nga.giat.geowave.core.store.index.CommonIndexValue;
import mil.nga.giat.geowave.core.store.index.Index;
import mil.nga.giat.geowave.core.store.index.IndexStore;
import mil.nga.giat.geowave.core.store.index.PrimaryIndex;
public class QueryOptionsTest
{
@Test
public void testAuthorizations() {
final QueryOptions ops = new QueryOptions();
ops.setAuthorizations(new String[] {
"12",
"34"
});
ops.fromBinary(ops.toBinary());
assertTrue(Arrays.asList(
ops.getAuthorizations()).contains(
"12"));
assertTrue(Arrays.asList(
ops.getAuthorizations()).contains(
"34"));
}
@Test
public void testGetAdaptersWithMinimalSetOfIndices()
throws IOException {
final QueryOptions ops = new QueryOptions();
final PrimaryIndex index1 = new PrimaryIndex(
new MockComponents.MockIndexStrategy(),
new MockComponents.TestIndexModel(
"QOT_tm1"));
final PrimaryIndex index2 = new PrimaryIndex(
new MockComponents.MockIndexStrategy(),
new MockComponents.TestIndexModel(
"QOT_tm2"));
final PrimaryIndex index3 = new PrimaryIndex(
new MockComponents.MockIndexStrategy(),
new MockComponents.TestIndexModel(
"QOT_tm3"));
final AdapterStore adapterStore = new AdapterStore() {
@Override
public void addAdapter(
final DataAdapter<?> adapter ) {}
@Override
public DataAdapter<?> getAdapter(
final ByteArrayId adapterId ) {
final MockComponents.MockAbstractDataAdapter adapter = new MockComponents.MockAbstractDataAdapter() {
@Override
public ByteArrayId getAdapterId() {
return adapterId;
}
};
return adapter.getAdapterId().equals(
adapterId) ? adapter : null;
}
@Override
public boolean adapterExists(
final ByteArrayId adapterId ) {
return true;
}
@Override
public CloseableIterator<DataAdapter<?>> getAdapters() {
return new CloseableIterator.Wrapper(
Arrays.asList(
getAdapter(new ByteArrayId(
"QOT_1")),
getAdapter(new ByteArrayId(
"QOT_2")),
getAdapter(new ByteArrayId(
"QOT_3"))).iterator());
}
@Override
public void removeAll() {}
};
final List<Pair<PrimaryIndex, List<DataAdapter<Object>>>> result = ops.getAdaptersWithMinimalSetOfIndices(
adapterStore,
new AdapterIndexMappingStore() {
@Override
public AdapterToIndexMapping getIndicesForAdapter(
final ByteArrayId adapterId ) {
if (adapterId.getString().equals(
"QOT_1")) {
return new AdapterToIndexMapping(
adapterId,
new PrimaryIndex[] {
index1,
index2
});
}
else if (adapterId.getString().equals(
"QOT_2")) {
return new AdapterToIndexMapping(
adapterId,
new PrimaryIndex[] {
index1,
index3
});
}
return new AdapterToIndexMapping(
adapterId,
new PrimaryIndex[] {
index2,
index3
});
}
@Override
public void addAdapterIndexMapping(
final AdapterToIndexMapping mapping )
throws MismatchedIndexToAdapterMapping {}
@Override
public void remove(
final ByteArrayId adapterId ) {}
@Override
public void removeAll() {}
},
new IndexStore() {
@Override
public void addIndex(
final Index<?, ?> index ) {}
@Override
public Index<?, ?> getIndex(
final ByteArrayId indexId ) {
if (indexId.equals(index1.getId())) {
return index1;
}
else if (indexId.equals(index2.getId())) {
return index2;
}
else if (indexId.equals(index3.getId())) {
return index3;
}
return null;
}
@Override
public boolean indexExists(
final ByteArrayId indexId ) {
if (indexId.equals(index1.getId())) {
return true;
}
else if (indexId.equals(index2.getId())) {
return true;
}
else if (indexId.equals(index3.getId())) {
return true;
}
return false;
}
@Override
public CloseableIterator<Index<?, ?>> getIndices() {
return new CloseableIterator.Wrapper(
Arrays.asList(
index1,
index2,
index3).iterator());
}
@Override
public void removeAll() {}
});
assertEquals(
2,
result.size());
assertEquals(
index1,
result.get(
0).getLeft());
result.get(
0).getRight().contains(
adapterStore.getAdapter(new ByteArrayId(
"QOT_1")));
result.get(
0).getRight().contains(
adapterStore.getAdapter(new ByteArrayId(
"QOT_2")));
assertEquals(
index2,
result.get(
1).getLeft());
result.get(
1).getRight().contains(
adapterStore.getAdapter(new ByteArrayId(
"QOT_3")));
}
@Test
public void testAdapter() {
final QueryOptions ops = new QueryOptions();
ops.setAdapter(new MockComponents.MockAbstractDataAdapter());
final QueryOptions ops2 = new QueryOptions();
ops2.fromBinary(ops.toBinary());
assertTrue(ops2.getAdapters(
new AdapterStore() {
@Override
public void addAdapter(
final DataAdapter<?> adapter ) {}
@Override
public DataAdapter<?> getAdapter(
final ByteArrayId adapterId ) {
final MockComponents.MockAbstractDataAdapter adapter = new MockComponents.MockAbstractDataAdapter();
return adapter.getAdapterId().equals(
adapterId) ? adapter : null;
}
@Override
public boolean adapterExists(
final ByteArrayId adapterId ) {
return true;
}
@Override
public CloseableIterator<DataAdapter<?>> getAdapters() {
return new CloseableIterator.Wrapper(
Collections.emptyListIterator());
}
@Override
public void removeAll() {}
})
.next()
.getAdapterId() != null);
}
@Test
public void testAdapters()
throws IOException {
final AdapterStore adapterStore = new AdapterStore() {
@Override
public void addAdapter(
final DataAdapter<?> adapter ) {}
@Override
public DataAdapter<?> getAdapter(
final ByteArrayId adapterId ) {
return new MockComponents.MockAbstractDataAdapter(
adapterId);
}
@Override
public boolean adapterExists(
final ByteArrayId adapterId ) {
return true;
}
@Override
public CloseableIterator<DataAdapter<?>> getAdapters() {
return new CloseableIterator.Wrapper(
Collections.emptyListIterator());
}
@Override
public void removeAll() {}
};
final QueryOptions ops = new QueryOptions(
Arrays.asList(
adapterStore.getAdapter(new ByteArrayId(
"123")),
adapterStore.getAdapter(new ByteArrayId(
"567"))));
assertEquals(
2,
ops.getAdapterIds(
adapterStore).size());
final QueryOptions ops2 = new QueryOptions();
ops2.fromBinary(ops.toBinary());
assertEquals(
2,
ops2.getAdapterIds(
adapterStore).size());
}
@Test
public void testFieldIdSerialization() {
final List<String> fieldIds = Arrays.asList(new String[] {
"one",
"two",
"three"
});
final ArrayList<PersistentIndexFieldHandler<Integer, ? extends CommonIndexValue, Object>> indexFieldHandlers = new ArrayList<PersistentIndexFieldHandler<Integer, ? extends CommonIndexValue, Object>>();
indexFieldHandlers.add(new MockComponents.TestPersistentIndexFieldHandler());
final ArrayList<NativeFieldHandler<Integer, Object>> nativeFieldHandlers = new ArrayList<NativeFieldHandler<Integer, Object>>();
nativeFieldHandlers.add(new MockComponents.TestNativeFieldHandler());
final MockComponents.MockAbstractDataAdapter mockAbstractDataAdapter = new MockComponents.MockAbstractDataAdapter(
indexFieldHandlers,
nativeFieldHandlers);
final QueryOptions ops = new QueryOptions(
fieldIds,
mockAbstractDataAdapter);
final QueryOptions deserialized = new QueryOptions();
deserialized.fromBinary(ops.toBinary());
Assert.assertTrue(fieldIds.size() == deserialized.getFieldIdsAdapterPair().getLeft().size());
Assert.assertTrue(fieldIds.equals(deserialized.getFieldIdsAdapterPair().getLeft()));
Assert.assertTrue(deserialized.getFieldIdsAdapterPair().getRight() instanceof AbstractDataAdapter<?>);
}
}