mirror of https://gitee.com/bigwinds/arangodb
201 lines
7.9 KiB
JavaScript
201 lines
7.9 KiB
JavaScript
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief tests for optimizer rules
|
|
///
|
|
/// @file
|
|
///
|
|
/// DISCLAIMER
|
|
///
|
|
/// Copyright 2010-2012 triagens GmbH, Cologne, Germany
|
|
///
|
|
/// Licensed under the Apache License, Version 2.0 (the "License");
|
|
/// you may not use this file except in compliance with the License.
|
|
/// You may obtain a copy of the License at
|
|
///
|
|
/// http://www.apache.org/licenses/LICENSE-2.0
|
|
///
|
|
/// Unless required by applicable law or agreed to in writing, software
|
|
/// distributed under the License is distributed on an "AS IS" BASIS,
|
|
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
/// See the License for the specific language governing permissions and
|
|
/// limitations under the License.
|
|
///
|
|
/// Copyright holder is triAGENS GmbH, Cologne, Germany
|
|
///
|
|
/// @author Jan Steemann
|
|
/// @author Copyright 2012, triAGENS GmbH, Cologne, Germany
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
var loadTestRunner = require("loadtestrunner");
|
|
var repgen = require("reportgenerator");
|
|
var internal = require("internal");
|
|
|
|
var db = internal.db;
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief test suite
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
var ruleName = "join";
|
|
var colName = "perf_" + ruleName.replace(/-/g, "_");
|
|
|
|
var theCollection;
|
|
|
|
var dbdApi = function (query, plan, bindVars) {
|
|
db._query(query, bindVars).toArray();
|
|
return {};
|
|
};
|
|
|
|
|
|
var setUp = function (options) {
|
|
var loopto = options.dbcols;
|
|
var contentmultiply = options.contentmultiply;
|
|
|
|
var Content = Array(contentmultiply).join('abcdefghijklmnopqrstuvwxyz')
|
|
|
|
internal.db._drop(colName);
|
|
theCollection = internal.db._create(colName);
|
|
var i, j;
|
|
for (i = 1; i <= loopto; ++i) {
|
|
theCollection.save({
|
|
"Key" : i,
|
|
"indexedKey" : i,
|
|
"payload" : Content
|
|
});
|
|
}
|
|
theCollection.ensureSkiplist("indexedKey");
|
|
};
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief tear down
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
var tearDown = function () {
|
|
internal.db._drop(colName);
|
|
require("internal").wait(0);
|
|
theCollection = null;
|
|
};
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief Execute the query
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
var testMethods = {
|
|
ahuacatl : {executeQuery: dbdApi}
|
|
};
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief Testcase: dump a full table
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
var testFullRead = function (testParams, testMethodStr, testMethod) {
|
|
var query = "FOR i IN " + colName + " RETURN i";
|
|
return testMethod.executeQuery(query, {}, {});
|
|
};
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief Testcase: dump 10% of a table without using an index
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
var testNonIndexedPartialRead = function (testParams, testMethodStr, testMethod, runOptions) {
|
|
var tenPercent = (runOptions.dbcols / 10) * 9;
|
|
var query = "FOR i IN " + colName + " FILTER i.Key > " + tenPercent + " RETURN i";
|
|
return testMethod.executeQuery(query, {}, {});
|
|
};
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief Testcase: dump 10% of a table without using an index
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
var testNonIndexedPartialReadCalcJS = function (testParams, testMethodStr, testMethod, runOptions) {
|
|
var tenPercent = (runOptions.dbcols / 10) * 9;
|
|
var query = "FOR i IN " + colName + " FILTER i.Key + 1 > " + tenPercent + " RETURN i";
|
|
return testMethod.executeQuery(query, {}, {});
|
|
};
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief Testcase: dump a full table sorted by an unindexed key.
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
var testNonIndexedFullSort = function (testParams, testMethodStr, testMethod) {
|
|
var query = "FOR i IN " + colName + " SORT i.Key RETURN i";
|
|
return testMethod.executeQuery(query, {}, {});
|
|
};
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief Testcase: dump a full table sorted by an indexed key.
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
var testIndexedFullSort = function (testParams, testMethodStr, testMethod) {
|
|
var query = "FOR i IN " + colName + " SORT i.indexedKey RETURN i";
|
|
return testMethod.executeQuery(query, {}, {});
|
|
};
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief Testcase: dump a full table sorted by an indexed key.
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
var testIndexedFullSortReverse = function (testParams, testMethodStr, testMethod) {
|
|
var query = "FOR i IN " + colName + " SORT i.indexedKey DESC RETURN i";
|
|
return testMethod.executeQuery(query, {}, {});
|
|
};
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief Testcase: dump a full table sorted by an indexed key - use filter
|
|
/// so the old also has
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
var testIndexedFullSortFilter = function (testParams, testMethodStr, testMethod) {
|
|
var query = "FOR i IN " + colName + " FILTER i.indexedKey > 0 SORT i.indexedKey RETURN i";
|
|
return testMethod.executeQuery(query, {}, {});
|
|
};
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief Testcase: dump a full table sorted by an indexed key - use filter
|
|
/// so the old also has
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
var testIndexedFullSortReverseFilter = function (testParams, testMethodStr, testMethod) {
|
|
var query = "FOR i IN " + colName + " FILTER i.indexedKey > 0 SORT i.indexedKey DESC RETURN i";
|
|
return testMethod.executeQuery(query, {}, {});
|
|
};
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief Simple join testsuite
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
var testSuite = [
|
|
{ name: "setup", setUp: setUp, teardown: null, params: null, func: null},
|
|
|
|
{ name: "testFullRead", func: testFullRead},
|
|
|
|
{ name: "testNonIndexedPartialRead", func: testNonIndexedPartialRead},
|
|
|
|
{ name: "testNonIndexedPartialReadCalcJS", func: testNonIndexedPartialReadCalcJS},
|
|
|
|
{ name: "testNonIndexedFullSort", func: testNonIndexedFullSort},
|
|
{ name: "testIndexedFullSort", func: testIndexedFullSort},
|
|
|
|
{ name: "testIndexedFullSortReverse", func: testIndexedFullSortReverse},
|
|
|
|
{ name: "testIndexedFullSortFilter", func: testIndexedFullSortFilter},
|
|
{ name: "testIndexedFullSortReverseFilter", func: testIndexedFullSortReverseFilter},
|
|
|
|
{ name: "teardown", setUp: null, teardown: tearDown, params: null, func: null}
|
|
];
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief execute suite with index and 25k entries in the collection
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
var k, l;
|
|
for (k = 1; k < 22; k+=5) {
|
|
for (l = 1; l < 22; l+=5) {
|
|
var testOptions = {
|
|
enableIndex: true,
|
|
dbcols: 10000 * k,
|
|
contentmultiply: l,
|
|
runs: 5, // number of runs for each test Has to be at least 3, else calculations will fail.
|
|
strip: 1, // how many min/max extreme values to ignore
|
|
digits: 4 // result display digits
|
|
};
|
|
require("internal").print("Testrun with " + testOptions.dbcols + " documents in the collection by size: " + l);
|
|
var ret = loadTestRunner.loadTestRunner(testSuite, testOptions, testMethods);
|
|
//repgen.generatePerfReportJTL("join", ret);
|
|
}
|
|
}
|