[android][database] final cleanup of RNFirebaseDatabaseReference for v3.
This commit is contained in:
parent
0737f53dea
commit
b322af0f40
@ -1,8 +1,8 @@
|
|||||||
package io.invertase.firebase.database;
|
package io.invertase.firebase.database;
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
@ -32,12 +32,9 @@ class RNFirebaseDatabaseReference {
|
|||||||
private HashMap<String, ChildEventListener> childEventListeners;
|
private HashMap<String, ChildEventListener> childEventListeners;
|
||||||
private HashMap<String, ValueEventListener> valueEventListeners;
|
private HashMap<String, ValueEventListener> valueEventListeners;
|
||||||
|
|
||||||
Query getQuery() {
|
|
||||||
return query;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TODO
|
* RNFirebase wrapper around FirebaseDatabaseReference,
|
||||||
|
* handles Query generation and event listeners.
|
||||||
*
|
*
|
||||||
* @param context
|
* @param context
|
||||||
* @param app
|
* @param app
|
||||||
@ -47,11 +44,22 @@ class RNFirebaseDatabaseReference {
|
|||||||
*/
|
*/
|
||||||
RNFirebaseDatabaseReference(ReactContext context, String app, String refKey, String refPath, ReadableArray modifiersArray) {
|
RNFirebaseDatabaseReference(ReactContext context, String app, String refKey, String refPath, ReadableArray modifiersArray) {
|
||||||
key = refKey;
|
key = refKey;
|
||||||
|
query = null;
|
||||||
appName = app;
|
appName = app;
|
||||||
reactContext = context;
|
reactContext = context;
|
||||||
childEventListeners = new HashMap<String, ChildEventListener>();
|
childEventListeners = new HashMap<>();
|
||||||
valueEventListeners = new HashMap<String, ValueEventListener>();
|
valueEventListeners = new HashMap<>();
|
||||||
query = buildDatabaseQueryAtPathAndModifiers(refPath, modifiersArray);
|
buildDatabaseQueryAtPathAndModifiers(refPath, modifiersArray);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used outside of class for keepSynced etc.
|
||||||
|
*
|
||||||
|
* @return Query
|
||||||
|
*/
|
||||||
|
Query getQuery() {
|
||||||
|
return query;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -91,28 +99,32 @@ class RNFirebaseDatabaseReference {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TODO
|
* Add a ValueEventListener to the query and internally keep a reference to it.
|
||||||
*
|
*
|
||||||
* @param eventRegistrationKey
|
* @param eventRegistrationKey
|
||||||
* @param listener
|
* @param listener
|
||||||
*/
|
*/
|
||||||
private void addEventListener(String eventRegistrationKey, ValueEventListener listener) {
|
private void addEventListener(String eventRegistrationKey, ValueEventListener listener) {
|
||||||
valueEventListeners.put(eventRegistrationKey, listener);
|
valueEventListeners.put(eventRegistrationKey, listener);
|
||||||
|
query.addValueEventListener(listener);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TODO
|
* Add a ChildEventListener to the query and internally keep a reference to it.
|
||||||
*
|
*
|
||||||
* @param eventRegistrationKey
|
* @param eventRegistrationKey
|
||||||
* @param listener
|
* @param listener
|
||||||
*/
|
*/
|
||||||
private void addEventListener(String eventRegistrationKey, ChildEventListener listener) {
|
private void addEventListener(String eventRegistrationKey, ChildEventListener listener) {
|
||||||
childEventListeners.put(eventRegistrationKey, listener);
|
childEventListeners.put(eventRegistrationKey, listener);
|
||||||
|
query.addChildEventListener(listener);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Listen for a single 'value' event from firebase.
|
* Listen for a single .once('value',..) event from firebase.
|
||||||
*
|
*
|
||||||
* @param promise
|
* @param promise
|
||||||
*/
|
*/
|
||||||
@ -135,7 +147,7 @@ class RNFirebaseDatabaseReference {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Listen for single 'child_X' event from firebase.
|
* Listen for single '.once(child_X, ...)' event from firebase.
|
||||||
*
|
*
|
||||||
* @param eventName
|
* @param eventName
|
||||||
* @param promise
|
* @param promise
|
||||||
@ -190,7 +202,7 @@ class RNFirebaseDatabaseReference {
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handles a React Native JS 'on' request and initializes listeners.
|
* Handles a React Native JS '.on(..)' request and initializes listeners.
|
||||||
*
|
*
|
||||||
* @param database
|
* @param database
|
||||||
* @param registration
|
* @param registration
|
||||||
@ -219,7 +231,7 @@ class RNFirebaseDatabaseReference {
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TODO
|
* Add a native .on('child_X',.. ) event listener.
|
||||||
*
|
*
|
||||||
* @param registration
|
* @param registration
|
||||||
* @param eventType
|
* @param eventType
|
||||||
@ -267,14 +279,14 @@ class RNFirebaseDatabaseReference {
|
|||||||
};
|
};
|
||||||
|
|
||||||
addEventListener(eventRegistrationKey, childEventListener);
|
addEventListener(eventRegistrationKey, childEventListener);
|
||||||
query.addChildEventListener(childEventListener);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TODO
|
* Add a native .on('value',.. ) event listener.
|
||||||
*
|
*
|
||||||
* @param registration
|
* @param registration
|
||||||
|
* @param database
|
||||||
*/
|
*/
|
||||||
private void addValueEventListener(final ReadableMap registration, final RNFirebaseDatabase database) {
|
private void addValueEventListener(final ReadableMap registration, final RNFirebaseDatabase database) {
|
||||||
final String eventRegistrationKey = registration.getString("eventRegistrationKey");
|
final String eventRegistrationKey = registration.getString("eventRegistrationKey");
|
||||||
@ -295,12 +307,12 @@ class RNFirebaseDatabaseReference {
|
|||||||
};
|
};
|
||||||
|
|
||||||
addEventListener(eventRegistrationKey, valueEventListener);
|
addEventListener(eventRegistrationKey, valueEventListener);
|
||||||
query.addValueEventListener(valueEventListener);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* Handles value/child update events.
|
||||||
|
*
|
||||||
* @param eventType
|
* @param eventType
|
||||||
* @param dataSnapshot
|
* @param dataSnapshot
|
||||||
* @param previousChildName
|
* @param previousChildName
|
||||||
@ -332,112 +344,182 @@ class RNFirebaseDatabaseReference {
|
|||||||
Utils.sendEvent(reactContext, "database_sync_event", event);
|
Utils.sendEvent(reactContext, "database_sync_event", event);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Query buildDatabaseQueryAtPathAndModifiers(String path, ReadableArray modifiers) {
|
/**
|
||||||
|
* @param path
|
||||||
|
* @param modifiers
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private void buildDatabaseQueryAtPathAndModifiers(String path, ReadableArray modifiers) {
|
||||||
FirebaseDatabase firebaseDatabase = RNFirebaseDatabase.getDatabaseForApp(appName);
|
FirebaseDatabase firebaseDatabase = RNFirebaseDatabase.getDatabaseForApp(appName);
|
||||||
|
|
||||||
Query query = firebaseDatabase.getReference(path);
|
query = firebaseDatabase.getReference(path);
|
||||||
List<Object> modifiersList = Utils.recursivelyDeconstructReadableArray(modifiers);
|
List<Object> modifiersList = Utils.recursivelyDeconstructReadableArray(modifiers);
|
||||||
|
|
||||||
// todo cleanup into utils
|
|
||||||
for (Object m : modifiersList) {
|
for (Object m : modifiersList) {
|
||||||
Map<String, Object> modifier = (Map) m;
|
Map modifier = (Map) m;
|
||||||
String type = (String) modifier.get("type");
|
String type = (String) modifier.get("type");
|
||||||
String name = (String) modifier.get("name");
|
String name = (String) modifier.get("name");
|
||||||
|
|
||||||
if ("orderBy".equals(type)) {
|
if ("orderBy".equals(type)) {
|
||||||
if ("orderByKey".equals(name)) {
|
applyOrderByModifier(name, type, modifier);
|
||||||
query = query.orderByKey();
|
|
||||||
} else if ("orderByPriority".equals(name)) {
|
|
||||||
query = query.orderByPriority();
|
|
||||||
} else if ("orderByValue".equals(name)) {
|
|
||||||
query = query.orderByValue();
|
|
||||||
} else if ("orderByChild".equals(name)) {
|
|
||||||
String key = (String) modifier.get("key");
|
|
||||||
query = query.orderByChild(key);
|
|
||||||
}
|
|
||||||
} else if ("limit".equals(type)) {
|
} else if ("limit".equals(type)) {
|
||||||
int limit = ((Double) modifier.get("limit")).intValue();
|
applyLimitModifier(name, type, modifier);
|
||||||
if ("limitToLast".equals(name)) {
|
|
||||||
query = query.limitToLast(limit);
|
|
||||||
} else if ("limitToFirst".equals(name)) {
|
|
||||||
query = query.limitToFirst(limit);
|
|
||||||
}
|
|
||||||
} else if ("filter".equals(type)) {
|
} else if ("filter".equals(type)) {
|
||||||
String valueType = (String) modifier.get("valueType");
|
applyFilterModifier(name, modifier);
|
||||||
String key = (String) modifier.get("key");
|
|
||||||
if ("equalTo".equals(name)) {
|
|
||||||
if ("number".equals(valueType)) {
|
|
||||||
double value = (Double) modifier.get("value");
|
|
||||||
if (key == null) {
|
|
||||||
query = query.equalTo(value);
|
|
||||||
} else {
|
|
||||||
query = query.equalTo(value, key);
|
|
||||||
}
|
|
||||||
} else if ("boolean".equals(valueType)) {
|
|
||||||
boolean value = (Boolean) modifier.get("value");
|
|
||||||
if (key == null) {
|
|
||||||
query = query.equalTo(value);
|
|
||||||
} else {
|
|
||||||
query = query.equalTo(value, key);
|
|
||||||
}
|
|
||||||
} else if ("string".equals(valueType)) {
|
|
||||||
String value = (String) modifier.get("value");
|
|
||||||
if (key == null) {
|
|
||||||
query = query.equalTo(value);
|
|
||||||
} else {
|
|
||||||
query = query.equalTo(value, key);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if ("endAt".equals(name)) {
|
|
||||||
if ("number".equals(valueType)) {
|
|
||||||
double value = (Double) modifier.get("value");
|
|
||||||
if (key == null) {
|
|
||||||
query = query.endAt(value);
|
|
||||||
} else {
|
|
||||||
query = query.endAt(value, key);
|
|
||||||
}
|
|
||||||
} else if ("boolean".equals(valueType)) {
|
|
||||||
boolean value = (Boolean) modifier.get("value");
|
|
||||||
if (key == null) {
|
|
||||||
query = query.endAt(value);
|
|
||||||
} else {
|
|
||||||
query = query.endAt(value, key);
|
|
||||||
}
|
|
||||||
} else if ("string".equals(valueType)) {
|
|
||||||
String value = (String) modifier.get("value");
|
|
||||||
if (key == null) {
|
|
||||||
query = query.endAt(value);
|
|
||||||
} else {
|
|
||||||
query = query.endAt(value, key);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if ("startAt".equals(name)) {
|
|
||||||
if ("number".equals(valueType)) {
|
|
||||||
double value = (Double) modifier.get("value");
|
|
||||||
if (key == null) {
|
|
||||||
query = query.startAt(value);
|
|
||||||
} else {
|
|
||||||
query = query.startAt(value, key);
|
|
||||||
}
|
|
||||||
} else if ("boolean".equals(valueType)) {
|
|
||||||
boolean value = (Boolean) modifier.get("value");
|
|
||||||
if (key == null) {
|
|
||||||
query = query.startAt(value);
|
|
||||||
} else {
|
|
||||||
query = query.startAt(value, key);
|
|
||||||
}
|
|
||||||
} else if ("string".equals(valueType)) {
|
|
||||||
String value = (String) modifier.get("value");
|
|
||||||
if (key == null) {
|
|
||||||
query = query.startAt(value);
|
|
||||||
} else {
|
|
||||||
query = query.startAt(value, key);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return query;
|
/* =================
|
||||||
|
* QUERY MODIFIERS
|
||||||
|
* =================
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param name
|
||||||
|
* @param type
|
||||||
|
* @param modifier
|
||||||
|
*/
|
||||||
|
private void applyOrderByModifier(String name, String type, Map modifier) {
|
||||||
|
switch (name) {
|
||||||
|
case "orderByKey":
|
||||||
|
query = query.orderByKey();
|
||||||
|
break;
|
||||||
|
case "orderByPriority":
|
||||||
|
query = query.orderByPriority();
|
||||||
|
break;
|
||||||
|
case "orderByValue":
|
||||||
|
query = query.orderByValue();
|
||||||
|
break;
|
||||||
|
case "orderByChild":
|
||||||
|
String key = (String) modifier.get("key");
|
||||||
|
query = query.orderByChild(key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param name
|
||||||
|
* @param type
|
||||||
|
* @param modifier
|
||||||
|
*/
|
||||||
|
private void applyLimitModifier(String name, String type, Map modifier) {
|
||||||
|
int limit = ((Double) modifier.get("limit")).intValue();
|
||||||
|
if ("limitToLast".equals(name)) {
|
||||||
|
query = query.limitToLast(limit);
|
||||||
|
} else if ("limitToFirst".equals(name)) {
|
||||||
|
query = query.limitToFirst(limit);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param name
|
||||||
|
* @param modifier
|
||||||
|
*/
|
||||||
|
private void applyFilterModifier(String name, Map modifier) {
|
||||||
|
String valueType = (String) modifier.get("valueType");
|
||||||
|
String key = (String) modifier.get("key");
|
||||||
|
if ("equalTo".equals(name)) {
|
||||||
|
applyEqualToFilter(key, valueType, modifier);
|
||||||
|
} else if ("endAt".equals(name)) {
|
||||||
|
applyEndAtFilter(key, valueType, modifier);
|
||||||
|
} else if ("startAt".equals(name)) {
|
||||||
|
applyStartAtFilter(key, valueType, modifier);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ===============
|
||||||
|
* QUERY FILTERS
|
||||||
|
* ===============
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param key
|
||||||
|
* @param valueType
|
||||||
|
* @param modifier
|
||||||
|
*/
|
||||||
|
private void applyEqualToFilter(String key, String valueType, Map modifier) {
|
||||||
|
if ("number".equals(valueType)) {
|
||||||
|
double value = (Double) modifier.get("value");
|
||||||
|
if (key == null) {
|
||||||
|
query = query.equalTo(value);
|
||||||
|
} else {
|
||||||
|
query = query.equalTo(value, key);
|
||||||
|
}
|
||||||
|
} else if ("boolean".equals(valueType)) {
|
||||||
|
boolean value = (Boolean) modifier.get("value");
|
||||||
|
if (key == null) {
|
||||||
|
query = query.equalTo(value);
|
||||||
|
} else {
|
||||||
|
query = query.equalTo(value, key);
|
||||||
|
}
|
||||||
|
} else if ("string".equals(valueType)) {
|
||||||
|
String value = (String) modifier.get("value");
|
||||||
|
if (key == null) {
|
||||||
|
query = query.equalTo(value);
|
||||||
|
} else {
|
||||||
|
query = query.equalTo(value, key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param key
|
||||||
|
* @param valueType
|
||||||
|
* @param modifier
|
||||||
|
*/
|
||||||
|
private void applyEndAtFilter(String key, String valueType, Map modifier) {
|
||||||
|
if ("number".equals(valueType)) {
|
||||||
|
double value = (Double) modifier.get("value");
|
||||||
|
if (key == null) {
|
||||||
|
query = query.endAt(value);
|
||||||
|
} else {
|
||||||
|
query = query.endAt(value, key);
|
||||||
|
}
|
||||||
|
} else if ("boolean".equals(valueType)) {
|
||||||
|
boolean value = (Boolean) modifier.get("value");
|
||||||
|
if (key == null) {
|
||||||
|
query = query.endAt(value);
|
||||||
|
} else {
|
||||||
|
query = query.endAt(value, key);
|
||||||
|
}
|
||||||
|
} else if ("string".equals(valueType)) {
|
||||||
|
String value = (String) modifier.get("value");
|
||||||
|
if (key == null) {
|
||||||
|
query = query.endAt(value);
|
||||||
|
} else {
|
||||||
|
query = query.endAt(value, key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param key
|
||||||
|
* @param valueType
|
||||||
|
* @param modifier
|
||||||
|
*/
|
||||||
|
private void applyStartAtFilter(String key, String valueType, Map modifier) {
|
||||||
|
if ("number".equals(valueType)) {
|
||||||
|
double value = (Double) modifier.get("value");
|
||||||
|
if (key == null) {
|
||||||
|
query = query.startAt(value);
|
||||||
|
} else {
|
||||||
|
query = query.startAt(value, key);
|
||||||
|
}
|
||||||
|
} else if ("boolean".equals(valueType)) {
|
||||||
|
boolean value = (Boolean) modifier.get("value");
|
||||||
|
if (key == null) {
|
||||||
|
query = query.startAt(value);
|
||||||
|
} else {
|
||||||
|
query = query.startAt(value, key);
|
||||||
|
}
|
||||||
|
} else if ("string".equals(valueType)) {
|
||||||
|
String value = (String) modifier.get("value");
|
||||||
|
if (key == null) {
|
||||||
|
query = query.startAt(value);
|
||||||
|
} else {
|
||||||
|
query = query.startAt(value, key);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user