diff --git a/js/test/tuple.js b/js/test/tuple.js new file mode 100644 index 0000000..9efc36d --- /dev/null +++ b/js/test/tuple.js @@ -0,0 +1,109 @@ +/* New tuple space implementation - Prototype */ +/** + +Tupel space is divided in sub-spaces by creating a hierachical tuple space: + +1. Arity + 2. Tuple type signature + 3. Hash tag from first tuple element + +*/ + +var inspect = require('util').inspect; +var _ = undefined; + + +var SIGTYPE = { + undefined:0, + number:1, + string:2, + boolean:4, + object:8, + array:16, + function:32 +} + +var SIGTYPEMAX=6; + +function signature(tuple) { + var s=0; + for(var i in tuple) { + var t = typeof tuple[i]; + if (t=='object' && t instanceof Array) t='array'; + s = s | SIGTYPE[t]; s = s << SIGTYPEMAX; + } + return s; +} + +var db = []; +var MAXDIM=10; + +function init () { + for(var i=1;i<=MAXDIM;i++) + db[i]={dim:i,n:0,stores:{}} +} + +function store (tuple) { + var ary = tuple.length; + var sig = signature(tuple); + var ts = db[ary]; + var store,index,hash; + if (!ts.stores[sig]) { + store={hash:{},sig:sig}; + store.hash[tuple[0]]={data:[tuple],free:[]}; + ts.stores[sig]=store; + } else { + store=ts.stores[sig]; + hash=store.hash[tuple[0]]; + if (hash) { + if (hash.free.length) + hash.data[index=hash.free.pop()]=tuple; + else + hash.data.push(tuple); + } else { + store.hash[tuple[0]]={data:[tuple],free:[]}; + } + } +} + +function match (tuple,pattern) { + function eq (v1,v2) { + // simplified test + if (v1==v2) return true; + return false; + } + for(var index in tuple) { + if (pattern[index]!=undefined && !eq(tuple[index],pattern[index])) + return false; + } + return true; +} + +function lookup (pattern) { + var ary = pattern.length; + var sig = signature(pattern); + var ts = db[ary]; + // Search in all matching stores + for (var s in ts.stores) { + store= ts.stores[s]; + if ((store.sig & sig) == sig) { + // pattern signature is contained in this store + if (pattern[0]!=undefined) { + hash=store.hash[pattern[0]]; + if (hash) for (d in hash.data) { + if (match(hash.data[d],pattern)) return hash.data[d] + } + } + } + } + return; +} + +init(); +store(['SEN',100,100]); +store(['SEN',200,100]); +store(['SEN2',100,true]); +print(inspect(db[3],_,8)); +print(lookup(['SEN',_,_])); +print(lookup(['SEN',_,100])); +print(lookup(['SEN',_,101]));