Skip to content

Commit 4b0057c

Browse files
authored
fix up legacy odb conversion (#304)
1 parent d3a35e1 commit 4b0057c

File tree

1 file changed

+19
-29
lines changed

1 file changed

+19
-29
lines changed

odb-convert/src/main/scala/flatgraph/convert/Convert.scala

Lines changed: 19 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package flatgraph.convert
22

33
import flatgraph.misc.{ISeq, Misc}
4+
import flatgraph.storage.Manifest.NodeItem
45
import flatgraph.{AccessHelpers, Accessors, Edge, GNode, storage}
56
import flatgraph.storage.{Keys, Manifest, Serialization, StorageType}
67
import org.msgpack.core.{MessageBufferPacker, MessagePack}
@@ -44,8 +45,8 @@ object Convert {
4445

4546
def convertOdbToFlatgraph(overflowDbFile: Path, outputFile: Path, verbose: Boolean = false): Unit = {
4647
val storage = overflowdb.storage.OdbStorage.createWithSpecificLocation(overflowDbFile.toFile, new overflowdb.util.StringInterner)
47-
val (nodes, strings) = readOdb(storage)
48-
writeData(outputFile.toFile, nodes, strings, verbose = verbose)
48+
val nodes = readOdb(storage)
49+
writeData(outputFile.toFile, nodes, verbose = verbose)
4950
}
5051

5152
def convertFlatgraphToOdb(fgFile: Path, outputFile: Path, debug: Boolean = false, verbose: Boolean = false): Unit = {
@@ -65,10 +66,9 @@ object Convert {
6566
val bytes = packNode(node, storage)
6667
if (debug) {
6768
val legacyIdToNewId = mutable.HashMap[Long, NodeRefTmp]()
68-
val stringInterner = mutable.LinkedHashMap[String, StringRef]()
6969
val byLabel = mutable.LinkedHashMap[String, NodeStuff]()
7070
try {
71-
readNode(legacyIdToNewId, stringInterner, node.id(), bytes, byLabel, storage)
71+
readNode(legacyIdToNewId, node.id(), bytes, byLabel, storage)
7272
} catch {
7373
case exc: Throwable =>
7474
println(s"Inconsistency encountered ${node.seq()} / ${node.nodeKind} / ${node.label()} / ${node.id()}")
@@ -82,11 +82,9 @@ object Convert {
8282
}
8383

8484
class NodeRefTmp(val legacyId: Long) {
85-
var newId: Long = -1L
85+
var newNode: flatgraph.GNode = null
8686
}
8787

88-
class StringRef(val idx: Int, val string: String)
89-
9088
private object NodeStuff {
9189
val NODEPROPERTY = "p"
9290
val NEIGHBOR_IN = "i"
@@ -124,7 +122,7 @@ object Convert {
124122
}
125123
}
126124

127-
private def writeData(filename: File, nodeStuff: Array[NodeStuff], strings: Array[String], verbose: Boolean = false): Unit = {
125+
private def writeData(filename: File, nodeStuff: Array[NodeStuff], verbose: Boolean = false): Unit = {
128126
val fileAbsolute = filename.getAbsoluteFile
129127
val filePtr = new AtomicLong(16)
130128
if (!fileAbsolute.exists()) {
@@ -168,7 +166,7 @@ object Convert {
168166
}
169167
}
170168
}
171-
val manifest = new Manifest.GraphItem(nodes.toArray, edges.toArray, properties.toArray)
169+
val manifest = new Manifest.GraphItem(nodes, edges.toArray, properties.toArray)
172170
writer.finish(manifest)
173171
} finally { fileChannel.close(); writer.compressCtx.close(); }
174172
}
@@ -183,15 +181,12 @@ object Convert {
183181
case Some(_: Long) => (storage.StorageType.Long, items.asInstanceOf[mutable.ArrayBuffer[Long]].toArray)
184182
case Some(_: Float) => (storage.StorageType.Float, items.asInstanceOf[mutable.ArrayBuffer[Float]].toArray)
185183
case Some(_: Double) => (storage.StorageType.Double, items.asInstanceOf[mutable.ArrayBuffer[Double]].toArray)
186-
case Some(_: StringRef) =>
187-
(
188-
storage.StorageType.String,
189-
items.asInstanceOf[mutable.ArrayBuffer[StringRef]].map { ref => if (ref == null) -1 else ref.idx }.toArray
190-
)
184+
case Some(_: String) =>
185+
(storage.StorageType.String, items.asInstanceOf[mutable.ArrayBuffer[String]].toArray)
191186
case Some(_: NodeRefTmp) =>
192187
(
193188
storage.StorageType.Ref,
194-
items.asInstanceOf[mutable.ArrayBuffer[NodeRefTmp]].map { ref => if (ref == null) 0x0000ffffffffffffL else ref.newId }.toArray
189+
items.asInstanceOf[mutable.ArrayBuffer[NodeRefTmp]].iterator.map { ref => if (ref == null) null else ref.newNode }.toArray
195190
)
196191
case Some(other) => throw new AssertionError(s"unexpected item found: other of type ${other.getClass}")
197192
}
@@ -377,7 +372,6 @@ object Convert {
377372

378373
def readNode(
379374
legacyIdToNewId: mutable.HashMap[Long, NodeRefTmp],
380-
stringInterner: mutable.LinkedHashMap[String, StringRef],
381375
legacyId: Long,
382376
bytes: Array[Byte],
383377
byLabel: mutable.LinkedHashMap[String, NodeStuff],
@@ -392,13 +386,13 @@ object Convert {
392386
val sz = byLabel.size
393387
val nodeStuff = byLabel.getOrElseUpdate(label, new NodeStuff(label, sz))
394388
val ref = legacyIdToNewId.getOrElseUpdate(legacyId, new NodeRefTmp(legacyId))
395-
ref.newId = nodeStuff.nextId.toLong + (nodeStuff.kind.toLong << 32)
389+
ref.newNode = new GNode(null, nodeStuff.kind.toShort, nodeStuff.nextId)
396390
nodeStuff.nextId += 1
397391
// nodeStuff.addX(NodeStuff.NODEPROPERTY, NodeStuff.legacyId, legacyId)
398392
val nprops = unpacker.unpackMapHeader()
399393
for (_ <- Range(0, nprops)) {
400394
val key = storage.reverseLookupStringToIntMapping(unpacker.unpackInt())
401-
for (v <- unpackValue(legacyIdToNewId, stringInterner, unpacker.unpackValue().asArrayValue())) {
395+
for (v <- unpackValue(legacyIdToNewId, unpacker.unpackValue().asArrayValue())) {
402396
nodeStuff.addX(NodeStuff.NODEPROPERTY, key, v)
403397
}
404398
}
@@ -414,7 +408,7 @@ object Convert {
414408
case 0 => (null, null) // no property
415409
case 1 =>
416410
val pkey = storage.reverseLookupStringToIntMapping(unpacker.unpackInt())
417-
val pvals = unpackValue(legacyIdToNewId, stringInterner, unpacker.unpackValue().asArrayValue())
411+
val pvals = unpackValue(legacyIdToNewId, unpacker.unpackValue().asArrayValue())
418412
if (pvals.length == 0) (null, null)
419413
else if (pvals.length == 1) (pkey, pvals.head)
420414
else ???
@@ -427,25 +421,23 @@ object Convert {
427421

428422
}
429423

430-
private def readOdb(storage: overflowdb.storage.OdbStorage): (Array[NodeStuff], Array[String]) = {
424+
private def readOdb(storage: overflowdb.storage.OdbStorage): Array[NodeStuff] = {
431425
val legacyIdToNewId = mutable.HashMap[Long, NodeRefTmp]()
432-
val stringInterner = mutable.LinkedHashMap[String, StringRef]()
433426
val byLabel = mutable.LinkedHashMap[String, NodeStuff]()
434427
val iter = storage.allNodes().iterator
435428
while (iter.hasNext) {
436429
val e = iter.next()
437430
val legacyId = e.getKey
438431
val bytes = e.getValue
439-
readNode(legacyIdToNewId, stringInterner, legacyId, bytes, byLabel, storage)
432+
readNode(legacyIdToNewId, legacyId, bytes, byLabel, storage)
440433
}
441434

442435
byLabel.valuesIterator.foreach { _.pad() }
443-
(byLabel.valuesIterator.toArray, stringInterner.keysIterator.toArray)
436+
byLabel.valuesIterator.toArray
444437
}
445438

446439
def unpackValue(
447440
legacyIdToNewId: mutable.HashMap[Long, NodeRefTmp],
448-
stringInterner: mutable.LinkedHashMap[String, StringRef],
449441
valueOrPair: org.msgpack.value.Value,
450442
res: mutable.ArrayBuffer[Any] = mutable.ArrayBuffer[Any](),
451443
typId: Option[ValueTypes] = None
@@ -467,9 +459,7 @@ object Convert {
467459
case ValueTypes.LONG => res.addOne(v.asIntegerValue.asLong)
468460
case ValueTypes.FLOAT => res.addOne(v.asFloatValue.toFloat)
469461
case ValueTypes.DOUBLE => res.addOne(v.asFloatValue.toDouble)
470-
case ValueTypes.STRING =>
471-
val s = v.asStringValue().asString()
472-
res.addOne(stringInterner.getOrElseUpdate(s, new StringRef(stringInterner.size, s)))
462+
case ValueTypes.STRING => res.addOne(v.asStringValue().asString())
473463
case ValueTypes.NODE_REF =>
474464
val legacyId = v.asIntegerValue.asLong
475465
res.addOne(legacyIdToNewId.get(legacyId) match {
@@ -482,7 +472,7 @@ object Convert {
482472
case ValueTypes.LIST | ValueTypes.ARRAY_OBJECT =>
483473
val iter = v.asArrayValue().iterator()
484474
while (iter.hasNext) {
485-
unpackValue(legacyIdToNewId, stringInterner, iter.next().asArrayValue(), res)
475+
unpackValue(legacyIdToNewId, iter.next().asArrayValue(), res)
486476
}
487477
case ValueTypes.ARRAY_BOOL | ValueTypes.ARRAY_BYTE | ValueTypes.ARRAY_SHORT | ValueTypes.ARRAY_INT | ValueTypes.ARRAY_LONG |
488478
ValueTypes.ARRAY_FLOAT | ValueTypes.ARRAY_DOUBLE =>
@@ -498,7 +488,7 @@ object Convert {
498488
}
499489
val iter = v.asArrayValue().iterator()
500490
while (iter.hasNext) {
501-
unpackValue(legacyIdToNewId, stringInterner, iter.next().asArrayValue(), res, Some(elementType))
491+
unpackValue(legacyIdToNewId, iter.next().asArrayValue(), res, Some(elementType))
502492
}
503493

504494
case _ => ???

0 commit comments

Comments
 (0)