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)
}
}
}