Visitar URL original
feat(database,android): fix order issue (#18142) · firebase/flutterfire@5dd661c · GitHub
Skip to content

Commit 5dd661c

Browse files
authored
feat(database,android): fix order issue (#18142)
* feat(database,android): fix order issue * clean
1 parent 2b50061 commit 5dd661c

1 file changed

Lines changed: 42 additions & 121 deletions

File tree

  • packages/firebase_database/firebase_database/android/src/main/kotlin/io/flutter/plugins/firebase/database

‎packages/firebase_database/firebase_database/android/src/main/kotlin/io/flutter/plugins/firebase/database/FirebaseDatabasePlugin.kt‎

Lines changed: 42 additions & 121 deletions
Original file line numberDiff line numberDiff line change
@@ -847,39 +847,30 @@ class FirebaseDatabasePlugin :
847847

848848
// Apply query modifiers if any
849849
var query: com.google.firebase.database.Query = reference
850-
var hasOrderModifier = false
850+
// Note: no hasOrderModifier needed — Android SDK defaults to PriorityIndex
851+
// when no orderBy is specified, so cursors work without an explicit orderBy.
851852

852853
for (modifier in request.modifiers) {
853854
when (modifier["type"] as String) {
854855
"orderBy" -> {
855856
when (modifier["name"] as String) {
856857
"orderByChild" -> {
857858
query = query.orderByChild(modifier["path"] as String)
858-
hasOrderModifier = true
859859
}
860860
"orderByKey" -> {
861861
query = query.orderByKey()
862-
hasOrderModifier = true
863862
}
864863
"orderByValue" -> {
865864
query = query.orderByValue()
866-
hasOrderModifier = true
867865
}
868866
"orderByPriority" -> {
869867
query = query.orderByPriority()
870-
hasOrderModifier = true
871868
}
872869
}
873870
}
874871
"cursor" -> {
875872
when (modifier["name"] as String) {
876873
"startAt" -> {
877-
if (!hasOrderModifier) {
878-
// Firebase Database requires an order modifier before startAt
879-
// For observe, we can't return null, so we'll create a query that returns no data
880-
query = query.limitToFirst(0)
881-
break
882-
}
883874
val value = modifier["value"]
884875
val key = modifier["key"] as String?
885876
query = when (value) {
@@ -889,12 +880,6 @@ class FirebaseDatabasePlugin :
889880
}
890881
}
891882
"startAfter" -> {
892-
if (!hasOrderModifier) {
893-
// Firebase Database requires an order modifier before startAfter
894-
// For observe, we can't return null, so we'll create a query that returns no data
895-
query = query.limitToFirst(0)
896-
break
897-
}
898883
val value = modifier["value"]
899884
val key = modifier["key"] as String?
900885
query = when (value) {
@@ -904,33 +889,21 @@ class FirebaseDatabasePlugin :
904889
}
905890
}
906891
"endAt" -> {
907-
if (!hasOrderModifier) {
908-
// Firebase Database requires an order modifier before endAt
909-
// For observe, we return all values when no order modifier is applied
910-
// This matches the expected test behavior
911-
} else {
912-
val value = modifier["value"]
913-
val key = modifier["key"] as String?
914-
query = when (value) {
915-
is Boolean -> if (key == null) query.endAt(value) else query.endAt(value, key)
916-
is Number -> if (key == null) query.endAt(value.toDouble()) else query.endAt(value.toDouble(), key)
917-
else -> if (key == null) query.endAt(value.toString()) else query.endAt(value.toString(), key)
918-
}
892+
val value = modifier["value"]
893+
val key = modifier["key"] as String?
894+
query = when (value) {
895+
is Boolean -> if (key == null) query.endAt(value) else query.endAt(value, key)
896+
is Number -> if (key == null) query.endAt(value.toDouble()) else query.endAt(value.toDouble(), key)
897+
else -> if (key == null) query.endAt(value.toString()) else query.endAt(value.toString(), key)
919898
}
920899
}
921900
"endBefore" -> {
922-
if (!hasOrderModifier) {
923-
// Firebase Database requires an order modifier before endBefore
924-
// For observe, we return all values when no order modifier is applied
925-
// This matches the expected test behavior
926-
} else {
927-
val value = modifier["value"]
928-
val key = modifier["key"] as String?
929-
query = when (value) {
930-
is Boolean -> if (key == null) query.endBefore(value) else query.endBefore(value, key)
931-
is Number -> if (key == null) query.endBefore(value.toDouble()) else query.endBefore(value.toDouble(), key)
932-
else -> if (key == null) query.endBefore(value.toString()) else query.endBefore(value.toString(), key)
933-
}
901+
val value = modifier["value"]
902+
val key = modifier["key"] as String?
903+
query = when (value) {
904+
is Boolean -> if (key == null) query.endBefore(value) else query.endBefore(value, key)
905+
is Number -> if (key == null) query.endBefore(value.toDouble()) else query.endBefore(value.toDouble(), key)
906+
else -> if (key == null) query.endBefore(value.toString()) else query.endBefore(value.toString(), key)
934907
}
935908
}
936909
}
@@ -977,39 +950,30 @@ class FirebaseDatabasePlugin :
977950

978951
// Apply query modifiers if any
979952
var query: com.google.firebase.database.Query = reference
980-
var hasOrderModifier = false
953+
// Note: no hasOrderModifier needed — Android SDK defaults to PriorityIndex
954+
// when no orderBy is specified, so cursors work without an explicit orderBy.
981955

982956
for (modifier in request.modifiers) {
983957
when (modifier["type"] as String) {
984958
"orderBy" -> {
985959
when (modifier["name"] as String) {
986960
"orderByChild" -> {
987961
query = query.orderByChild(modifier["path"] as String)
988-
hasOrderModifier = true
989962
}
990963
"orderByKey" -> {
991964
query = query.orderByKey()
992-
hasOrderModifier = true
993965
}
994966
"orderByValue" -> {
995967
query = query.orderByValue()
996-
hasOrderModifier = true
997968
}
998969
"orderByPriority" -> {
999970
query = query.orderByPriority()
1000-
hasOrderModifier = true
1001971
}
1002972
}
1003973
}
1004974
"cursor" -> {
1005975
when (modifier["name"] as String) {
1006976
"startAt" -> {
1007-
if (!hasOrderModifier) {
1008-
// Firebase Database requires an order modifier before startAt
1009-
// For keepSync, we can't return null, so we'll create a query that returns no data
1010-
query = query.limitToFirst(0)
1011-
break
1012-
}
1013977
val value = modifier["value"]
1014978
val key = modifier["key"] as String?
1015979
query = when (value) {
@@ -1019,12 +983,6 @@ class FirebaseDatabasePlugin :
1019983
}
1020984
}
1021985
"startAfter" -> {
1022-
if (!hasOrderModifier) {
1023-
// Firebase Database requires an order modifier before startAfter
1024-
// For keepSync, we can't return null, so we'll create a query that returns no data
1025-
query = query.limitToFirst(0)
1026-
break
1027-
}
1028986
val value = modifier["value"]
1029987
val key = modifier["key"] as String?
1030988
query = when (value) {
@@ -1034,33 +992,21 @@ class FirebaseDatabasePlugin :
1034992
}
1035993
}
1036994
"endAt" -> {
1037-
if (!hasOrderModifier) {
1038-
// Firebase Database requires an order modifier before endAt
1039-
// For keepSync, we return all values when no order modifier is applied
1040-
// This matches the expected test behavior
1041-
} else {
1042-
val value = modifier["value"]
1043-
val key = modifier["key"] as String?
1044-
query = when (value) {
1045-
is Boolean -> if (key == null) query.endAt(value) else query.endAt(value, key)
1046-
is Number -> if (key == null) query.endAt(value.toDouble()) else query.endAt(value.toDouble(), key)
1047-
else -> if (key == null) query.endAt(value.toString()) else query.endAt(value.toString(), key)
1048-
}
995+
val value = modifier["value"]
996+
val key = modifier["key"] as String?
997+
query = when (value) {
998+
is Boolean -> if (key == null) query.endAt(value) else query.endAt(value, key)
999+
is Number -> if (key == null) query.endAt(value.toDouble()) else query.endAt(value.toDouble(), key)
1000+
else -> if (key == null) query.endAt(value.toString()) else query.endAt(value.toString(), key)
10491001
}
10501002
}
10511003
"endBefore" -> {
1052-
if (!hasOrderModifier) {
1053-
// Firebase Database requires an order modifier before endBefore
1054-
// For keepSync, we return all values when no order modifier is applied
1055-
// This matches the expected test behavior
1056-
} else {
1057-
val value = modifier["value"]
1058-
val key = modifier["key"] as String?
1059-
query = when (value) {
1060-
is Boolean -> if (key == null) query.endBefore(value) else query.endBefore(value, key)
1061-
is Number -> if (key == null) query.endBefore(value.toDouble()) else query.endBefore(value.toDouble(), key)
1062-
else -> if (key == null) query.endBefore(value.toString()) else query.endBefore(value.toString(), key)
1063-
}
1004+
val value = modifier["value"]
1005+
val key = modifier["key"] as String?
1006+
query = when (value) {
1007+
is Boolean -> if (key == null) query.endBefore(value) else query.endBefore(value, key)
1008+
is Number -> if (key == null) query.endBefore(value.toDouble()) else query.endBefore(value.toDouble(), key)
1009+
else -> if (key == null) query.endBefore(value.toString()) else query.endBefore(value.toString(), key)
10641010
}
10651011
}
10661012
}
@@ -1095,38 +1041,30 @@ class FirebaseDatabasePlugin :
10951041

10961042
// Apply query modifiers if any
10971043
var query: com.google.firebase.database.Query = reference
1098-
var hasOrderModifier = false
1044+
// Note: no hasOrderModifier needed — Android SDK defaults to PriorityIndex
1045+
// when no orderBy is specified, so cursors work without an explicit orderBy.
10991046

11001047
for (modifier in request.modifiers) {
11011048
when (modifier["type"] as String) {
11021049
"orderBy" -> {
11031050
when (modifier["name"] as String) {
11041051
"orderByChild" -> {
11051052
query = query.orderByChild(modifier["path"] as String)
1106-
hasOrderModifier = true
11071053
}
11081054
"orderByKey" -> {
11091055
query = query.orderByKey()
1110-
hasOrderModifier = true
11111056
}
11121057
"orderByValue" -> {
11131058
query = query.orderByValue()
1114-
hasOrderModifier = true
11151059
}
11161060
"orderByPriority" -> {
11171061
query = query.orderByPriority()
1118-
hasOrderModifier = true
11191062
}
11201063
}
11211064
}
11221065
"cursor" -> {
11231066
when (modifier["name"] as String) {
11241067
"startAt" -> {
1125-
if (!hasOrderModifier) {
1126-
// Firebase Database requires an order modifier before startAt
1127-
callback(KotlinResult.success(mapOf("snapshot" to null)))
1128-
return
1129-
}
11301068
val value = modifier["value"]
11311069
val key = modifier["key"] as String?
11321070
query = when (value) {
@@ -1136,11 +1074,6 @@ class FirebaseDatabasePlugin :
11361074
}
11371075
}
11381076
"startAfter" -> {
1139-
if (!hasOrderModifier) {
1140-
// Firebase Database requires an order modifier before startAfter
1141-
callback(KotlinResult.success(mapOf("snapshot" to null)))
1142-
return
1143-
}
11441077
val value = modifier["value"]
11451078
val key = modifier["key"] as String?
11461079
query = when (value) {
@@ -1150,33 +1083,21 @@ class FirebaseDatabasePlugin :
11501083
}
11511084
}
11521085
"endAt" -> {
1153-
if (!hasOrderModifier) {
1154-
// Firebase Database requires an order modifier before endAt
1155-
// For get, we return all values when no order modifier is applied
1156-
// This matches the expected test behavior
1157-
} else {
1158-
val value = modifier["value"]
1159-
val key = modifier["key"] as String?
1160-
query = when (value) {
1161-
is Boolean -> if (key == null) query.endAt(value) else query.endAt(value, key)
1162-
is Number -> if (key == null) query.endAt(value.toDouble()) else query.endAt(value.toDouble(), key)
1163-
else -> if (key == null) query.endAt(value.toString()) else query.endAt(value.toString(), key)
1164-
}
1086+
val value = modifier["value"]
1087+
val key = modifier["key"] as String?
1088+
query = when (value) {
1089+
is Boolean -> if (key == null) query.endAt(value) else query.endAt(value, key)
1090+
is Number -> if (key == null) query.endAt(value.toDouble()) else query.endAt(value.toDouble(), key)
1091+
else -> if (key == null) query.endAt(value.toString()) else query.endAt(value.toString(), key)
11651092
}
11661093
}
11671094
"endBefore" -> {
1168-
if (!hasOrderModifier) {
1169-
// Firebase Database requires an order modifier before endBefore
1170-
// For get, we return all values when no order modifier is applied
1171-
// This matches the expected test behavior
1172-
} else {
1173-
val value = modifier["value"]
1174-
val key = modifier["key"] as String?
1175-
query = when (value) {
1176-
is Boolean -> if (key == null) query.endBefore(value) else query.endBefore(value, key)
1177-
is Number -> if (key == null) query.endBefore(value.toDouble()) else query.endBefore(value.toDouble(), key)
1178-
else -> if (key == null) query.endBefore(value.toString()) else query.endBefore(value.toString(), key)
1179-
}
1095+
val value = modifier["value"]
1096+
val key = modifier["key"] as String?
1097+
query = when (value) {
1098+
is Boolean -> if (key == null) query.endBefore(value) else query.endBefore(value, key)
1099+
is Number -> if (key == null) query.endBefore(value.toDouble()) else query.endBefore(value.toDouble(), key)
1100+
else -> if (key == null) query.endBefore(value.toString()) else query.endBefore(value.toString(), key)
11801101
}
11811102
}
11821103
}

0 commit comments

Comments
 (0)