def s2EdgeToJsValue()

in s2core/src/main/scala/org/apache/s2graph/core/PostProcess.scala [76:146]


  def s2EdgeToJsValue(queryOption: QueryOption,
                      edgeWithScore: EdgeWithScore,
                      isDegree: Boolean = false,
                      parents: JsValue = JsNull,
                      checkSelectColumns: Boolean = false): JsValue = {
    //    val builder = immutable.Map.newBuilder[String, JsValue]
    val builder = ArrayBuffer.empty[(String, JsValue)]
    val s2Edge = edgeWithScore.edge
    val score = edgeWithScore.score
    val label = edgeWithScore.label
    if (isDegree) {
      builder += ("from" -> anyValToJsValue(s2Edge.srcVertex.innerIdVal).get)
      builder += ("label" -> anyValToJsValue(label.label).get)
      builder += ("direction" -> anyValToJsValue(s2Edge.getDirection()).get)
      builder += (LabelMeta.degree.name -> anyValToJsValue(s2Edge.propertyValueInner(LabelMeta.degree).innerVal.value).get)
      JsObject(builder)
    } else {
      if (queryOption.withScore) builder += ("score" -> anyValToJsValue(score).get)

      if (queryOption.selectColumns.isEmpty) {
        builder += ("from" -> anyValToJsValue(s2Edge.srcVertex.innerIdVal).get)
        builder += ("to" -> anyValToJsValue(s2Edge.tgtVertex.innerIdVal).get)
        builder += ("label" -> anyValToJsValue(label.label).get)

        val innerProps = ArrayBuffer.empty[(String, JsValue)]
        for {
          (labelMeta, v) <- edgeWithScore.edge.propertyValues()
          jsValue <- anyValToJsValue(v.innerVal.value)
        } {
          innerProps += (labelMeta.name -> jsValue)
        }


        builder += ("props" -> JsObject(innerProps))
        builder += ("direction" -> anyValToJsValue(s2Edge.getDirection()).get)
        builder += ("timestamp" -> anyValToJsValue(s2Edge.getTsInnerValValue()).get)
        builder += ("_timestamp" -> anyValToJsValue(s2Edge.getTsInnerValValue()).get) // backward compatibility
        if (parents != JsNull) builder += ("parents" -> parents)
        //          Json.toJson(builder.result())
        JsObject(builder)
      } else {
        queryOption.selectColumnsMap.foreach { case (columnName, _) =>
          columnName match {
            case "from" => builder += ("from" -> anyValToJsValue(s2Edge.srcVertex.innerIdVal).get)
            case "_from" => builder += ("_from" -> anyValToJsValue(s2Edge.srcVertex.innerIdVal).get)
            case "to" => builder += ("to" -> anyValToJsValue(s2Edge.tgtVertex.innerIdVal).get)
            case "_to" => builder += ("_to" -> anyValToJsValue(s2Edge.tgtVertex.innerIdVal).get)
            case "label" => builder += ("label" -> anyValToJsValue(label.label).get)
            case "direction" => builder += ("direction" -> anyValToJsValue(s2Edge.getDirection()).get)
            case "timestamp" => builder += ("timestamp" -> anyValToJsValue(s2Edge.getTsInnerValValue()).get)
            case "_timestamp" => builder += ("_timestamp" -> anyValToJsValue(s2Edge.getTsInnerValValue()).get)
            case _ => // should not happen

          }
        }
        val innerProps = ArrayBuffer.empty[(String, JsValue)]
        for {
          (selectColumnName, _) <- queryOption.selectColumnsMap
          labelMeta <- label.metaPropsInvMap.get(selectColumnName)
          innerValWithTs = edgeWithScore.edge.propertyValueInner(labelMeta)
          jsValue <- anyValToJsValue(innerValWithTs.innerVal.value)
        } {
          innerProps += (labelMeta.name -> jsValue)
        }

        builder += ("props" -> JsObject(innerProps))
        if (parents != JsNull) builder += ("parents" -> parents)
        JsObject(builder)
      }
    }
  }