|
@@ -0,0 +1,45 @@
|
|
|
+package com.winhc.bigdata.spark.ng.dynamic.utils
|
|
|
+
|
|
|
+import cn.hutool.json.JSONUtil
|
|
|
+import com.alibaba.fastjson.{JSON, JSONArray, JSONObject}
|
|
|
+import com.winhc.bigdata.spark.implicits.Bool._
|
|
|
+import com.winhc.bigdata.spark.ng.dynamic.utils.DynamicDimConfiguration.DDC
|
|
|
+import org.json4s.jackson.JsonMethods
|
|
|
+
|
|
|
+import scala.collection.JavaConverters.{asScalaSetConverter, mapAsScalaMapConverter}
|
|
|
+
|
|
|
+/**
|
|
|
+ * @author ZhangJi
|
|
|
+ * @since 2021-07-08 10:51
|
|
|
+ */
|
|
|
+object DynamicFiledUtils {
|
|
|
+ val SIMPLE_FILED_CONFIG: Map[String, Map[String, Map[String, Any]]] = DDC.filter(e => e._2.getOrElse("sample", false).asInstanceOf[Boolean]).map(e => (e._1, e._2("list_field").asInstanceOf[Map[String, Map[String, Any]]]))
|
|
|
+
|
|
|
+ def createSimpleDynamicInfo(tn: String, data: Map[String, String], update_type: String = "insert"): (String, Map[String, Any]) = {
|
|
|
+ val config = SIMPLE_FILED_CONFIG.getOrElse(tn, Map.empty)
|
|
|
+ val filter_set = config.filter(e => e._2.getOrElse("when", "insert").equals(update_type)).map(e => e._2.getOrElse("from", e._1)).toSet
|
|
|
+ (DDC(tn)("code").asInstanceOf[Map[String, String]].getOrElse(update_type, null),
|
|
|
+ data.filterKeys(e => filter_set.contains(e)))
|
|
|
+ }
|
|
|
+
|
|
|
+ def distinctBy[A, B](xs: Seq[A])(f: A => B): List[A] =
|
|
|
+ scala.reflect.internal.util.Collections.distinctBy(xs.toList)(f)
|
|
|
+
|
|
|
+ def createDynamicInfo(tn: String, data: Map[String, String]): (String, Map[String, Any]) = {
|
|
|
+ val lf = DDC(tn)("list_field").asInstanceOf[Map[String, Map[String, Any]]]
|
|
|
+ val dynamicInfo = lf.map(elem => {
|
|
|
+ val from = elem._2.getOrElse("from", Seq(elem._1)).asInstanceOf[Seq[String]]
|
|
|
+ elem._2.get("type") match {
|
|
|
+ case Some("array") => (elem._1, distinctBy(from.flatMap(n => {
|
|
|
+ val v = data.getOrElse(n, null)
|
|
|
+ var array = JSON.parseArray(v)
|
|
|
+ array = (array == null) ? new JSONArray() | array
|
|
|
+ array.toArray[JSONObject](Array.empty)
|
|
|
+ }))(jo => jo.getOrDefault("name", "")))
|
|
|
+ case Some("object") => (elem._1, from.map(e => (e.replace("_info", ""), JSON.parseArray(data.getOrElse(e, null)))).toMap)
|
|
|
+ case _ => (elem._1, data.getOrElse(from.head, null))
|
|
|
+ }
|
|
|
+ })
|
|
|
+ (DDC(tn)("code").asInstanceOf[Map[String, String]]("insert"), dynamicInfo)
|
|
|
+ }
|
|
|
+}
|