Skip to content

Commit c8b019e

Browse files
committed
Prepare for 3.0.0-beta.6
1 parent a4700cc commit c8b019e

File tree

4 files changed

+117
-48
lines changed

4 files changed

+117
-48
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
##### 3.0.0-beta.6 - 17 May 2016
2+
3+
###### Backwards compatible changes
4+
- Added support for grouped "where" clauses
5+
16
##### 3.0.0-beta.5 - 10 May 2016
27

38
###### Breaking changes

mocha.start.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import 'babel-polyfill'
66

77
import * as JSData from 'js-data'
8-
import JSDataAdapterTests from 'js-data-adapter-tests'
8+
import JSDataAdapterTests from './node_modules/js-data-adapter/dist/js-data-adapter-tests'
99
import * as JSDataRethinkDB from './src/index'
1010

1111
const assert = global.assert = JSDataAdapterTests.assert

package.json

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "js-data-rethinkdb",
33
"description": "RethinkDB adapter for js-data.",
4-
"version": "3.0.0-beta.5",
4+
"version": "3.0.0-beta.6",
55
"homepage": "https://github.com/js-data/js-data-rethinkdb",
66
"repository": {
77
"type": "git",
@@ -59,22 +59,14 @@
5959
"release": "npm test && npm run doc && repo-tools updates && repo-tools changelog && repo-tools authors"
6060
},
6161
"dependencies": {
62-
"js-data-adapter": "~0.6.1",
62+
"js-data-adapter": "~0.7.2",
6363
"mout": "1.0.0"
6464
},
6565
"peerDependencies": {
66-
"js-data": "^3.0.0-beta.5",
66+
"js-data": "^3.0.0-beta.6",
6767
"rethinkdbdash": ">=2.0.0"
6868
},
6969
"devDependencies": {
70-
"babel-polyfill": "6.8.0",
71-
"babel-preset-es2015-rollup": "1.1.1",
72-
"js-data-adapter-tests": "^2.0.0-alpha.20",
73-
"js-data-repo-tools": "0.5.1",
74-
"nyc": "6.4.4",
75-
"rollup": "0.26.2",
76-
"rollup-plugin-babel": "2.4.0",
77-
"source-map-support": "0.4.0",
78-
"watch": "0.18.0"
70+
"js-data-repo-tools": "0.5.2"
7971
}
8072
}

src/index.js

Lines changed: 107 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -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
*/
5051
export 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

Comments
 (0)