@@ -28,6 +28,7 @@ const notEqual = function (r, row, field, value) {
2828 * Default predicate functions for the filtering operators.
2929 *
3030 * @name module:js-data-rethinkdb.OPERATORS
31+ * @property {Function } = Equality operator.
3132 * @property {Function } == Equality operator.
3233 * @property {Function } != Inequality operator.
3334 * @property {Function } > "Greater than" operator.
@@ -48,6 +49,7 @@ const notEqual = function (r, row, field, value) {
4849 * contain the provided value.
4950 */
5051export const OPERATORS = {
52+ '=' : equal ,
5153 '==' : equal ,
5254 '===' : equal ,
5355 '!=' : notEqual ,
@@ -493,12 +495,95 @@ utils.addHiddenPropsToTarget(RethinkDBAdapter.prototype, {
493495 } )
494496 } ,
495497
496- selectDb ( opts ) {
497- return this . r . db ( utils . isUndefined ( opts . db ) ? this . rOpts . db : opts . db )
498+ _applyWhereFromObject ( where ) {
499+ const fields = [ ]
500+ const ops = [ ]
501+ const predicates = [ ]
502+ utils . forOwn ( where , ( clause , field ) => {
503+ if ( ! utils . isObject ( clause ) ) {
504+ clause = {
505+ '==' : clause
506+ }
507+ }
508+ utils . forOwn ( clause , ( expr , op ) => {
509+ fields . push ( field )
510+ ops . push ( op )
511+ predicates . push ( expr )
512+ } )
513+ } )
514+ return {
515+ fields,
516+ ops,
517+ predicates
518+ }
498519 } ,
499520
500- selectTable ( mapper , opts ) {
501- return this . selectDb ( opts ) . table ( mapper . table || underscore ( mapper . name ) )
521+ _applyWhereFromArray ( where ) {
522+ const groups = [ ]
523+ where . forEach ( ( _where , i ) => {
524+ if ( utils . isString ( _where ) ) {
525+ return
526+ }
527+ const prev = where [ i - 1 ]
528+ const parser = utils . isArray ( _where ) ? this . _applyWhereFromArray : this . _applyWhereFromObject
529+ const group = parser . call ( this , _where )
530+ if ( prev === 'or' ) {
531+ group . isOr = true
532+ }
533+ groups . push ( group )
534+ } )
535+ groups . isArray = true
536+ return groups
537+ } ,
538+
539+ _testObjectGroup ( rql , group , row , opts ) {
540+ let i
541+ const r = this . r
542+ const fields = group . fields
543+ const ops = group . ops
544+ const predicates = group . predicates
545+ const len = ops . length
546+ for ( i = 0 ; i < len ; i ++ ) {
547+ let op = ops [ i ]
548+ const isOr = op . charAt ( 0 ) === '|'
549+ op = isOr ? op . substr ( 1 ) : op
550+ const predicateFn = this . getOperator ( op , opts )
551+ if ( predicateFn ) {
552+ const predicateResult = predicateFn ( r , row , fields [ i ] , predicates [ i ] )
553+ if ( isOr ) {
554+ rql = rql ? rql . or ( predicateResult ) : predicateResult
555+ } else {
556+ rql = rql ? rql . and ( predicateResult ) : predicateResult
557+ }
558+ } else {
559+ throw new Error ( `Operator ${ op } not supported!` )
560+ }
561+ }
562+ return rql
563+ } ,
564+
565+ _testArrayGroup ( rql , groups , row , opts ) {
566+ let i
567+ const len = groups . length
568+ for ( i = 0 ; i < len ; i ++ ) {
569+ const group = groups [ i ]
570+ let subQuery
571+ if ( group . isArray ) {
572+ subQuery = this . _testArrayGroup ( rql , group , row , opts )
573+ } else {
574+ subQuery = this . _testObjectGroup ( null , group , row , opts )
575+ }
576+ if ( groups [ i - 1 ] ) {
577+ if ( group . isOr ) {
578+ rql = rql . or ( subQuery )
579+ } else {
580+ rql = rql . and ( subQuery )
581+ }
582+ } else {
583+ rql = rql ? rql . and ( subQuery ) : subQuery
584+ }
585+ }
586+ return rql
502587 } ,
503588
504589 /**
@@ -546,37 +631,16 @@ utils.addHiddenPropsToTarget(RethinkDBAdapter.prototype, {
546631 let rql = sequence
547632
548633 // Filter
549- if ( Object . keys ( query . where ) . length !== 0 ) {
550- // Filter sequence using filter function
551- rql = rql . filter ( ( row ) => {
552- let subQuery
553- // Apply filter for each field
554- utils . forOwn ( query . where , ( criteria , field ) => {
555- if ( ! utils . isObject ( criteria ) ) {
556- criteria = { '==' : criteria }
557- }
558- // Apply filter for each operator
559- utils . forOwn ( criteria , ( value , operator ) => {
560- let isOr = false
561- if ( operator && operator [ 0 ] === '|' ) {
562- operator = operator . substr ( 1 )
563- isOr = true
564- }
565- let predicateFn = this . getOperator ( operator , opts )
566- if ( predicateFn ) {
567- const predicateResult = predicateFn ( r , row , field , value )
568- if ( isOr ) {
569- subQuery = subQuery ? subQuery . or ( predicateResult ) : predicateResult
570- } else {
571- subQuery = subQuery ? subQuery . and ( predicateResult ) : predicateResult
572- }
573- } else {
574- throw new Error ( `Operator ${ operator } not supported!` )
575- }
576- } )
577- } )
578- return subQuery || true
579- } )
634+ let groups
635+
636+ if ( utils . isObject ( query . where ) && Object . keys ( query . where ) . length !== 0 ) {
637+ groups = this . _applyWhereFromArray ( [ query . where ] )
638+ } else if ( utils . isArray ( query . where ) ) {
639+ groups = this . _applyWhereFromArray ( query . where )
640+ }
641+
642+ if ( groups ) {
643+ rql = rql . filter ( ( row ) => this . _testArrayGroup ( null , groups , row , opts ) || true )
580644 }
581645
582646 // Sort
@@ -607,6 +671,14 @@ utils.addHiddenPropsToTarget(RethinkDBAdapter.prototype, {
607671 return rql
608672 } ,
609673
674+ selectDb ( opts ) {
675+ return this . r . db ( utils . isUndefined ( opts . db ) ? this . rOpts . db : opts . db )
676+ } ,
677+
678+ selectTable ( mapper , opts ) {
679+ return this . selectDb ( opts ) . table ( mapper . table || underscore ( mapper . name ) )
680+ } ,
681+
610682 waitForDb ( opts ) {
611683 opts || ( opts = { } )
612684 const db = utils . isUndefined ( opts . db ) ? this . rOpts . db : opts . db
0 commit comments