use of org.locationtech.geowave.core.store.base.IntermediaryWriteEntryInfo.FieldInfo in project geowave by locationtech.
the class BaseDataStoreUtils method composeFlattenedFields.
/**
* This method combines all FieldInfos that share a common visibility into a single FieldInfo
*
* @param originalList
* @return a new list of composite FieldInfos
*/
private static <T> GeoWaveValue[] composeFlattenedFields(final List<FieldInfo<?>> originalList, final CommonIndexModel model, final InternalDataAdapter<?> writableAdapter, final VisibilityComposer commonIndexVisibility, final boolean dataIdIndex) {
if (originalList.isEmpty()) {
return new GeoWaveValue[0];
}
final Map<String, List<Pair<Integer, FieldInfo<?>>>> vizToFieldMap = new LinkedHashMap<>();
// organize FieldInfos by unique visibility
if (dataIdIndex) {
final List<Pair<Integer, FieldInfo<?>>> fieldsWithPositions = (List) originalList.stream().map(fieldInfo -> {
final int fieldPosition = writableAdapter.getPositionOfOrderedField(model, fieldInfo.getFieldId());
return (Pair) Pair.of(fieldPosition, fieldInfo);
}).collect(Collectors.toList());
final VisibilityComposer combinedVisibility = new VisibilityComposer();
for (final FieldInfo<?> fieldValue : originalList) {
combinedVisibility.addVisibility(fieldValue.getVisibility());
}
vizToFieldMap.put(combinedVisibility.composeVisibility(), fieldsWithPositions);
} else {
boolean sharedVisibility = false;
for (final FieldInfo<?> fieldInfo : originalList) {
int fieldPosition = writableAdapter.getPositionOfOrderedField(model, fieldInfo.getFieldId());
if (fieldPosition == -1) {
// this is just a fallback for unexpected failures
fieldPosition = writableAdapter.getPositionOfOrderedField(model, fieldInfo.getFieldId());
}
final VisibilityComposer currentComposer = new VisibilityComposer(commonIndexVisibility);
currentComposer.addVisibility(fieldInfo.getVisibility());
final String currViz = currentComposer.composeVisibility();
if (vizToFieldMap.containsKey(currViz)) {
sharedVisibility = true;
final List<Pair<Integer, FieldInfo<?>>> listForViz = vizToFieldMap.get(currViz);
listForViz.add(new ImmutablePair<Integer, FieldInfo<?>>(fieldPosition, fieldInfo));
} else {
final List<Pair<Integer, FieldInfo<?>>> listForViz = new LinkedList<>();
listForViz.add(new ImmutablePair<Integer, FieldInfo<?>>(fieldPosition, fieldInfo));
vizToFieldMap.put(currViz, listForViz);
}
}
if (!sharedVisibility) {
// at a minimum, must return transformed (bitmasked) fieldInfos
final GeoWaveValue[] bitmaskedValues = new GeoWaveValue[vizToFieldMap.size()];
int i = 0;
for (final List<Pair<Integer, FieldInfo<?>>> list : vizToFieldMap.values()) {
// every list must have exactly one element
final Pair<Integer, FieldInfo<?>> fieldInfo = list.get(0);
bitmaskedValues[i++] = new GeoWaveValueImpl(BitmaskUtils.generateCompositeBitmask(fieldInfo.getLeft()), StringUtils.stringToBinary(fieldInfo.getRight().getVisibility()), fieldInfo.getRight().getWrittenValue());
}
return bitmaskedValues;
}
}
if (vizToFieldMap.size() == 1) {
return new GeoWaveValue[] { entryToValue(vizToFieldMap.entrySet().iterator().next()) };
} else {
final List<GeoWaveValue> retVal = new ArrayList<>(vizToFieldMap.size());
for (final Entry<String, List<Pair<Integer, FieldInfo<?>>>> entry : vizToFieldMap.entrySet()) {
retVal.add(entryToValue(entry));
}
return retVal.toArray(new GeoWaveValue[0]);
}
}
use of org.locationtech.geowave.core.store.base.IntermediaryWriteEntryInfo.FieldInfo in project geowave by locationtech.
the class BaseDataStoreUtils method combineValues.
private static byte[] combineValues(final List<Pair<Integer, FieldInfo<?>>> fieldInfoList) {
int totalLength = 0;
Collections.sort(fieldInfoList, new BitmaskedPairComparator());
final List<byte[]> fieldInfoBytesList = new ArrayList<>(fieldInfoList.size());
for (final Pair<Integer, FieldInfo<?>> fieldInfoPair : fieldInfoList) {
final FieldInfo<?> fieldInfo = fieldInfoPair.getRight();
final ByteBuffer fieldInfoBytes = ByteBuffer.allocate(VarintUtils.unsignedIntByteLength(fieldInfo.getWrittenValue().length) + fieldInfo.getWrittenValue().length);
VarintUtils.writeUnsignedInt(fieldInfo.getWrittenValue().length, fieldInfoBytes);
fieldInfoBytes.put(fieldInfo.getWrittenValue());
fieldInfoBytesList.add(fieldInfoBytes.array());
totalLength += fieldInfoBytes.array().length;
}
final ByteBuffer allFields = ByteBuffer.allocate(totalLength);
for (final byte[] bytes : fieldInfoBytesList) {
allFields.put(bytes);
}
return allFields.array();
}
use of org.locationtech.geowave.core.store.base.IntermediaryWriteEntryInfo.FieldInfo in project geowave by locationtech.
the class BaseDataStoreUtils method getWriteInfo.
protected static <T> IntermediaryWriteEntryInfo getWriteInfo(final T entry, final InternalDataAdapter<T> adapter, final AdapterToIndexMapping indexMapping, final Index index, final VisibilityHandler visibilityHandler, final boolean secondaryIndex, final boolean dataIdIndex, final boolean visibilityEnabled) {
final CommonIndexModel indexModel = index.getIndexModel();
final short internalAdapterId = adapter.getAdapterId();
final byte[] dataId = adapter.getDataId(entry);
final AdapterPersistenceEncoding encodedData = adapter.encode(entry, indexMapping, index);
if (encodedData == null) {
// The entry could not be encoded to the index, but this could be due to a null value in one
// of the index fields, which is possible in attribute indices
LOGGER.info("Indexing failed to produce insertion ids; entry [" + StringUtils.stringFromBinary(adapter.getDataId(entry)) + "] not saved for index '" + index.getName() + "'.");
return new IntermediaryWriteEntryInfo(dataId, internalAdapterId, new InsertionIds(), new GeoWaveValueImpl[0]);
}
final InsertionIds insertionIds;
if (index instanceof CustomIndexStrategy) {
insertionIds = ((CustomIndexStrategy) index).getInsertionIds(entry);
} else {
insertionIds = dataIdIndex ? null : encodedData.getInsertionIds(index);
}
if (dataIdIndex) {
return getWriteInfoDataIDIndex(entry, dataId, encodedData, adapter, indexMapping, index, visibilityHandler, visibilityEnabled);
}
if (insertionIds.isEmpty()) {
// we can allow some entries to not be indexed within every index for flexibility, and
// therefore this should just be info level
LOGGER.info("Indexing failed to produce insertion ids; entry [" + StringUtils.stringFromBinary(adapter.getDataId(entry)) + "] not saved for index '" + index.getName() + "'.");
return new IntermediaryWriteEntryInfo(dataId, internalAdapterId, insertionIds, new GeoWaveValueImpl[0]);
}
final VisibilityComposer commonIndexVisibility = new VisibilityComposer();
if (visibilityEnabled && (visibilityHandler != null)) {
for (final Entry<String, Object> fieldValue : encodedData.getCommonData().getValues().entrySet()) {
addIndexFieldVisibility(entry, adapter, indexMapping, visibilityHandler, fieldValue.getKey(), commonIndexVisibility);
}
}
if (secondaryIndex && DataIndexUtils.adapterSupportsDataIndex(adapter)) {
return new IntermediaryWriteEntryInfo(dataId, internalAdapterId, insertionIds, new GeoWaveValue[] { new GeoWaveValueImpl(new byte[0], StringUtils.stringToBinary(commonIndexVisibility.composeVisibility()), new byte[0]) });
}
final List<FieldInfo<?>> fieldInfoList = new ArrayList<>();
addCommonFields(adapter, indexMapping, entry, index, indexModel, visibilityHandler, encodedData, visibilityEnabled, fieldInfoList);
for (final Entry<String, Object> fieldValue : encodedData.getAdapterExtendedData().getValues().entrySet()) {
if (fieldValue.getValue() != null) {
final FieldInfo<?> fieldInfo = getFieldInfo(adapter, adapter, indexMapping, fieldValue.getKey(), fieldValue.getValue(), entry, visibilityHandler, visibilityEnabled, false);
if (fieldInfo != null) {
fieldInfoList.add(fieldInfo);
}
}
}
return new IntermediaryWriteEntryInfo(dataId, internalAdapterId, insertionIds, BaseDataStoreUtils.composeFlattenedFields(fieldInfoList, indexModel, adapter, commonIndexVisibility, dataIdIndex));
}
Aggregations