You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwhisk.apache.org by ch...@apache.org on 2020/03/06 10:55:22 UTC
[openwhisk] branch master updated: Simplify Cosmos query string
generation. (#4835)
This is an automated email from the ASF dual-hosted git repository.
chetanm pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/openwhisk.git
The following commit(s) were added to refs/heads/master by this push:
new 12b2b76 Simplify Cosmos query string generation. (#4835)
12b2b76 is described below
commit 12b2b76d4bef3e7c2bd990cc441e31cb3d3046be
Author: Markus Thömmes <ma...@me.com>
AuthorDate: Fri Mar 6 11:55:05 2020 +0100
Simplify Cosmos query string generation. (#4835)
Simplify the selector keys to json transformation
---
.../core/database/cosmosdb/CosmosDBUtil.scala | 44 ++++++----------------
.../core/database/cosmosdb/CosmosDBUtilTest.scala | 2 +-
2 files changed, 13 insertions(+), 33 deletions(-)
diff --git a/common/scala/src/main/scala/org/apache/openwhisk/core/database/cosmosdb/CosmosDBUtil.scala b/common/scala/src/main/scala/org/apache/openwhisk/core/database/cosmosdb/CosmosDBUtil.scala
index fbe1b49..60bd611 100644
--- a/common/scala/src/main/scala/org/apache/openwhisk/core/database/cosmosdb/CosmosDBUtil.scala
+++ b/common/scala/src/main/scala/org/apache/openwhisk/core/database/cosmosdb/CosmosDBUtil.scala
@@ -22,8 +22,6 @@ import org.apache.openwhisk.core.database.cosmosdb.CosmosDBConstants._
import org.apache.openwhisk.core.database.StoreUtils.transform
import spray.json.{JsObject, JsString}
-import scala.collection.immutable.Iterable
-
private[cosmosdb] object CosmosDBConstants {
/**
@@ -73,39 +71,21 @@ private[cosmosdb] trait CosmosDBUtil {
* }}}
* Here it uses {{{r['keyName']}}} notation to avoid issues around using reserved words as field name
*/
- def prepareFieldClause(fields: Iterable[String]): String = {
- val m = fields.foldLeft(Map.empty[String, Any]) { (map, name) =>
- addToMap(name, map)
- }
- val withId = addToMap(cid, m)
- val json = asJsonLikeString(withId)
+ def prepareFieldClause(fields: Set[String]): String = {
+ val json = (fields + cid)
+ .map { field =>
+ val split = field.split('.')
+
+ val selector = "r" + split.mkString("['", "']['", "']")
+ val prefix = split.map(k => s""""$k":""").mkString("{")
+ val suffix = split.drop(1).map(_ => "}").mkString
+
+ prefix + selector + suffix
+ }
+ .mkString("{", ",", "}")
s"$json AS $alias"
}
- private def addToMap(name: String, map: Map[String, _]): Map[String, Any] = name.split('.').toList match {
- case Nil => throw new IllegalStateException(s"'$name' split on '.' should not result in empty list")
- case x :: xs => addToMap(x, xs, Nil, map)
- }
-
- private def addToMap(key: String,
- children: List[String],
- keyPath: List[String],
- map: Map[String, Any]): Map[String, Any] = children match {
- case Nil => map + (key -> s"r${makeKeyPath(key :: keyPath)}")
- case x :: xs =>
- map + (key -> addToMap(x, xs, key :: keyPath, map.getOrElse(key, Map.empty).asInstanceOf[Map[String, Any]]))
- }
-
- private def makeKeyPath(keyPath: List[String]) = keyPath.reverse.map(f => s"['$f']").mkString
-
- private def asJsonLikeString(m: Map[_, _]) =
- m.map { case (k, v) => s""" "$k" : ${asString(v)}""" }.mkString("{", ",", "}")
-
- private def asString(v: Any): String = v match {
- case m: Map[_, _] => asJsonLikeString(m)
- case x => x.toString
- }
-
/**
* CosmosDB id considers '/', '\' , '?' and '#' as invalid. EntityNames can include '/' so
* that need to be escaped. For that we use '|' as the replacement char
diff --git a/tests/src/test/scala/org/apache/openwhisk/core/database/cosmosdb/CosmosDBUtilTest.scala b/tests/src/test/scala/org/apache/openwhisk/core/database/cosmosdb/CosmosDBUtilTest.scala
index a4e9e8b..68f37b1 100644
--- a/tests/src/test/scala/org/apache/openwhisk/core/database/cosmosdb/CosmosDBUtilTest.scala
+++ b/tests/src/test/scala/org/apache/openwhisk/core/database/cosmosdb/CosmosDBUtilTest.scala
@@ -55,7 +55,7 @@ class CosmosDBUtilTest extends FlatSpec with Matchers with OptionValues {
JsHelpers.getFieldPath(result, "b", "c").value shouldBe JsString("r['b']['c']")
}
- private def fieldsAsJson(fields: String*) = toJson(CosmosDBUtil.prepareFieldClause(fields.toList))
+ private def fieldsAsJson(fields: String*) = toJson(CosmosDBUtil.prepareFieldClause(fields.toSet))
private def toJson(s: String): JsObject = {
//Strip of last `As VIEW`