UNPKG

database-jones

Version:

Lightweight database mapping

202 lines (177 loc) 4.72 kB
/* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 of the License. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ "use strict"; var jones = require("database-jones"); var harness = require("jones-test"); var QueryTest = require("../lib/QueryTestLib.js"); var q1 = { name: 'q1', queryType: 2, /* index scan */ expected: [4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20], predicate: function(q) { return q.k1.isNotNull(); } }; var q2 = { name: 'q2', queryType: 2, /* index scan */ expected: [16, 17, 18, 19, 20, 21], predicate: function(q) { return q.k3.isNull(); } }; var q3 = { name: 'q3', queryType: 2, expected: [8,9,10,11,12,13,14,15,16,17,18,19,20], p1: 1, predicate: function(q) { return q.k1.gt(q.param("p1")); } }; var q4 = { name: 'q4', queryType: 2, expected: [11,12,13,14,15], p1: 1010, predicate: function(q) { return q.k3.gt(q.param("p1")); } }; var q5 = { /* k1 >= 1 AND k2 > 1 */ name: 'q5', queryType: 2, expected: [6,7,10,11,14,15,18,19], p1: 1, predicate: function(q) { return q.k1.ge(q.param("p1")).and(q.k2.gt(q.param("p1"))); } }; var q6 = { // (k1 = 1 and k2 = 1) OR (k1 >= 2 and k2 >= 2) // We can do this as a multi-range index scan name: 'q6', queryType: 2, expected: [5,10,11,14,15,18,19], p1: 1, p2: 2, predicate: function(q) { return (q.k1.eq(q.param("p1")).and(q.k2.eq(q.param("p1")))) .or(q.k1.ge(q.param("p2")).and(q.k2.ge(q.param("p2")))); } }; var q7 = { /* id NOT EQUAL TO X. This should scan two ranges on PRIMARY */ name: 'q7', queryType: 2, expected: [1,2,3, 5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21], p1: 4, predicate: function(q) { return q.id.ne(q.param("p1")); } }; var q8 = { /* k1 = p1 and (k2 = p1 or k2 = p3) */ name: 'q8', queryType: 2, expected: [5,7], p1: 1, p3: 3, predicate: function(q) { return q.k1.eq(q.param("p1")).and(q.k2.eq(q.param("p1")).or(q.k2.eq(q.param("p3")))); } }; var q9 = { /* (k1 = 2 and k2 > 1) OR (k1 = 4 and k2 < 3) */ name: 'q9', queryType: 2, expected: [ 10,11,17,18 ], p1: 2, p2: 1, p3: 4, p4: 3, predicate: function(q) { return (q.k1.eq(q.param("p1")).and(q.k2.gt(q.param("p2")))). or(q.k1.eq(q.param("p3")).and(q.k2.lt(q.param("p4")))); } }; var q10 = { /* k1 = 2 and k2 is null */ name: 'q10', queryType: 2, expected: [ 8 ], p1: 2, predicate: function(q) { return q.k1.eq(q.param("p1")).and(q.k2.isNull()); } }; var q11 = { /* k1 = 2 and k2 is not null */ name: 'q11', queryType: 2, expected: [ 9,10,11 ], p1: 2, predicate: function(q) { return q.k1.eq(q.param("p1")).and(q.k2.isNotNull()); } }; var q12 = { /* k1 = 2 and k2 = 1 */ name: "q12", queryType: 2, expected: [ 9 ], p1: 2, p2: 1, predicate: function(q) { return q.k1.eq(q.param("p1")).and(q.k2.eq(q.param("p2"))); } }; var q13 = { /* (k1 = 2 and k2 = 1) OR (k1 = 4 and k2 = 3) */ name: 'q13', queryType: 2, expected: [ 9, 19 ], p1: 2, p2: 1, p3: 4, p4: 3, predicate: function(q) { return (q.k1.eq(q.param("p1")).and(q.k2.eq(q.param("p2")))). or(q.k1.eq(q.param("p3")).and(q.k2.eq(q.param("p4")))); } }; var q14 = { /* (k1 = 2 and k2 > 1) OR (k1 = 4 and k2 = 3) */ name: 'q14', queryType: 2, expected: [ 10, 11, 19 ], p1: 2, p2: 1, p3: 4, p4: 3, predicate: function(q) { return (q.k1.eq(q.param("p1")).and(q.k2.gt(q.param("p2")))). or(q.k1.eq(q.param("p3")).and(q.k2.eq(q.param("p4")))); } }; var q15 = { /* k2 > 2 AND (k1 = 2 OR K1 = 4) */ name: 'q15', queryType: 2, expected: [ 11, 19 ], p1: 2, p2: 4, predicate: function(q) { return q.k2.gt(q.param("p1")).and(q.k1.eq(q.param("p1")).or(q.k1.eq(q.param("p2")))); } }; var queryTests = [ q1,q2,q3,q4,q5,q6,q7,q8,q9,q10,q11,q12,q13,q14,q15 ]; //var queryTests = [ q15 ]; /** Set up domain type */ function mpk1() {} new jones.TableMapping('mpk1').applyToClass(mpk1); /** Define test */ var testQueries = new QueryTest("QueryScanTest", mpk1, queryTests); module.exports.tests = [testQueries];