Improved alogirthm of compiling aliases to avoid possible skipping of parameters in certain cases.

This commit is contained in:
Zaid Abdulla committed 2014-02-03 11:06:54 +03:00
1 parent 8d06f34c56
commit 2bd5d7e603
1 file changed
+26 -20
+26 -20
View File
@@ -105,23 +105,30 @@ splitIds = (batches, callback) ->
compileAliases = (callback) -> compileAliases = (callback) ->
map = () -> map = () ->
recurse = (partIndex, ref) ->
part = parts[partIndex]
res = []
if part.test?
for p of ref
if part.test(p)
if partIndex == parts.length - 1
res.push(p)
else
for r in recurse(partIndex + 1, ref[p])
res.push("#{p}.#{r}")
else
if ref[part]?
if partIndex == parts.length - 1
return [part]
else
for r in recurse(partIndex + 1, ref[part])
res.push("#{part}.#{r}")
return res
for key, parts of keys for key, parts of keys
ref = this for alias in recurse(0, this)
path = '' emit(alias, key)
for part in parts
if part.test?
r = ref
ref = null
for p of r
if part.test(p)
path += ".#{p}"
ref = r[p]
break
else
path += ".#{part}"
ref = ref[part]
break if not ref
emit(path[1..], key) if ref
return return
reduce = (k, v) -> reduce = (k, v) ->
@@ -144,8 +151,7 @@ compileAliases = (callback) ->
ar.push(p) ar.push(p)
if isStatic if isStatic
if not aliases[alias]? aliases[alias] ?= []
aliases[alias] = []
aliases[alias].push(k) aliases[alias].push(k)
else else
keys[k] = ar keys[k] = ar
@@ -164,8 +170,7 @@ compileAliases = (callback) ->
db.devicesCollection.mapReduce(map, reduce, options, (err, out) -> db.devicesCollection.mapReduce(map, reduce, options, (err, out) ->
for o in out for o in out
alias = config.PARAMETERS[o.value].alias alias = config.PARAMETERS[o.value].alias
if not aliases[alias]? aliases[alias] ?= []
aliases[alias] = []
id = String(o._id) id = String(o._id)
if id not in aliases[alias] if id not in aliases[alias]
aliases[alias].push(id) aliases[alias].push(id)
@@ -173,6 +178,7 @@ compileAliases = (callback) ->
if ++counter == batches.length if ++counter == batches.length
callback(err, aliases, config.ALIASES_CACHE) callback(err, aliases, config.ALIASES_CACHE)
) )
return
) )