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
+24 -18
+24 -18
View File
@@ -105,23 +105,30 @@ splitIds = (batches, callback) ->
compileAliases = (callback) -> compileAliases = (callback) ->
map = () -> map = () ->
for key, parts of keys recurse = (partIndex, ref) ->
ref = this part = parts[partIndex]
path = '' res = []
for part in parts
if part.test? if part.test?
r = ref for p of ref
ref = null
for p of r
if part.test(p) if part.test(p)
path += ".#{p}" if partIndex == parts.length - 1
ref = r[p] res.push(p)
break
else else
path += ".#{part}" for r in recurse(partIndex + 1, ref[p])
ref = ref[part] res.push("#{p}.#{r}")
break if not ref else
emit(path[1..], key) if ref 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 alias in recurse(0, this)
emit(alias, key)
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
) )