11package flatgraph .convert
22
33import flatgraph .misc .{ISeq , Misc }
4+ import flatgraph .storage .Manifest .NodeItem
45import flatgraph .{AccessHelpers , Accessors , Edge , GNode , storage }
56import flatgraph .storage .{Keys , Manifest , Serialization , StorageType }
67import 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