Skip to content

Commit 58f7649

Browse files
committed
Added improved keyPrefix genereation in get{Vertices, Edges}.
Re-use the buffer and don't re-serialize the edge label and neighbor label over and over again.
1 parent 5971960 commit 58f7649

File tree

2 files changed

+61
-14
lines changed

2 files changed

+61
-14
lines changed

src/main/java/net/ellitron/torc/TorcGraph.java

Lines changed: 35 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -479,8 +479,10 @@ public Map<TorcVertex, List<TorcVertex>> getVertices(
479479
String edgeLabel,
480480
Direction dir,
481481
String ... neighborLabels) {
482-
return getVertices(TorcHelper.neighborList(vMap), edgeLabel, dir,
482+
List<TorcVertex> vList = TorcHelper.neighborList(vMap);
483+
Map<TorcVertex, List<TorcVertex>> ret = getVertices(vList, edgeLabel, dir,
483484
neighborLabels);
485+
return ret;
484486
}
485487

486488
/**
@@ -508,10 +510,20 @@ public Map<TorcVertex, List<TorcVertex>> getVertices(
508510
/* Build arguments to TorcEdgeList.batchRead(). */
509511
List<byte[]> keyPrefixes = new ArrayList<>(vList.size());
510512

511-
for (TorcVertex vertex : vList) {
512-
for (String neighborLabel : neighborLabels) {
513-
keyPrefixes.add(TorcHelper.getEdgeListKeyPrefix(vertex.id(),
514-
edgeLabel, dir, neighborLabel));
513+
byte[] edgeLabelByteArray = TorcHelper.serializeString(edgeLabel);
514+
for (String neighborLabel : neighborLabels) {
515+
byte[] neighborLabelByteArray = TorcHelper.serializeString(neighborLabel);
516+
ByteBuffer buffer =
517+
ByteBuffer.allocate(UInt128.BYTES
518+
+ Short.BYTES + edgeLabelByteArray.length
519+
+ Byte.BYTES
520+
+ Short.BYTES + neighborLabelByteArray.length)
521+
.order(ByteOrder.LITTLE_ENDIAN);
522+
for (TorcVertex vertex : vList) {
523+
buffer.rewind();
524+
TorcHelper.appendEdgeListKeyPrefixToBuffer(vertex.id(),
525+
edgeLabelByteArray, dir, neighborLabelByteArray, buffer);
526+
keyPrefixes.add(buffer.array().clone());
515527
}
516528
}
517529

@@ -526,8 +538,8 @@ public Map<TorcVertex, List<TorcVertex>> getVertices(
526538
Map<UInt128, TorcVertex> neighborDedupMap = new HashMap<>();
527539

528540
int i = 0;
529-
for (TorcVertex vertex : vList) {
530-
for (String neighborLabel : neighborLabels) {
541+
for (String neighborLabel : neighborLabels) {
542+
for (TorcVertex vertex : vList) {
531543
byte[] keyPrefix = keyPrefixes.get(i);
532544

533545
if (serEdgeLists.containsKey(keyPrefix)) {
@@ -601,10 +613,20 @@ public Map<TorcVertex, List<TorcEdge>> getEdges(
601613
/* Build arguments to TorcEdgeList.batchRead(). */
602614
List<byte[]> keyPrefixes = new ArrayList<>(vList.size());
603615

604-
for (TorcVertex vertex : vList) {
605-
for (String neighborLabel : neighborLabels) {
606-
keyPrefixes.add(TorcHelper.getEdgeListKeyPrefix(vertex.id(),
607-
edgeLabel, dir, neighborLabel));
616+
byte[] edgeLabelByteArray = TorcHelper.serializeString(edgeLabel);
617+
for (String neighborLabel : neighborLabels) {
618+
byte[] neighborLabelByteArray = TorcHelper.serializeString(neighborLabel);
619+
ByteBuffer buffer =
620+
ByteBuffer.allocate(UInt128.BYTES
621+
+ Short.BYTES + edgeLabelByteArray.length
622+
+ Byte.BYTES
623+
+ Short.BYTES + neighborLabelByteArray.length)
624+
.order(ByteOrder.LITTLE_ENDIAN);
625+
for (TorcVertex vertex : vList) {
626+
buffer.rewind();
627+
TorcHelper.appendEdgeListKeyPrefixToBuffer(vertex.id(),
628+
edgeLabelByteArray, dir, neighborLabelByteArray, buffer);
629+
keyPrefixes.add(buffer.array().clone());
608630
}
609631
}
610632

@@ -618,8 +640,8 @@ public Map<TorcVertex, List<TorcEdge>> getEdges(
618640
Map<TorcVertex, List<TorcEdge>> edgeListMap = new HashMap<>();
619641

620642
int i = 0;
621-
for (TorcVertex vertex : vList) {
622-
for (String neighborLabel : neighborLabels) {
643+
for (String neighborLabel : neighborLabels) {
644+
for (TorcVertex vertex : vList) {
623645
byte[] keyPrefix = keyPrefixes.get(i);
624646

625647
if (serEdgeLists.containsKey(keyPrefix)) {

src/main/java/net/ellitron/torc/util/TorcHelper.java

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -309,14 +309,39 @@ public static byte[] getEdgeListKeyPrefix(UInt128 vertexId, String edgeLabel,
309309
+ Byte.BYTES
310310
+ Short.BYTES + vertexLabelByteArray.length)
311311
.order(ByteOrder.LITTLE_ENDIAN);
312+
appendEdgeListKeyPrefixToBuffer(vertexId, edgeLabelByteArray, dir,
313+
vertexLabelByteArray, buffer);
314+
return buffer.array();
315+
}
316+
317+
/**
318+
* Generates a key prefix that defines an exclusive key-space for this
319+
* combination of vertex ID, edge label, edge direction, and vertex label. No
320+
* other (vertex ID, elabel, direction, vlabel) combination will have a key
321+
* prefix that is a prefix of this key, or for which this key is a prefix of.
322+
* This key-prefix is used to generate unique keys for RAMCloud objects that
323+
* store the potentially multiple segments that make up an edge list.
324+
*
325+
* @param vertexId
326+
* @param edgeLabel
327+
* @param dir
328+
* @param vertexLabel
329+
* @param byteBuffer
330+
*
331+
* @return RAMCloud Key.
332+
*/
333+
public static void appendEdgeListKeyPrefixToBuffer(UInt128 vertexId,
334+
byte[] edgeLabelByteArray,
335+
Direction dir,
336+
byte[] vertexLabelByteArray,
337+
ByteBuffer buffer) {
312338
buffer.putLong(vertexId.getUpperLong());
313339
buffer.putLong(vertexId.getLowerLong());
314340
buffer.putShort((short) edgeLabelByteArray.length);
315341
buffer.put(edgeLabelByteArray);
316342
buffer.put((byte) dir.ordinal());
317343
buffer.putShort((short) vertexLabelByteArray.length);
318344
buffer.put(vertexLabelByteArray);
319-
return buffer.array();
320345
}
321346

322347
/**

0 commit comments

Comments
 (0)