in computer-core/src/main/java/org/apache/hugegraph/computer/core/sort/flusher/CombineSubKvInnerSortFlusher.java [100:161]
private void writeSubKvs(KvEntry kvEntry, Iterator<KvEntry> subKvIter)
throws IOException {
E.checkArgument(subKvIter.hasNext(),
"Parameter subKvs can't be empty");
kvEntry.key().write(this.output);
long position = this.output.position();
// Write value length placeholder
this.output.writeFixedInt(0);
// Write subKv count placeholder
this.output.writeFixedInt(0);
// Write subKv to output
KvEntry lastSubKv = subKvIter.next();
Pointer lastSubValue = lastSubKv.value();
int writtenCount = 0;
while (true) {
// Write subKv
KvEntry current = null;
if (subKvIter.hasNext()) {
current = subKvIter.next();
if (lastSubKv.compareTo(current) == 0) {
lastSubValue = this.combiner.combine(lastSubValue,
current.value());
continue;
}
}
lastSubKv.key().write(this.output);
lastSubValue.write(this.output);
writtenCount++;
if (writtenCount == this.subKvFlushThreshold || current == null) {
// Fill placeholder
long currentPosition = this.output.position();
this.output.seek(position);
// Fill value length placeholder
this.output.writeFixedInt((int)
(currentPosition - position - 4));
// Fill subKv count placeholder
this.output.writeFixedInt(writtenCount);
this.output.seek(currentPosition);
if (current == null) {
break;
}
// Used for next loop
kvEntry.key().write(this.output);
position = this.output.position();
// Write value length placeholder
this.output.writeFixedInt(0);
// Write subKv count placeholder
this.output.writeFixedInt(0);
writtenCount = 0;
}
lastSubKv = current;
lastSubValue = current.value();
}
}