protected StaticBuffer decodeValue(final AttributeValue val) { if (null == val) { return null; } // Dynamo does not allow empty binary values, so we use a placeholder // for empty values if (Constants.EMPTY_BUFFER_PLACEHOLDER.equals(val.getS())) { return BufferUtil.emptyBuffer(); } return StaticArrayBuffer.of(val.getB()); }
private List<Entry> decodeSlice(final Map<String, AttributeValue> item) { final List<Entry> entries = new EntryBuilder(item).buildAll(); final Entry sliceStartEntry = StaticArrayEntry.of(sliceQuery.getSliceStart(), BufferUtil.emptyBuffer()); final Entry sliceEndEntry = StaticArrayEntry.of(sliceQuery.getSliceEnd(), BufferUtil.emptyBuffer()); final List<Entry> filteredEntries = new ArrayList<>(entries.size()); for (Entry entry : entries) { if (entry.compareTo(sliceStartEntry) >= 0 && entry.compareTo(sliceEndEntry) < 0) { filteredEntries.add(entry); } } return filteredEntries.subList(0, Math.min(filteredEntries.size(), sliceQuery.getLimit())); }
public List<Entry> buildAll() { if (null == item) { return Collections.emptyList(); } final Entry sliceStartEntry; final Entry sliceEndEntry; if (slice) { sliceStartEntry = StaticArrayEntry.of(start, BufferUtil.emptyBuffer()); sliceEndEntry = StaticArrayEntry.of(end, BufferUtil.emptyBuffer()); } else { sliceStartEntry = null; sliceEndEntry = null; } //TODO(amcp) Arrays.parallelSort(filteredEntries)? //https://github.com/awslabs/dynamodb-titan-storage-backend/issues/159 return item.entrySet().stream() .map(entry -> { final StaticBuffer columnKey = decodeKey(entry.getKey()); final AttributeValue valueValue = entry.getValue(); final StaticBuffer value = decodeValue(valueValue); return StaticArrayEntry.of(columnKey, value); }) .filter(entry -> !slice || entry.compareTo(sliceStartEntry) >= 0 && entry.compareTo(sliceEndEntry) < 0) .sorted() .limit(limit) .collect(Collectors.toList()); }