1+ @file:JvmName(" Evaluation" )
12package com.google.firebase.firestore.pipeline
23
34import com.google.common.math.LongMath
@@ -7,6 +8,7 @@ import com.google.common.math.LongMath.checkedSubtract
78import com.google.firebase.firestore.UserDataReader
89import com.google.firebase.firestore.model.MutableDocument
910import com.google.firebase.firestore.model.Values
11+ import com.google.firebase.firestore.model.Values.encodeValue
1012import com.google.firebase.firestore.model.Values.isNanValue
1113import com.google.firebase.firestore.util.Assert
1214import com.google.firestore.v1.Value
@@ -393,6 +395,24 @@ internal val evaluateUnixSecondsToTimestamp = unaryFunction { seconds: Long ->
393395 EvaluateResult .timestamp(seconds, 0 )
394396}
395397
398+ // === Map Functions ===
399+
400+ internal val evaluateMap: EvaluateFunction = { params ->
401+ if (params.size % 2 != 0 )
402+ throw Assert .fail(" Function should have even number of params, but %d were given." , params.size)
403+ else block@{ input: MutableDocument ->
404+ val map: MutableMap <String , Value > = HashMap (params.size / 2 )
405+ for (i in params.indices step 2 ) {
406+ val k = params[i](input).value ? : return @block EvaluateResultError
407+ if (! k.hasStringValue()) return @block EvaluateResultError
408+ val v = params[i + 1 ](input).value ? : return @block EvaluateResultError
409+ // It is against the API contract to include a key more than once.
410+ if (map.put(k.stringValue, v) != null ) return @block EvaluateResultError
411+ }
412+ EvaluateResultValue (encodeValue(map))
413+ }
414+ }
415+
396416// === Helper Functions ===
397417
398418private inline fun catch (f : () -> EvaluateResult ): EvaluateResult =
0 commit comments