Skip to content

Commit d93f968

Browse files
feat(firestore, android): variable implementation
1 parent d881c5f commit d93f968

2 files changed

Lines changed: 60 additions & 1 deletion

File tree

packages/firestore/android/src/reactnative/java/io/invertase/firebase/firestore/ReactNativeFirebaseFirestorePipelineNodeBuilder.java

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -994,6 +994,22 @@ private void processObjectLoweringStack(ArrayDeque<ObjectLoweringFrame> stack)
994994
break;
995995
}
996996

997+
Object exprType = map.get("exprType");
998+
if (exprType instanceof String
999+
&& "variable".equals(((String) exprType).toLowerCase(Locale.ROOT))) {
1000+
Object nameValue = map.get("name");
1001+
if (!(nameValue instanceof String) || ((String) nameValue).isEmpty()) {
1002+
throw new ReactNativeFirebaseFirestorePipelineExecutor.PipelineValidationException(
1003+
"pipelineExecute() expected "
1004+
+ currentFieldName
1005+
+ ".name to be a non-empty string.");
1006+
}
1007+
enterFrame.box.value =
1008+
applyPendingUnaryExpressionFunctions(
1009+
Expression.variable((String) nameValue), pendingUnaryFunctions);
1010+
break;
1011+
}
1012+
9971013
Object name = map.get("name");
9981014
if (name instanceof String) {
9991015
String functionName = (String) name;
@@ -1022,7 +1038,7 @@ private void processObjectLoweringStack(ArrayDeque<ObjectLoweringFrame> stack)
10221038
break;
10231039
}
10241040

1025-
Object exprType = map.get("exprType");
1041+
exprType = map.get("exprType");
10261042
if (exprType instanceof String) {
10271043
String normalizedType = ((String) exprType).toLowerCase(Locale.ROOT);
10281044
if ("field".equals(normalizedType)) {
@@ -3287,6 +3303,19 @@ private Object serializeExpressionNode(
32873303
continue;
32883304
}
32893305

3306+
if (expression
3307+
instanceof ReactNativeFirebaseFirestorePipelineParser.ParsedVariableExpressionNode) {
3308+
Map<String, Object> output = new LinkedHashMap<>();
3309+
output.put("__kind", "expression");
3310+
output.put("exprType", "Variable");
3311+
output.put(
3312+
"name",
3313+
((ReactNativeFirebaseFirestorePipelineParser.ParsedVariableExpressionNode) expression)
3314+
.name);
3315+
enterFrame.box.value = output;
3316+
continue;
3317+
}
3318+
32903319
ReactNativeFirebaseFirestorePipelineParser.ParsedFunctionExpressionNode function =
32913320
(ReactNativeFirebaseFirestorePipelineParser.ParsedFunctionExpressionNode) expression;
32923321
List<SerializedValueBox> argBoxes = new ArrayList<>(function.args.size());
@@ -3532,6 +3561,19 @@ private Object serializeValueNode(
35323561
continue;
35333562
}
35343563

3564+
if (expression
3565+
instanceof ReactNativeFirebaseFirestorePipelineParser.ParsedVariableExpressionNode) {
3566+
Map<String, Object> output = new LinkedHashMap<>();
3567+
output.put("__kind", "expression");
3568+
output.put("exprType", "Variable");
3569+
output.put(
3570+
"name",
3571+
((ReactNativeFirebaseFirestorePipelineParser.ParsedVariableExpressionNode) expression)
3572+
.name);
3573+
enterFrame.box.value = output;
3574+
continue;
3575+
}
3576+
35353577
ReactNativeFirebaseFirestorePipelineParser.ParsedFunctionExpressionNode function =
35363578
(ReactNativeFirebaseFirestorePipelineParser.ParsedFunctionExpressionNode) expression;
35373579
List<SerializedValueBox> argBoxes = new ArrayList<>(function.args.size());

packages/firestore/android/src/reactnative/java/io/invertase/firebase/firestore/ReactNativeFirebaseFirestorePipelineParser.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -943,6 +943,15 @@ private static void parseExpressionValueTree(ExpressionValueParseFrame initialFr
943943
stack.push(new ValueEnterFrame(map.get("value"), valueBox, fieldName + ".value"));
944944
continue;
945945
}
946+
if ("variable".equals(normalizedType)) {
947+
Object nameValue = map.get("name");
948+
if (!(nameValue instanceof String) || ((String) nameValue).isEmpty()) {
949+
throw new ReactNativeFirebaseFirestorePipelineExecutor.PipelineValidationException(
950+
"pipelineExecute() expected " + fieldName + ".name to be a non-empty string.");
951+
}
952+
enterFrame.box.value = new ParsedVariableExpressionNode((String) nameValue);
953+
continue;
954+
}
946955
}
947956

948957
if (map.containsKey("name")) {
@@ -1636,6 +1645,14 @@ static final class ParsedConstantExpressionNode extends ParsedExpressionNode {
16361645
}
16371646
}
16381647

1648+
static final class ParsedVariableExpressionNode extends ParsedExpressionNode {
1649+
final String name;
1650+
1651+
ParsedVariableExpressionNode(String name) {
1652+
this.name = name;
1653+
}
1654+
}
1655+
16391656
static final class ParsedFunctionExpressionNode extends ParsedExpressionNode {
16401657
final String name;
16411658
final List<ParsedValueNode> args;

0 commit comments

Comments
 (0)