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.toArray().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.

#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 expresssionBuilder.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 expresssionBuilder.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 expresssionBuilder.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);

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

    });

    //...

Clone this wiki locally