All Downloads are FREE. Search and download functionalities are using the official Maven repository.

scalax.collection.io.json.imp.Stream.scala Maven / Gradle / Ivy

The newest version!
package scalax.collection.io.json
package imp

import scala.collection.mutable.ArrayBuffer

import scalax.collection.generic._
import scalax.collection.io.edge._

import descriptor._
import error.JsonGraphError._, error.JsonGraphWarning._

object Stream {
  def createOuterElems[N, E <: Edge[N]](
      jsonLists: Iterable[JsonList],
      descriptor: Descriptor[N] /*,
      failures:   Failures*/
  ): (Iterable[N], Iterable[E]) = {

    /* Nodes must be processed first to be able to retrieve their id's which are
     * referenced by edges; all created nodes are stored in a map prior to passing
     * them to the Graph in order not to loose their id's.
     */
    val idMap = collection.mutable.Map.empty[String, N]
    val nodes: Iterable[N] = {
      val buf = new ArrayBuffer[N](512)
      for {
        nodeList <- jsonLists collect { case n: NodeList => n }
        NodeList(typeId, jsonNodes) = nodeList
        nodeDescriptor              = descriptor.nodeDescriptor(typeId).get
      } for (jsonNode <- nodeList) yield {
        val node      = nodeDescriptor.extract(jsonNode)
        val nodeId    = nodeDescriptor.id(node)
        val nodeInMap = idMap get nodeId
        buf += (
          if (nodeInMap.isDefined) {
            warn(DuplicateNodeId)
            nodeInMap.get
          } else {
            idMap += nodeId -> node
            node
          }
        )
      }
      buf
    }

    val edges: Iterable[E] = {
      val buf = new ArrayBuffer[E](16 * nodes.size)
      for {
        edgeList <- jsonLists collect { case e: EdgeList => e }
        EdgeList(typeId, edges) = edgeList
        edgeDescriptor          = descriptor.edgeDescriptor(typeId).get
      } {
        def lookupNode(nodeId: String): N = {
          val nodeInMap = idMap get nodeId
          if (nodeInMap.isDefined) nodeInMap.get
          else throw err(UnknownNode, nodeId)
        }

        edgeDescriptor match {
          case d: EdgeDescriptor[N, _] =>
            for (jsonEdge <- edgeList)
              buf += {
                val params = d.extract(jsonEdge)
                d.edgeFactory(lookupNode(params.n1), lookupNode(params.n2)).asInstanceOf[E]
              }
          case d: LEdgeDescriptor[N, _, _] =>
            type L = d.aLabel.type
            for (jsonEdge <- edgeList)
              buf += {
                val params = d.extract(jsonEdge).asInstanceOf[LEdgeParameters[L]]
                d.edgeFactory(lookupNode(params.n1), lookupNode(params.n2), params.label).asInstanceOf[E]
              }
          case d: HyperEdgeDescriptor[N, _] =>
            for (jsonEdge <- edgeList)
              buf += {
                val params: HyperEdgeParameters = d.extract(jsonEdge)
                d.hyperEdgeFactory(params.nodeIds map lookupNode).asInstanceOf[E]
              }
          case d: LHyperEdgeDescriptor[N, _, _] =>
            type L = d.aLabel.type
            for (jsonEdge <- edgeList)
              buf += {
                val params = d.extract(jsonEdge).asInstanceOf[LHyperEdgeParameters[L]]
                d.hyperEdgeFactory(params.nodeIds map lookupNode, params.label).asInstanceOf[E]
              }
          case d: DiHyperEdgeDescriptor[N, _] =>
            for (jsonEdge <- edgeList)
              buf += {
                val params = d.extract(jsonEdge)
                d.diHyperEdgeFactory(params.sources map lookupNode, params.targets map lookupNode).asInstanceOf[E]
              }
          case d: LDiHyperEdgeDescriptor[N, _, _] =>
            type L = d.aLabel.type
            for (jsonEdge <- edgeList)
              buf += {
                val params = d.extract(jsonEdge).asInstanceOf[LDiHyperEdgeParameters[L]]
                d.diHyperEdgeFactory(params.sources map lookupNode, params.targets map lookupNode, params.label)
                  .asInstanceOf[E]
              }
          case ud => throw err(UnexpectedDescr, ud.getClass.getName)
        }
      }
      buf
    }
    (nodes, edges)
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy