1
+ @file:JvmName(" Evaluation" )
1
2
package com.google.firebase.firestore.pipeline
2
3
3
4
import com.google.common.math.LongMath
@@ -7,6 +8,7 @@ import com.google.common.math.LongMath.checkedSubtract
7
8
import com.google.firebase.firestore.UserDataReader
8
9
import com.google.firebase.firestore.model.MutableDocument
9
10
import com.google.firebase.firestore.model.Values
11
+ import com.google.firebase.firestore.model.Values.encodeValue
10
12
import com.google.firebase.firestore.model.Values.isNanValue
11
13
import com.google.firebase.firestore.util.Assert
12
14
import com.google.firestore.v1.Value
@@ -393,6 +395,24 @@ internal val evaluateUnixSecondsToTimestamp = unaryFunction { seconds: Long ->
393
395
EvaluateResult .timestamp(seconds, 0 )
394
396
}
395
397
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
+
396
416
// === Helper Functions ===
397
417
398
418
private inline fun catch (f : () -> EvaluateResult ): EvaluateResult =
0 commit comments