Avoid generating RPCs for parameters that don't exist

This commit is contained in:
Zaid Abdulla committed 2016-11-07 00:31:37 -08:00
1 parent b4bbd8f58c
commit 3b987cc0cc
1 file changed
+41 -29
+41 -29
View File
@@ -411,7 +411,7 @@ runDeclarations = (sessionData, declarations) ->
else else
minInstances = maxInstances = declaration[3] minInstances = maxInstances = declaration[3]
parent = path.slice(0, -1) parent = sessionData.deviceData.paths.add(path.slice(0, -1))
if Array.isArray(path[path.length - 1]) if Array.isArray(path[path.length - 1])
keys = {} keys = {}
@@ -508,6 +508,10 @@ rpcRequest = (sessionData, _declarations, callback) ->
if not sessionData.syncState? if not sessionData.syncState?
return callback() return callback()
revision = sessionData.revisions[sessionData.revisions.length - 1] + 1
sessionData.deviceData.timestamps.revision = revision
sessionData.deviceData.attributes.revision = revision
inception = sessionData.declarations.length - 1 inception = sessionData.declarations.length - 1
provisions = generateGetVirtualParameterProvisions(sessionData, sessionData.syncState.virtualParameterDeclarations[inception]) provisions = generateGetVirtualParameterProvisions(sessionData, sessionData.syncState.virtualParameterDeclarations[inception])
@@ -683,32 +687,38 @@ generateGetRpcRequest = (sessionData) ->
GET_PARAMETER_NAMES_DEPTH_THRESHOLD = GET_PARAMETER_NAMES_DEPTH_THRESHOLD =
config.get('GET_PARAMETER_NAMES_DEPTH_THRESHOLD', sessionData.deviceId) config.get('GET_PARAMETER_NAMES_DEPTH_THRESHOLD', sessionData.deviceId)
path = Array.from(syncState.gpn.keys()).sort((a,b) -> a.length - b.length)[0] paths = Array.from(syncState.gpn.keys()).sort((a,b) -> b.length - a.length)
patterns = [] path = paths.pop()
iter = sessionData.deviceData.paths.superset(path, 99) while path and not sessionData.deviceData.attributes.has(path)
while p = iter.next().value
if v = syncState.gpnPatterns.get(p)
patterns.push([p, (v >> path.length) << path.length])
if path.length >= GET_PARAMETER_NAMES_DEPTH_THRESHOLD
est = estimateGpnCount(patterns)
else
est = 0
if est < Math.pow(2, Math.max(0, 8 - path.length))
nextLevel = true
syncState.gpn.delete(path) syncState.gpn.delete(path)
else path = paths.pop()
nextLevel = false
iter = sessionData.deviceData.paths.subset(path, 99)
while p = iter.next().value
syncState.gpn.delete(p)
return { if path
type: 'GetParameterNames' patterns = []
parameterPath: path.concat('').join('.') iter = sessionData.deviceData.paths.superset(path, 99)
nextLevel: nextLevel while p = iter.next().value
} if v = syncState.gpnPatterns.get(p)
patterns.push([p, (v >> path.length) << path.length])
if path.length >= GET_PARAMETER_NAMES_DEPTH_THRESHOLD
est = estimateGpnCount(patterns)
else
est = 0
if est < Math.pow(2, Math.max(0, 8 - path.length))
nextLevel = true
syncState.gpn.delete(path)
else
nextLevel = false
iter = sessionData.deviceData.paths.subset(path, 99)
while p = iter.next().value
syncState.gpn.delete(p)
return {
type: 'GetParameterNames'
parameterPath: path.concat('').join('.')
nextLevel: nextLevel
}
if syncState.refreshAttributes.value.size if syncState.refreshAttributes.value.size
TASK_PARAMETERS_BATCH_SIZE = TASK_PARAMETERS_BATCH_SIZE =
@@ -718,8 +728,9 @@ generateGetRpcRequest = (sessionData) ->
iter = syncState.refreshAttributes.value.values() iter = syncState.refreshAttributes.value.values()
while (path = iter.next().value) and while (path = iter.next().value) and
parameterNames.length < TASK_PARAMETERS_BATCH_SIZE parameterNames.length < TASK_PARAMETERS_BATCH_SIZE
parameterNames.push(path)
syncState.refreshAttributes.value.delete(path) syncState.refreshAttributes.value.delete(path)
if sessionData.deviceData.attributes.has(path)
parameterNames.push(path)
return { return {
type: 'GetParameterValues' type: 'GetParameterValues'
@@ -736,8 +747,8 @@ generateSetRpcRequest = (sessionData) ->
# Delete instance # Delete instance
iter = syncState.instancesToDelete.values() iter = syncState.instancesToDelete.values()
while instances = iter.next().value while instances = iter.next().value
if instance = instances.values().next().value if instance = instances.values().next().value and
instances.delete(instance) sessionData.deviceData.attributes.has(instance)
return { return {
type: 'DeleteObject' type: 'DeleteObject'
objectName: instance.concat('').join('.') objectName: instance.concat('').join('.')
@@ -746,7 +757,8 @@ generateSetRpcRequest = (sessionData) ->
# Create instance # Create instance
iter = syncState.instancesToCreate.entries() iter = syncState.instancesToCreate.entries()
while pair = iter.next().value while pair = iter.next().value
if instance = pair[1].values().next().value if sessionData.deviceData.attributes.has(pair[0]) and
instance = pair[1].values().next().value
pair[1].delete(instance) pair[1].delete(instance)
return { return {
type: 'AddObject' type: 'AddObject'