-
Notifications
You must be signed in to change notification settings - Fork 1
BASE.query.Queryable
Queryables create a common way to describe a query acrossed multiple data stores. This allows you to switch databases without touching your application queries. Its extremely powerful.
BASE.require([
"BASE.query.Queryable",
"BASE.query.ArrayProvider"
], function(){
var Queryable = BASE.query.Queryable;
var ArrayProvider = BASE.query.ArrayProvider
var queryable = new Queryable();
// The queryable gives you another instance of
// queryable everytime you modify the queryable.
// So make sure you assign it to the variable you want.
// We'll just reassign it to queryable.
queryable = queryable.where(function(expressionBuilder){
return expressionBuilder.property("name").isEqualTo("John");
});
var array = [{name: "John"}, {name: "Jane"}];
var arrayProvider = new ArrayProvider(array);
queryable.provider = arrayProvider;
queryable.toArrayAsync().then(function(array){
console.log(array.length); // ==> 1
});
});
This example is silly because most of the time its not a local array you are trying to query. But just know that you can switch that provider at anytime and not change any of the existing code.
Queryables are not tightly coupled to their providers. So you can assign new providers on the fly and the queryable will try to get the values from the new provider.
Here is a full list of the property comparative operators on the expression builder.
For strings, numbers, booleans, dates, null.
- isEqualTo(value)
- isNotEqualTo(value)
For strings.
- startsWith(value)
- endsWith(value)
- contains(value)
For numbers, dates.
- isGreaterThan(number)
- isGreaterThanOrEqualTo(number)
- isLessThan(number)
- isLessThanOrEqualTo(number)
For comparing to multiple values.
- isIn([1,2,3]) The property is one of these values
- isNotIn([1,2,3])
//...
queryable.where(function(expressionBuilder){
// You use expressionBuilder.or as well.
return expressionBuilder.and(
expressionBuilder.property("age").isGreaterThan(20),
expressionBuilder.property("name").isEqualTo("John")
);
});
//...
Nested.
//...
queryable.where(function(expressionBuilder){
// You use expressionBuilder.or as well.
return expressionBuilder.or(
expressionBuilder.and(
expressionBuilder.property("age").isGreaterThan(20),
expressionBuilder.property("name").isEqualTo("John"),
),
expressionBuilder.and(
expressionBuilder.property("age").isLessThan(20),
expressionBuilder.property("name").isEqualTo("Jane"),
),
);
});
//...
#Instance Methods
This allows you to filter your result set with the expression builder.
queryable.where(filter: Function) ==> queryable
var queryable = new Queryable();
queryable.where(function(expressionBuilder){
return expressionBuilder.property("name").isEqualTo("Jared");
});
This allows you to order your result set by a property using the expression builder. The queryable.orderBy is ascending (A-Z). See queryable.orderByDesc to order the result set descending.
queryable.orderBy(propertySelector: Function) ==> queryable
var queryable = new Queryable();
queryable.orderBy(function(expressionBuilder){
return expressionBuilder.property("name");
});
This allows you to order your result set by a property using the expression builder. This orders your result set descending (Z-A).
queryable.orderBy(propertySelector: Function) ==> queryable
var queryable = new Queryable();
queryable.orderByDesc(function(expressionBuilder){
return expressionBuilder.property("name");
});
This allows you to skip x amount of results from the result set.
queryable.skip(count: number) ==> queryable
var queryable = new Queryable(); queryable.skip(10);
This allows you to take x amount of results from the result set. So even if there was millions of results, you may choose to only take one.
queryable.take(count: number) ==> queryable
var queryable = new Queryable(); queryable.skip(10);
This allows you to send parameters to your query provider. The queryable.setParameters is similiar to queryable.withParameters. The key difference is that queryable.setParameters adds or overrides existing properties, while queryable.withParameters wipes the existing parameters and sets supplied parameters.
queryable.setParameters(parameters: Object) ==> queryable
var queryable = new Queryable();
queryable.setParameters({
param1: "something"
});
This allows you to send parameters to your query provider. The queryable.setParameters is similiar to queryable.withParameters. The key difference is that queryable.setParameters adds or overrides existing properties, while queryable.withParameters wipes the existing parameters and sets supplied parameters.
queryable.withParameters(parameters: Object) ==> queryable
var queryable = new Queryable();
queryable.withParameters({
param1: "something"
});
This tells the queryable to ask the provider to get the results from the built queryable.
queryable.toArrayAsync() ==> Future<Array>
var queryable = new Queryable();
queryable.toArrayAsync().then(function(array){
console.log(array.length);
});
This tells the queryable to ask the provider to get the total count from the built queryable.
queryable.count() ==> Future<number>
var queryable = new Queryable();
queryable.count().then(function(count){
console.log(count);
});
This allows you to find out if all results match your queryable.
queryable.all() ==> Future<boolean>
var queryable = new Queryable();
queryable.where(function(expressionBuilder){
return expressionBuilder.property("firstName").isEqualTo("John");
}).all().then(function(allMatch){
console.log(allMatch);
});
or
var queryable = new Queryable();
queryable.all(function(expressionBuilder){
return expressionBuilder.property("firstName").isEqualTo("John");
}).then(function(allMatch){
console.log(allMatch);
});
This allows you to find out if any of the results match your queryable.
queryable.all() ==> Future<boolean>
var queryable = new Queryable();
queryable.where(function(expressionBuilder){
return expressionBuilder.property("firstName").isEqualTo("John");
}).any().then(function(someMatch){
console.log(someMatch);
});
or
var queryable = new Queryable();
queryable.any(function(expressionBuilder){
return expressionBuilder.property("firstName").isEqualTo("John");
}).then(function(someMatch){
console.log(someMatch);
});
This allows you to merge an existing queryable into this queryable.
queryable.merge(queryable) ==> queryable
var queryable1 = new Queryable().where(function(expressionBuilder){
return expressionBuilder.property("firstName").isEqualTo("John");
});
var queryable2 = new Queryable().where(function(expressionBuilder){
return expressionBuilder.property("lastName").isEqualTo("Doe");
});
var mergedQueryable = queryable1.merge(queryable2);
This allows you to copy the queryable.
queryable.copy() ==> queryable
var queryable = new Queryable(); var copy = queryable.copy();