ydn.db
Version:
Javascript database library for IndexedDB, WebDatabase (WebSQL) and WebStorage (localStorage) storage mechanisms supporting version migration, advanced query and transaction workflow.
529 lines (444 loc) • 12.9 kB
JavaScript
goog.require('ydn.db.algo.NestedLoop');
goog.require('goog.testing.jsunit');
goog.require('ydn.debug');
goog.require('ydn.db.core.Storage');
var reachedFinalContinuation, schema, db, objs, animals;
var store_name = 't1';
var db_name = 'test_iteration_1';
var obj_schema = {
stores: [
{
name: store_name,
keyPath: 'id',
type: 'TEXT',
indexes: [{
name: 'tag',
type: 'TEXT',
multiEntry: true
}, {
name: 'value',
type: 'NUMERIC'
}, {
name: 'x',
type: 'NUMERIC'
}]
}
]
};
var setUp = function() {
// ydn.debug.log('ydn.db.crud', 'finest');
// ydn.debug.log('ydn.db.core', 'finest');
//ydn.db.core.req.IDBCursor.DEBUG = true;
//ydn.db.Cursor.DEBUG = true;
// ydn.db.core.DbOperator.DEBUG = true;
objs = [
{id:'qs0', value: 0, x: 1, tag: ['a', 'b']},
{id:'qs1', value: 1, x: 2, tag: ['a']},
{id:'at2', value: 2, x: 3, tag: ['a', 'b']},
{id:'bs1', value: 3, x: 6, tag: ['b']},
{id:'bs2', value: 4, x: 14, tag: ['a', 'c', 'd']},
{id:'bs3', value: 5, x: 111, tag: ['c']},
{id:'st3', value: 6, x: 600}
];
animals = [
{id: 'rat', color: 'brown', horn: 0, legs: 4},
{id: 'cow', color: 'spots', horn: 1, legs: 4},
{id: 'galon', color: 'gold', horn: 1, legs: 2},
{id: 'snake', color: 'spots', horn: 0, legs: 0},
{id: 'chicken', color: 'red', horn: 0, legs: 2}
];
reachedFinalContinuation = false;
};
var tearDown = function() {
assertTrue('The final continuation was not reached', reachedFinalContinuation);
};
var load_basic = function(opt_db_name) {
var db_name = opt_db_name || 'iterator-test-' + goog.now();
var valueIndex = new ydn.db.schema.Index('value', ydn.db.schema.DataType.INTEGER, false, false);
var xIndex = new ydn.db.schema.Index('x', ydn.db.schema.DataType.NUMERIC, false, false);
var store_schema = new ydn.db.schema.Store(store_name, 'id', false,
ydn.db.schema.DataType.TEXT, [valueIndex, xIndex]);
var colorIndex = new ydn.db.schema.Index('color', ydn.db.schema.DataType.TEXT);
var hornIndex = new ydn.db.schema.Index('horn', ydn.db.schema.DataType.TEXT);
var legIndex = new ydn.db.schema.Index('legs', ydn.db.schema.DataType.TEXT);
var anmialStore = new ydn.db.schema.Store('animals', 'id', false,
ydn.db.schema.DataType.TEXT, [colorIndex, hornIndex, legIndex]);
var schema = new ydn.db.schema.Database(undefined, [store_schema, anmialStore]);
var db = new ydn.db.core.Storage(db_name, schema, options);
db.put(store_name, objs).addCallback(function (value) {
console.log(db + 'store: ' + store_name + ' ready.');
});
db.put('animals', animals).addCallback(function (value) {
console.log(db + 'store: animals ready.');
});
return db;
};
var load_default = function() {
var indexSchema = new ydn.db.schema.Index('tag', ydn.db.schema.DataType.TEXT, false, true);
var valueIndex = new ydn.db.schema.Index('value', ydn.db.schema.DataType.INTEGER, false, false);
var xIndex = new ydn.db.schema.Index('x', ydn.db.schema.DataType.NUMERIC, false, false);
var store_schema = new ydn.db.schema.Store(store_name, 'id', false,
ydn.db.schema.DataType.TEXT, [valueIndex, indexSchema, xIndex]);
var colorIndex = new ydn.db.schema.Index('color', ydn.db.schema.DataType.TEXT);
var hornIndex = new ydn.db.schema.Index('horn', ydn.db.schema.DataType.TEXT);
var legIndex = new ydn.db.schema.Index('legs', ydn.db.schema.DataType.TEXT);
var anmialStore = new ydn.db.schema.Store('animals', 'id', false,
ydn.db.schema.DataType.TEXT, [colorIndex, hornIndex, legIndex]);
schema = new ydn.db.schema.Database(undefined, [store_schema, anmialStore]);
var db = new ydn.db.core.Storage(db_name, schema, options);
db.put(store_name, objs).addCallback(function (value) {
console.log(db + 'store: ' + store_name + ' ready.');
});
db.put('animals', animals).addCallback(function (value) {
console.log(db + 'store: animals ready.');
});
return db;
};
var test_map_key_iterator = function() {
var done;
var streaming_keys = [];
// for key iterator, the reference value is sorted primary key.
var q = new ydn.db.KeyIterator(store_name);
var actual_keys = objs.map(function(x) {return x.id;});
actual_keys.sort();
var db = load_default();
waitForCondition(
// Condition
function () {
return done;
},
// Continuation
function () {
assertArrayEquals('streaming value', actual_keys, streaming_keys);
ydn.db.deleteDatabase(db.getName(), db.getType());
db.close();
reachedFinalContinuation = true;
},
100, // interval
1000); // maxTimeout
var req = db.map(q, function (key) {
streaming_keys.push(key);
});
req.addCallback(function (result) {
done = true;
});
req.addErrback(function (e) {
console.log(e);
done = true;
});
};
var test_map_value_iterator = function() {
var done;
var streaming_keys = [];
// for value iterator, the reference value is record sorted by primary key.
var actual_keys = objs;
goog.array.sort(actual_keys, function(a, b) {
return a.id > b.id ? 1 : -1;
});
var q = new ydn.db.ValueIterator(store_name);
var db = load_basic();
waitForCondition(
// Condition
function () {
return done;
},
// Continuation
function () {
assertArrayEquals('values', actual_keys, streaming_keys);
ydn.db.deleteDatabase(db.getName(), db.getType());
db.close();
reachedFinalContinuation = true;
},
100, // interval
1000); // maxTimeout
var req = db.map(q, function (key) {
streaming_keys.push(key);
});
req.addCallback(function (result) {
done = true;
});
req.addErrback(function (e) {
console.log(e);
done = true;
});
};
var test_map_index_key_iterator = function() {
var done;
var streaming_keys = [];
// for index key iterator, the reference value is index key.
var q = new ydn.db.IndexIterator(store_name, 'value');
var actual_keys = objs.map(function(x) {return x.value;});
var db = load_basic();
waitForCondition(
// Condition
function () {
return done;
},
// Continuation
function () {
assertArrayEquals('streaming value', actual_keys, streaming_keys);
ydn.db.deleteDatabase(db.getName(), db.getType());
db.close();
reachedFinalContinuation = true;
},
100, // interval
1000); // maxTimeout
var req = db.map(q, function (key) {
streaming_keys.push(key);
});
req.addCallback(function (result) {
done = true;
});
req.addErrback(function (e) {
console.log(e);
done = true;
});
};
var test_map_index_value_iterator = function() {
var done;
var streaming_keys = [];
// for index value iterator, the reference value is primary key.
var actual_keys = objs.map(function(x) {return x.id;});
var q = new ydn.db.IndexValueIterator(store_name, 'value');
var db = load_basic();
waitForCondition(
// Condition
function () {
return done;
},
// Continuation
function () {
assertArrayEquals('streaming key', actual_keys, streaming_keys);
ydn.db.deleteDatabase(db.getName(), db.getType());
db.close();
reachedFinalContinuation = true;
},
100, // interval
2000); // maxTimeout
var req = db.map(q, function (key) {
streaming_keys.push(key);
});
req.addCallback(function (result) {
done = true;
});
req.addErrback(function (e) {
console.log(e);
done = true;
});
};
//
//var test_42_map_skip = function() {
//
// var done;
// var streaming_keys = [];
//
// var actual_index_keys = [0, 4, 5, 6];
// var q = new ydn.db.IndexIterator(store_name, 'value');
//
// waitForCondition(
// // Condition
// function () {
// return done;
// },
// // Continuation
// function () {
// assertArrayEquals('streaming index', actual_index_keys, streaming_keys);
//
// reachedFinalContinuation = true;
// },
// 100, // interval
// 1000); // maxTimeout
//
// var start = 3;
// db = load_default();
// var req = db.map(q, function (key) {
// streaming_keys.push(key);
// if (key < 3) {
// return 4;
// }
// });
// req.addCallback(function (result) {
// done = true;
// });
// req.addErrback(function (e) {
// console.log(e);
// done = true;
// });
//};
//
//
//var test_43_map_stop = function() {
//
// var done;
// var streaming_keys = [];
// var streaming_values = [];
//
// var actual_index_keys = [0, 1, 2, 3];
// var q = new ydn.db.IndexIterator(store_name, 'value');
//
// waitForCondition(
// // Condition
// function () {
// return done;
// },
// // Continuation
// function () {
// assertArrayEquals('streaming index', actual_index_keys, streaming_keys);
//
// reachedFinalContinuation = true;
// },
// 100, // interval
// 1000); // maxTimeout
//
// var start = 3;
// db = load_default();
// var req = db.map(q, function (key) {
// streaming_keys.push(key);
// if (key >= 3) {
// return null;
// }
// });
// req.addCallback(function (result) {
// done = true;
// });
// req.addErrback(function (e) {
// console.log(e);
// done = true;
// });
//};
var test_reduce = function() {
var done, result;
var sum = objs.reduce(function(p, x) {
return p + x.value;
}, 0);
var q = new ydn.db.Iterator(store_name, 'value');
waitForCondition(
// Condition
function () {
return done;
},
// Continuation
function () {
assertEquals('sum', sum, result);
reachedFinalContinuation = true;
},
100, // interval
1000); // maxTimeout
db = load_default();
var req = db.reduce(q, function (prev, curr, index) {
return prev + curr;
}, 0);
req.addCallback(function (x) {
done = true;
result = x;
});
req.addErrback(function (e) {
console.log(e);
done = true;
});
};
var _test_join_primary = function() {
var db_name = 'test_join_primary';
var data = [
{id: 0, a: 3, b: 'e'},
{id: 1, a: 3, b: 'a'},
{id: 2, a: 2, b: 'b'}, // result
{id: 3, a: 2, b: 'c'},
{id: 4, a: 2, b: 'b'}, // result
{id: 5, a: 1, b: 'b'}
];
var schema = {
stores: [{
name: 'st',
keyPath: 'id',
indexes: [{
name: 'a'
}, {
name: 'b'
}]
}]
};
var db = new ydn.db.core.Storage(db_name, schema, options);
db.clear('st');
db.put('st', data);
var done;
var keys1 = [];
var values1 = [];
waitForCondition(
function() {
return done;
},
function() {
assertArrayEquals('keys', [2, 4], keys1);
assertArrayEquals('values', [data[2], data[4]], values1);
reachedFinalContinuation = true;
ydn.db.deleteDatabase(db.getName(), db.getType());
db.close();
},
100, // interval
1000); // maxTimeout
var iter = new ydn.db.ValueIterator('st');
iter = iter.join('st', 'a', 2);
iter = iter.join('st', 'b', 'b');
var req = db.open(function(cursor) {
keys1.push(cursor.getPrimaryKey());
values1.push(cursor.getValue());
}, iter);
req.addBoth(function(x) {
done = true;
});
};
var _test_join_index = function() {
var db_name = 'test_join_index';
var data = [
{id: 0, a: 3, b: 'b'}, // result 3
{id: 1, a: 3, b: 'a'},
{id: 2, a: 2, b: 'b'}, // result 1
{id: 3, a: 2, b: 'c'},
{id: 4, a: 1, b: 'b'},
{id: 5, a: 2, b: 'b'}, // result 2
{id: 6, a: 4, b: 'b'}
];
var schema = {
stores: [{
name: 'st',
keyPath: 'id',
indexes: [{
name: 'a'
}, {
name: 'b'
}]
}]
};
var iter = ydn.db.IndexValueIterator.where('st', 'a', '>=', 2, '<', 4);
iter = iter.join('st', 'b', 'b');
var db = new ydn.db.core.Storage(db_name, schema, options);
db.clear('st');
db.put('st', data);
var done;
var keys1 = [];
var values1 = [];
waitForCondition(
function() {
return done;
},
function() {
assertArrayEquals('keys', [['b', 2], ['b', 5], ['b', [3]]], keys1);
assertArrayEquals('values', [data[2], data[5], data[0]], values1);
reachedFinalContinuation = true;
ydn.db.deleteDatabase(db.getName(), db.getType());
db.close();
},
100, // interval
1000); // maxTimeout
var req = db.open(function(cursor) {
keys1.push(cursor.getPrimaryKey());
values1.push(cursor.getValue());
}, iter);
req.addBoth(function(x) {
done = true;
});
};
var testCase = new goog.testing.ContinuationTestCase();
testCase.autoDiscoverTests();
G_testRunner.initialize(testCase);