use of com.google.firebase.firestore.core.Filter in project firebase-android-sdk by firebase.
the class RemoteSerializer method encodeCompositeFilter.
@VisibleForTesting
StructuredQuery.Filter encodeCompositeFilter(com.google.firebase.firestore.core.CompositeFilter compositeFilter) {
List<StructuredQuery.Filter> protos = new ArrayList<>(compositeFilter.getFilters().size());
for (Filter filter : compositeFilter.getFilters()) {
protos.add(encodeFilter(filter));
}
// If there's only one filter in the composite filter, use it directly.
if (protos.size() == 1) {
return protos.get(0);
}
CompositeFilter.Builder composite = CompositeFilter.newBuilder();
composite.setOp(compositeFilter.getOperator());
composite.addAllFilters(protos);
return StructuredQuery.Filter.newBuilder().setCompositeFilter(composite).build();
}
use of com.google.firebase.firestore.core.Filter in project firebase-android-sdk by firebase.
the class RemoteSerializer method decodeQueryTarget.
public com.google.firebase.firestore.core.Target decodeQueryTarget(String parent, StructuredQuery query) {
ResourcePath path = decodeQueryPath(parent);
String collectionGroup = null;
int fromCount = query.getFromCount();
if (fromCount > 0) {
hardAssert(fromCount == 1, "StructuredQuery.from with more than one collection is not supported.");
CollectionSelector from = query.getFrom(0);
if (from.getAllDescendants()) {
collectionGroup = from.getCollectionId();
} else {
path = path.append(from.getCollectionId());
}
}
List<Filter> filterBy;
if (query.hasWhere()) {
filterBy = decodeFilters(query.getWhere());
} else {
filterBy = Collections.emptyList();
}
List<OrderBy> orderBy;
int orderByCount = query.getOrderByCount();
if (orderByCount > 0) {
orderBy = new ArrayList<>(orderByCount);
for (int i = 0; i < orderByCount; i++) {
orderBy.add(decodeOrderBy(query.getOrderBy(i)));
}
} else {
orderBy = Collections.emptyList();
}
long limit = com.google.firebase.firestore.core.Target.NO_LIMIT;
if (query.hasLimit()) {
limit = query.getLimit().getValue();
}
Bound startAt = null;
if (query.hasStartAt()) {
startAt = new Bound(query.getStartAt().getValuesList(), query.getStartAt().getBefore());
}
Bound endAt = null;
if (query.hasEndAt()) {
endAt = new Bound(query.getEndAt().getValuesList(), !query.getEndAt().getBefore());
}
return new com.google.firebase.firestore.core.Target(path, collectionGroup, filterBy, orderBy, limit, startAt, endAt);
}
use of com.google.firebase.firestore.core.Filter in project firebase-android-sdk by firebase.
the class BundleSerializer method decodeBundledQuery.
private BundledQuery decodeBundledQuery(JSONObject bundledQuery) throws JSONException {
JSONObject structuredQuery = bundledQuery.getJSONObject("structuredQuery");
verifyNoSelect(structuredQuery);
ResourcePath parent = decodeName(bundledQuery.getString("parent"));
JSONArray from = structuredQuery.getJSONArray("from");
verifyCollectionSelector(from);
JSONObject collectionSelector = from.getJSONObject(0);
boolean allDescendants = collectionSelector.optBoolean("allDescendants", false);
@Nullable String collectionGroup = null;
if (allDescendants) {
collectionGroup = collectionSelector.getString("collectionId");
} else {
parent = parent.append(collectionSelector.getString("collectionId"));
}
List<Filter> filters = decodeWhere(structuredQuery.optJSONObject("where"));
List<OrderBy> orderBys = decodeOrderBy(structuredQuery.optJSONArray("orderBy"));
@Nullable Bound startAt = decodeStartAtBound(structuredQuery.optJSONObject("startAt"));
@Nullable Bound endAt = decodeEndAtBound(structuredQuery.optJSONObject("endAt"));
verifyNoOffset(structuredQuery);
int limit = decodeLimit(structuredQuery);
Query.LimitType limitType = decodeLimitType(bundledQuery);
return new BundledQuery(new Target(parent, collectionGroup, filters, orderBys, limit, startAt, endAt), limitType);
}
use of com.google.firebase.firestore.core.Filter in project firebase-android-sdk by firebase.
the class SQLiteIndexManagerTest method testEqualsWithNotEqualsOnSameField.
@Test
public void testEqualsWithNotEqualsOnSameField() {
setUpSingleValueFilter();
Object[][] filtersAndResults = new Object[][] { new Filter[] { filter("count", ">", 1), filter("count", "!=", 2) }, new String[] { "coll/val3" }, new Filter[] { filter("count", "==", 1), filter("count", "!=", 2) }, new String[] { "coll/val1" }, new Filter[] { filter("count", "==", 1), filter("count", "!=", 1) }, new String[] {}, new Filter[] { filter("count", ">", 2), filter("count", "!=", 2) }, new String[] { "coll/val3" }, new Filter[] { filter("count", ">=", 2), filter("count", "!=", 2) }, new String[] { "coll/val3" }, new Filter[] { filter("count", "<=", 2), filter("count", "!=", 2) }, new String[] { "coll/val1" }, new Filter[] { filter("count", "<=", 2), filter("count", "!=", 1) }, new String[] { "coll/val2" }, new Filter[] { filter("count", "<", 2), filter("count", "!=", 2) }, new String[] { "coll/val1" }, new Filter[] { filter("count", "<", 2), filter("count", "!=", 1) }, new String[] {}, new Filter[] { filter("count", ">", 2), filter("count", "not-in", Collections.singletonList(3)) }, new String[] {}, new Filter[] { filter("count", ">=", 2), filter("count", "not-in", Collections.singletonList(3)) }, new String[] { "coll/val2" }, new Filter[] { filter("count", ">=", 2), filter("count", "not-in", Arrays.asList(3, 3)) }, new String[] { "coll/val2" }, new Filter[] { filter("count", ">", 1), filter("count", "<", 3), filter("count", "!=", 2) }, new String[] {}, new Filter[] { filter("count", ">=", 1), filter("count", "<", 3), filter("count", "!=", 2) }, new String[] { "coll/val1" }, new Filter[] { filter("count", ">=", 1), filter("count", "<=", 3), filter("count", "!=", 2) }, new String[] { "coll/val1", "coll/val3" }, new Filter[] { filter("count", ">", 1), filter("count", "<=", 3), filter("count", "!=", 2) }, new String[] { "coll/val3" } };
for (int i = 0; i < filtersAndResults.length; i += 2) {
Query query = query("coll");
for (Filter filter : (Filter[]) filtersAndResults[i]) {
query = query.filter(filter);
}
verifyResults(query, (String[]) filtersAndResults[i + 1]);
}
}
use of com.google.firebase.firestore.core.Filter in project firebase-android-sdk by firebase.
the class SQLiteIndexManager method getSubTargets.
private List<Target> getSubTargets(Target target) {
if (targetToDnfSubTargets.containsKey(target)) {
return targetToDnfSubTargets.get(target);
}
List<Target> subTargets = new ArrayList<>();
if (target.getFilters().isEmpty()) {
subTargets.add(target);
} else {
// There is an implicit AND operation between all the filters stored in the target.
List<Filter> dnf = LogicUtils.DnfTransform(new CompositeFilter(target.getFilters(), StructuredQuery.CompositeFilter.Operator.AND));
for (Filter term : dnf) {
subTargets.add(new Target(target.getPath(), target.getCollectionGroup(), term.getFilters(), target.getOrderBy(), target.getLimit(), target.getStartAt(), target.getEndAt()));
}
}
targetToDnfSubTargets.put(target, subTargets);
return subTargets;
}
Aggregations