Skip to content
This repository was archived by the owner on Feb 13, 2018. It is now read-only.

BASE.query.Queryable

Jared Barnes edited this page Nov 20, 2015 · 10 revisions

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.

Property Operators

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])

Using And and Or

     //...

    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

queryable.where

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");
});

queryable.orderBy

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");
});

queryable.orderByDesc

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");
});

queryable.skip

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);

queryable.take

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);

queryable.setParameters

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"
});

queryable.withParameters

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"
});

queryable.toArrayAsync

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);
});

queryable.count

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);
});

queryable.all

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);
});

queryable.all

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);
});

queryable.merge

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);

queryable.copy

This allows you to copy the queryable.

queryable.copy() ==> queryable

var queryable = new Queryable();

var copy = queryable.copy();

Clone this wiki locally