From: adam Date: Sun, 5 May 2013 15:31:53 +0000 (+0700) Subject: Array token index can be used for number eq matching. Project files updated. Working... X-Git-Tag: v1.2.12~300 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=3ccc0d15e0d162d68b3f3fbd5758da812b5e6346;p=platform%2Fupstream%2Fejdb.git Array token index can be used for number eq matching. Project files updated. Working on benchmarks --- diff --git a/.idea/jsLibraryMappings.xml b/.idea/jsLibraryMappings.xml index 19bd4db..0f3ec8f 100644 --- a/.idea/jsLibraryMappings.xml +++ b/.idea/jsLibraryMappings.xml @@ -1,14 +1,19 @@ + + + + + diff --git a/jejdb/jejdb.iml b/jejdb/jejdb.iml index 093870a..a9cd3af 100644 --- a/jejdb/jejdb.iml +++ b/jejdb/jejdb.iml @@ -10,6 +10,7 @@ + diff --git a/luaejdb/luaejdb.iml b/luaejdb/luaejdb.iml index a914152..511f43c 100644 --- a/luaejdb/luaejdb.iml +++ b/luaejdb/luaejdb.iml @@ -5,6 +5,7 @@ + diff --git a/luaejdb/nbproject/configurations.xml b/luaejdb/nbproject/configurations.xml index 766577b..fc52988 100644 --- a/luaejdb/nbproject/configurations.xml +++ b/luaejdb/nbproject/configurations.xml @@ -23,6 +23,8 @@ LOCAL_SOURCES default + false + false diff --git a/node/tests/bench/benchutils.js b/node/tests/bench/benchutils.js new file mode 100644 index 0000000..59350f3 --- /dev/null +++ b/node/tests/bench/benchutils.js @@ -0,0 +1,63 @@ +//var crypto = require("crypto"); + +if (typeof module != "undefined") { + module.exports.randomFloat = randomFloat; + module.exports.randomInt32 = randomInt32; + module.exports.randomString = randomString; + module.exports.randomStringArr = randomStringArr; + module.exports.randomIntArr = randomIntArr; + module.exports.randomField = randomField; +} + +function randomFloat(min, max) { + if (min == null || max == null) { + //return crypto.randomBytes(64).readDoubleLE(0); + return 2147483647 * Math.random() - 2147483647 * Math.random(); + } else { + return Math.random() * (max - min) + min; + } +} + +function randomInt32(min, max) { + if (min == null || max == 0) { + //return crypto.randomBytes(32).readInt32LE(0); + return Math.ceil(2147483647 * Math.random()) - Math.ceil(2147483647 * Math.random()); + } else { + return Math.floor(Math.random() * (max - min + 1)) + min; + } +} + +function randomIntArr(maxarrlen, min, max) { + var arr = new Array(maxarrlen); + for (var i = 0; i < maxarrlen; ++i) { + arr[i] = randomInt32(min, max); + } + return arr; +} + +function randomStringArr(maxarrlen, maxstrlen) { + var arr = new Array(maxarrlen); + for (var i = 0; i < maxarrlen; ++i) { + arr[i] = randomString(randomInt32(1, maxstrlen)); + } + return arr; +} + +function randomString(maxlen) { + maxlen = (maxlen != null) ? maxlen : 256; + var carr = new Buffer(maxlen); + for (var i = 0; i < maxlen; ++i) { + carr[i] = (0x21 + Math.floor(Math.random() * (0x7e - 0x21 + 1))); + } + return carr.toString("ascii"); +} + + +function randomField() { + var maxlen = randomInt32(1, 48); + var carr = new Buffer(maxlen); + for (var i = 0; i < maxlen; ++i) { + carr[i] = (0x61 + Math.floor(Math.random() * (0x7a - 0x61 + 1))); + } + return carr.toString("ascii"); +} diff --git a/node/tests/bench/ejdb/bench1.js b/node/tests/bench/ejdb/bench1.js new file mode 100644 index 0000000..66fb454 --- /dev/null +++ b/node/tests/bench/ejdb/bench1.js @@ -0,0 +1,157 @@ +var butils = require("../benchutils.js"); +var EJDB = require("ejdb"); +var jb = EJDB.open("bench1", EJDB.DEFAULT_OPEN_MODE | EJDB.JBOTRUNC); + + +function run(opts, prepareCb, saveCb) { + var rows = opts["rows"]; //max number of rows for each iteration + var queries = opts["queries"]; //max number of queries + if (rows == null || isNaN(rows)) { + throw new Error("Missing required 'rows' option"); + } + if (queries == null || isNaN(queries)) { + throw new Error("Missing required 'queries' option"); + } + if (queries > rows) { + queries = rows; + } + var maxfields = opts["maxfields"] || 10; //max number of fields on each object nesting level + var maxlevels = opts["maxlevels"] || 3; //max number of nested object levels + var lvlindexedfields = opts["lvlindexedfields"] != null ? opts["lvlindexedfields"] : 2; //max number of indexed field for each level + + var qfields = {}; + var types = ["s", "i", "f", "a", "ia", "o"]; + var parents = []; + parents[0] = {}; + for (var l = 0; l < maxlevels; ++l) { + var inum = lvlindexedfields; + for (var f = 0; f < maxfields; ++f) { + var fname = butils.randomField(32); + var fo = { + "_t" : types[butils.randomInt32(0, types.length - 1)] + }; + if (fo._t !== "o" && inum > 0) { + fo._i = true; //field indexed + --inum; + } + if (fo._t === "o") { + parents[l + 1] = fo; + } + if (parents[l]) { + parents[l][fname] = fo; + } + } + } + function constructObj(meta, out, fstack, qinc) { + if (fstack == null) { + fstack = []; + } + for (var k in meta) { + if (k[0] === "_" || typeof meta[k] !== "object") { + continue; + } + fstack.push(k); + var fo = meta[k]; + switch (fo._t) { + case "s": + out[k] = butils.randomString(butils.randomInt32(1, 256)); + break; + case "a": + out[k] = butils.randomStringArr(butils.randomInt32(1, 64), 128); + break; + case "i": + out[k] = butils.randomInt32(); + break; + case "f": + out[k] = butils.randomFloat(); + break; + case "ia": + out[k] = butils.randomIntArr(butils.randomInt32(1, 64)); + break; + case "o": + out[k] = constructObj(fo, {}, fstack, qinc); + break; + } + if (fo._t !== "o") { + var fname = fstack.join("."); + if (qfields[fname] == null) { + qfields[fname] = {_i : !!fo._i, _t : fo._t, _v : []}; + } + if (qinc) { + qfields[fname]._v.push(out[k]); + } + } + fstack.pop(); + } + return out; + } + + var util = require("util"); + var st = +new Date(); + + + constructObj(parents[0], {}, [], false); //populate qfields + prepareCb(opts, qfields); + + var qratio = Math.ceil(rows / queries); + for (var r = 0; r < rows; ++r) { + var isq = ((r % qratio) == 0); + var obj = constructObj(parents[0], {}, [], isq); + saveCb(opts, obj); + } + + + return +new Date() - st; +} + +var time = run({ + cname : "run1", + rows : 100000, + queries : 1000, + maxfields : 10, + maxlevels : 3, + lvlindexedfields : 2 + }, function(opts, qfields) { + jb.ensureCollection(opts.cname, {records : opts.rows, large : true}); + for (var k in qfields) { + var qf = qfields[k]; + if (!qf._i) continue; + switch (qf._t) { + case "i": + case "f": + jb.ensureNumberIndex(opts.cname, k); + break; + case "s": + jb.ensureStringIndex(opts.cname, k); + break; + case "a": + case "ia": + jb.ensureArrayIndex(opts.cname, k); + } + } + }, + function(opts, obj) { + jb.save(opts.cname, obj); + }); + +console.log("run1 time=%d", time); + +//cleanup +if (false) { + var c = 0; + jb.getDBMeta()["collections"].forEach(function(co) { + console.log("Drop collection %s", co.name); + ++c; + jb.dropCollection(co.name, true, function() { + --c; + if (c == 0) { + jb.close(); + } + + }); + }); +} else { + jb.close(); +} + + diff --git a/package.json b/package.json index ac162f6..a67888e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name" : "ejdb", - "version" : "1.1.3-4", + "version" : "1.1.4-4", "config" : { "windownloadurl_ia32" : "http://dl.dropboxusercontent.com/u/4709222/ejdb/tcejdb-1.1.3-mingw32-i686.zip", "windownloadurl_x64" : "http://dl.dropboxusercontent.com/u/4709222/ejdb/tcejdb-1.1.3-mingw32-x86_64.zip" diff --git a/pyejdb/nbproject/configurations.xml b/pyejdb/nbproject/configurations.xml index b5b6e7f..f505c2c 100644 --- a/pyejdb/nbproject/configurations.xml +++ b/pyejdb/nbproject/configurations.xml @@ -24,6 +24,8 @@ LOCAL_SOURCES default + false + false diff --git a/pyejdb/pyejdb.iml b/pyejdb/pyejdb.iml index 8052f2d..34922e0 100644 --- a/pyejdb/pyejdb.iml +++ b/pyejdb/pyejdb.iml @@ -17,6 +17,7 @@ + diff --git a/tcejdb/configure b/tcejdb/configure index 2831867..b8c02f9 100755 --- a/tcejdb/configure +++ b/tcejdb/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for tcejdb 1.1.3. +# Generated by GNU Autoconf 2.69 for tcejdb 1.1.4. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. @@ -577,8 +577,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='tcejdb' PACKAGE_TARNAME='tcejdb' -PACKAGE_VERSION='1.1.3' -PACKAGE_STRING='tcejdb 1.1.3' +PACKAGE_VERSION='1.1.4' +PACKAGE_STRING='tcejdb 1.1.4' PACKAGE_BUGREPORT='' PACKAGE_URL='' @@ -1268,7 +1268,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures tcejdb 1.1.3 to adapt to many kinds of systems. +\`configure' configures tcejdb 1.1.4 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1333,7 +1333,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of tcejdb 1.1.3:";; + short | recursive ) echo "Configuration of tcejdb 1.1.4:";; esac cat <<\_ACEOF @@ -1439,7 +1439,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -tcejdb configure 1.1.3 +tcejdb configure 1.1.4 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -1737,7 +1737,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by tcejdb $as_me 1.1.3, which was +It was created by tcejdb $as_me 1.1.4, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -5273,7 +5273,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by tcejdb $as_me 1.1.3, which was +This file was extended by tcejdb $as_me 1.1.4, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -5326,7 +5326,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -tcejdb config.status 1.1.3 +tcejdb config.status 1.1.4 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff --git a/tcejdb/configure.ac b/tcejdb/configure.ac index 34f04e7..7503ee7 100644 --- a/tcejdb/configure.ac +++ b/tcejdb/configure.ac @@ -10,7 +10,7 @@ test -n "$CPPFLAGS" && MYCPPFLAGS="$CPPFLAGS $MYCPPFLAGS" test -n "$LDFLAGS" && MYLDFLAGS="$LDFLAGS $MYLDFLAGS" # Package name -AC_INIT(tcejdb, 1.1.3) +AC_INIT(tcejdb, 1.1.4) AC_CANONICAL_HOST # Package information diff --git a/tcejdb/debian/changelog b/tcejdb/debian/changelog index f2454f0..12afb69 100644 --- a/tcejdb/debian/changelog +++ b/tcejdb/debian/changelog @@ -1,3 +1,9 @@ +libtcejdb (1.1.4-0) testing; urgency=low + + * Array token index can be used for number eq matching + + -- Anton Adamansky Sun, 05 May 2013 22:11:14 +0700 + libtcejdb (1.1.3-0) testing; urgency=low * Minor optimizations in the header files diff --git a/tcejdb/ejdb.c b/tcejdb/ejdb.c index f5c33b8..ceaa10a 100644 --- a/tcejdb/ejdb.c +++ b/tcejdb/ejdb.c @@ -1174,7 +1174,7 @@ static bool _qrybsvalmatch(const EJQF *qf, bson_iterator *it, bool expandarrays) case TDBQCSTRRX: { _FETCHSTRFVAL(); - rv = qf->regex && (regexec((regex_t *)qf->regex, fval, 0, NULL, 0) == 0); + rv = qf->regex && (regexec((regex_t *) qf->regex, fval, 0, NULL, 0) == 0); break; } case TDBQCNUMEQ: @@ -2892,7 +2892,12 @@ static TDBIDX* _qryfindidx(EJCOLL *jcoll, EJQF *qf, bson *idxmeta) { //No direct operation index. Any alternatives? if (idxmeta && !(qf->flags & EJCONDICASE) && //if not case insensitive query - (qf->tcop == TDBQCSTREQ || qf->tcop == TDBQCSTROREQ || qf->tcop == TDBQCNUMOREQ)) { + ( + qf->tcop == TDBQCSTREQ || + qf->tcop == TDBQCSTROREQ || + qf->tcop == TDBQCNUMOREQ || + qf->tcop == TDBQCNUMEQ) + ) { bson_iterator it; bson_type bt = bson_find(&it, idxmeta, "iflags"); if (bt != BSON_INT) { @@ -2911,6 +2916,14 @@ static TDBIDX* _qryfindidx(EJCOLL *jcoll, EJQF *qf, bson *idxmeta) { qf->expr = tclistdump(qf->exprlist, &qf->exprsz); qf->ftype = BSON_ARRAY; return idx; + } else if (qf->tcop == TDBQCNUMEQ) { + qf->tcop = TDBQCSTRNUMOR; + qf->exprlist = tclistnew2(1); + TCLISTPUSH(qf->exprlist, qf->expr, qf->exprsz); + if (qf->expr) TCFREE(qf->expr); + qf->expr = tclistdump(qf->exprlist, &qf->exprsz); + qf->ftype = BSON_ARRAY; + return idx; } else if (qf->tcop == TDBQCSTROREQ) { assert(qf->ftype == BSON_ARRAY); qf->tcop = TDBQCSTROR; diff --git a/tcejdb/nbproject/configurations.xml b/tcejdb/nbproject/configurations.xml index 3e015ca..3ea2b0f 100644 --- a/tcejdb/nbproject/configurations.xml +++ b/tcejdb/nbproject/configurations.xml @@ -2,19 +2,6 @@ - - bdbtest.c - cdbtest.c - cmpsqltctest.c - gdbmtest.c - maptest.cc - ndbmtest.c - qdbmtest.c - sdbmtest.c - sqltest.c - tctest.c - tdbtest.c - platform.h @@ -108,7 +95,7 @@ . ${MAKE} -f Makefile ${MAKE} -f Makefile clean - tcfmttest + testejdb/t4 _GNU_SOURCE=1 @@ -128,50 +115,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -225,15 +168,6 @@ - - - - ../../../../include - . - /usr/local/include - - - @@ -639,50 +573,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -736,15 +626,6 @@ - - - - ../../../../include - . - /usr/local/include - - - @@ -815,8 +696,6 @@ - - @@ -1072,20 +951,12 @@ - - - - - - - - diff --git a/tcejdb/nbproject/project.xml b/tcejdb/nbproject/project.xml index ea6e1a1..fba82f8 100644 --- a/tcejdb/nbproject/project.xml +++ b/tcejdb/nbproject/project.xml @@ -5,7 +5,7 @@ tcejdb c - cc,cpp + cpp h UTF-8 diff --git a/tcejdb/tcejdb.iml b/tcejdb/tcejdb.iml index 931a98b..4fcdfa5 100644 --- a/tcejdb/tcejdb.iml +++ b/tcejdb/tcejdb.iml @@ -6,9 +6,9 @@ - +