Replace Mongo query in preset precondition with flat filters
This commit is contained in:
1 parent
d50fd3d614
commit
737266eae5
3 files changed
+79
-4
No files matched your search
+3
-1
@@ -21,6 +21,8 @@ crypto = require 'crypto'
|
|||||||
later = require 'later'
|
later = require 'later'
|
||||||
|
|
||||||
db = require './db'
|
db = require './db'
|
||||||
|
query = require './query'
|
||||||
|
|
||||||
|
|
||||||
REFRESH = 3000
|
REFRESH = 3000
|
||||||
|
|
||||||
@@ -124,7 +126,7 @@ refresh = (callback) ->
|
|||||||
|
|
||||||
events = preset.events ? {}
|
events = preset.events ? {}
|
||||||
|
|
||||||
precondition = JSON.parse(preset.precondition)
|
precondition = query.convertMongoQueryToFilters(JSON.parse(preset.precondition))
|
||||||
|
|
||||||
_provisions = preset.provisions or []
|
_provisions = preset.provisions or []
|
||||||
|
|
||||||
|
|||||||
+6
-3
@@ -179,8 +179,9 @@ applyPresets = (currentRequest) ->
|
|||||||
(p.schedule.schedule and testSchedule(p.schedule, currentRequest.sessionData.timestamp)[0]))
|
(p.schedule.schedule and testSchedule(p.schedule, currentRequest.sessionData.timestamp)[0]))
|
||||||
|
|
||||||
filteredPresets.push(p)
|
filteredPresets.push(p)
|
||||||
for a in Object.keys(query.queryProjection(p.precondition))
|
for k of p.precondition
|
||||||
parameters[a] = common.parsePath(a)
|
p = k.split(/([^a-zA-Z0-9\-\_\.].*)/, 1)[0]
|
||||||
|
parameters[p] = common.parsePath(p)
|
||||||
|
|
||||||
declarations = []
|
declarations = []
|
||||||
for k, v of parameters
|
for k, v of parameters
|
||||||
@@ -196,12 +197,14 @@ applyPresets = (currentRequest) ->
|
|||||||
unpacked = device.unpack(currentRequest.sessionData.deviceData, v)
|
unpacked = device.unpack(currentRequest.sessionData.deviceData, v)
|
||||||
if unpacked[0] and (vv = currentRequest.sessionData.deviceData.attributes.get(unpacked[0]).value?[1])?
|
if unpacked[0] and (vv = currentRequest.sessionData.deviceData.attributes.get(unpacked[0]).value?[1])?
|
||||||
parameters[k] = vv[0]
|
parameters[k] = vv[0]
|
||||||
|
else
|
||||||
|
delete parameters[k]
|
||||||
|
|
||||||
if whiteList?
|
if whiteList?
|
||||||
session.addProvisions(currentRequest.sessionData, whiteList, whiteListProvisions)
|
session.addProvisions(currentRequest.sessionData, whiteList, whiteListProvisions)
|
||||||
|
|
||||||
for p in filteredPresets
|
for p in filteredPresets
|
||||||
if query.test(parameters, p.precondition)
|
if query.testFilter(parameters, p.precondition)
|
||||||
session.addProvisions(currentRequest.sessionData, p.channel, p.provisions)
|
session.addProvisions(currentRequest.sessionData, p.channel, p.provisions)
|
||||||
|
|
||||||
session.rpcRequest(currentRequest.sessionData, null, (err, id, rpcRequest) ->
|
session.rpcRequest(currentRequest.sessionData, null, (err, id, rpcRequest) ->
|
||||||
|
|||||||
@@ -242,6 +242,74 @@ test = (params, query) ->
|
|||||||
return true
|
return true
|
||||||
|
|
||||||
|
|
||||||
|
testFilter = (obj, filter) ->
|
||||||
|
for k, v of filter
|
||||||
|
[param, op] = k.split(/([^a-zA-Z0-9\-\_\.].*)/, 2)
|
||||||
|
val = common.matchType(obj[param], v)
|
||||||
|
switch op
|
||||||
|
when '=', undefined
|
||||||
|
return false if obj[param] != val
|
||||||
|
when '>'
|
||||||
|
return false if not (obj[param] > val)
|
||||||
|
when '>='
|
||||||
|
return false if not (obj[param] >= val)
|
||||||
|
when '<'
|
||||||
|
return false if not (obj[param] < val)
|
||||||
|
when '<='
|
||||||
|
return false if not (obj[param] <= val)
|
||||||
|
when '!'
|
||||||
|
return false if obj[param] == val
|
||||||
|
else
|
||||||
|
throw new Error("Unrecognized operator #{op}")
|
||||||
|
|
||||||
|
return true
|
||||||
|
|
||||||
|
|
||||||
|
convertMongoQueryToFilters = (query, filters) ->
|
||||||
|
filters ?= {}
|
||||||
|
for k, v of query
|
||||||
|
if k[0] == '$'
|
||||||
|
if k == '$and'
|
||||||
|
for vv in v
|
||||||
|
convertMongoQueryToFilters(vv, filters)
|
||||||
|
else
|
||||||
|
throw new Error("Operator #{k} not supported")
|
||||||
|
else if k == '_tags'
|
||||||
|
if common.typeOf(v) is common.OBJECT_TYPE
|
||||||
|
for kk, vv of v
|
||||||
|
vv = vv.replace(/[^a-zA-Z0-9\-]+/g, '_')
|
||||||
|
switch kk
|
||||||
|
when '$ne'
|
||||||
|
filters["Tags.#{vv}!"] = true
|
||||||
|
else
|
||||||
|
throw new Error("Operator #{kk} not supported")
|
||||||
|
else
|
||||||
|
v = v.replace(/[^a-zA-Z0-9\-]+/g, '_')
|
||||||
|
filters["Tags.#{v}"] = true
|
||||||
|
else
|
||||||
|
if common.typeOf(v) is common.OBJECT_TYPE
|
||||||
|
for kk, vv of v
|
||||||
|
switch kk
|
||||||
|
when '$eq'
|
||||||
|
filters[k] = vv
|
||||||
|
when '$ne'
|
||||||
|
filters["#{k}!"] = vv
|
||||||
|
when '$lt'
|
||||||
|
filters["#{k}<"] = vv
|
||||||
|
when '$lte'
|
||||||
|
filters["#{k}<="] = vv
|
||||||
|
when '$gt'
|
||||||
|
filters["#{k}>"] = vv
|
||||||
|
when '$gte'
|
||||||
|
filters["#{k}>="] = vv
|
||||||
|
else
|
||||||
|
throw new Error("Oprator #{kk} not supported")
|
||||||
|
else
|
||||||
|
filters[k] = v
|
||||||
|
|
||||||
|
return filters
|
||||||
|
|
||||||
|
|
||||||
sanitizeQueryTypes = (query, types) ->
|
sanitizeQueryTypes = (query, types) ->
|
||||||
for k, v of query
|
for k, v of query
|
||||||
if k[0] == '$' # logical operator
|
if k[0] == '$' # logical operator
|
||||||
@@ -268,3 +336,5 @@ exports.expand = expand
|
|||||||
exports.queryProjection = queryProjection
|
exports.queryProjection = queryProjection
|
||||||
exports.test = test
|
exports.test = test
|
||||||
exports.sanitizeQueryTypes = sanitizeQueryTypes
|
exports.sanitizeQueryTypes = sanitizeQueryTypes
|
||||||
|
exports.convertMongoQueryToFilters = convertMongoQueryToFilters
|
||||||
|
exports.testFilter = testFilter
|
||||||
Reference in new issue
Block a user