in s2core/src/main/scala/org/apache/s2graph/core/QueryParam.scala [413:444]
private def convertToInner(kvs: Seq[(String, JsValue)], edgeOpt: Option[S2EdgeLike]): Seq[(LabelMeta, InnerValLike)] = {
kvs.map { case (propKey, propValJs) =>
propValJs match {
case JsString(in) if edgeOpt.isDefined && in.contains("_parent.") =>
val parentLen = in.split("_parent.").length - 1
val edge = (0 until parentLen).foldLeft(edgeOpt.get) { case (acc, _) => acc.getParentEdges().head.edge }
val timePivot = edge.ts
val replaced = TemplateHelper.replaceVariable(timePivot, in).trim
val (_propKey, _padding) = replaced.span(ch => !ch.isDigit && ch != '-' && ch != '+' && ch != ' ')
val propKey = _propKey.split("_parent.").last
val padding = Try(_padding.trim.toLong).getOrElse(0L)
val labelMeta = edge.innerLabel.metaPropsInvMap.getOrElse(propKey, throw new RuntimeException(s"$propKey not found in ${edge} labelMetas."))
val propVal =
if (InnerVal.isNumericType(labelMeta.dataType)) {
InnerVal.withLong(edge.property(labelMeta.name).value.toString.toLong + padding, label.schemaVersion)
} else {
edge.property(labelMeta.name).asInstanceOf[S2Property[_]].innerVal
}
labelMeta -> propVal
case _ =>
val labelMeta = label.metaPropsInvMap.getOrElse(propKey, throw new RuntimeException(s"$propKey not found in labelMetas."))
val propVal = jsValueToInnerVal(propValJs, labelMeta.dataType, label.schemaVersion)
labelMeta -> propVal.get
}
}
}