1
0
Fork 0

RocksDB now properly reports EdgeIndex estimates to the user. Also reactivated edgeIndex tests for the estimate in RocksDB.

This commit is contained in:
Michael Hackstein 2017-05-17 09:52:25 +02:00
parent 9569b67e8d
commit b19549f5e4
2 changed files with 48 additions and 58 deletions

View File

@ -41,14 +41,6 @@ if (db._engine().name === "mmfiles") {
mmfilesEngine = true;
}
var printed=false;
function printNotImplemented(message){
if(!printed){
printed = true;
print("test for " + message + " not implemented");
}
}
////////////////////////////////////////////////////////////////////////////////
/// @brief test suite: buckets
////////////////////////////////////////////////////////////////////////////////
@ -312,14 +304,9 @@ function EdgeIndexSuite () {
////////////////////////////////////////////////////////////////////////////////
testIndexSelectivityEmpty : function () {
printed = false;
var edgeIndex = edge.getIndexes()[1];
assertTrue(edgeIndex.hasOwnProperty("selectivityEstimate"));
if(mmfilesEngine){
assertEqual(1, edgeIndex.selectivityEstimate);
} else {
printNotImplemented("selectivityEstimate");
}
assertEqual(1, edgeIndex.selectivityEstimate);
},
////////////////////////////////////////////////////////////////////////////////
@ -327,15 +314,10 @@ function EdgeIndexSuite () {
////////////////////////////////////////////////////////////////////////////////
testIndexSelectivityOneDoc : function () {
printed = false;
edge.save(v1, v2, { });
var edgeIndex = edge.getIndexes()[1];
assertTrue(edgeIndex.hasOwnProperty("selectivityEstimate"));
if(mmfilesEngine){
assertEqual(1, edgeIndex.selectivityEstimate);
} else {
printNotImplemented("selectivityEstimate");
}
assertEqual(1, edgeIndex.selectivityEstimate);
},
////////////////////////////////////////////////////////////////////////////////
@ -343,7 +325,6 @@ function EdgeIndexSuite () {
////////////////////////////////////////////////////////////////////////////////
testIndexSelectivityDuplicateDocs : function () {
printed = false;
var i, c, edgeIndex, expectedSelectivity;
for (i = 0; i < 1000; ++i) {
@ -351,11 +332,7 @@ function EdgeIndexSuite () {
edgeIndex = edge.getIndexes()[1];
expectedSelectivity = 1 / (i + 1);
// allow for some floating-point deviations
if(mmfilesEngine){
assertTrue(Math.abs(expectedSelectivity - edgeIndex.selectivityEstimate) <= 0.001);
} else {
printNotImplemented("selectivityEstimate");
}
assertTrue(Math.abs(expectedSelectivity - edgeIndex.selectivityEstimate) <= 0.001);
}
var n = edge.count();
@ -370,11 +347,7 @@ function EdgeIndexSuite () {
c = 1000 - (i + 1);
expectedSelectivity = (c === 0 ? 1 : 1 / c);
// allow for some floating-point deviations
if(mmfilesEngine){
assertTrue(Math.abs(expectedSelectivity - edgeIndex.selectivityEstimate) <= 0.001);
} else {
printNotImplemented("selectivityEstimate");
}
assertTrue(Math.abs(expectedSelectivity - edgeIndex.selectivityEstimate) <= 0.001);
}
},
@ -395,16 +368,11 @@ function EdgeIndexSuite () {
////////////////////////////////////////////////////////////////////////////////
testIndexSelectivityUniqueDocsFrom : function () {
printed = false;
for (var i = 0; i < 1000; ++i) {
edge.save(vn + "/from" + i, vn + "/1", { });
var edgeIndex = edge.getIndexes()[1];
var expectedSelectivity = (1 + (1 / (i + 1))) * 0.5;
if(mmfilesEngine){
assertTrue(Math.abs(expectedSelectivity - edgeIndex.selectivityEstimate) <= 0.001);
} else {
printNotImplemented("selectivityEstimate");
}
assertTrue(Math.abs(expectedSelectivity - edgeIndex.selectivityEstimate) <= 0.001);
}
},
@ -413,16 +381,11 @@ function EdgeIndexSuite () {
////////////////////////////////////////////////////////////////////////////////
testIndexSelectivityRepeatingDocs : function () {
printed = false;
for (var i = 0; i < 1000; ++i) {
if (i > 0) {
var edgeIndex = edge.getIndexes()[1];
var expectedSelectivity = (1 + (Math.min(i, 20) / i)) * 0.5;
if(mmfilesEngine){
assertTrue(Math.abs(expectedSelectivity - edgeIndex.selectivityEstimate) <= 0.001);
} else {
printNotImplemented("selectivityEstimate");
}
assertTrue(Math.abs(expectedSelectivity - edgeIndex.selectivityEstimate) <= 0.001);
}
edge.save(vn + "/from" + (i % 20), vn + "/to" + i, { });
}

View File

@ -528,24 +528,51 @@ ArangoCollection.prototype.getIndexes = function (withFigures) {
var indexes = this.getIndexesPrivate(withFigures);
if (this.type() === 3) {
// edge collections
var result = [];
for (var i = 0; i < indexes.length; i++) {
if (indexes[i].type === "edge") {
if (indexes[i].fields.length === 1
&& indexes[i].fields[0] === "_from") {
// we got two edge indexes. now pretend we only have one, and
// make it claim it is created on _from and _to
indexes[i].fields.push("_to");
result.push(indexes[i]);
} else if (indexes[i].fields.length === 2) {
// we have an edge index with two attributes
result.push(indexes[i]);
let fromI = -1;
let toI = -1;
for (let i = 0; i < indexes.length; i++) {
if (indexes[i].type === 'edge') {
if (indexes[i].fields.length === 2) {
// We have an edgeIndex representation on [_from, _to]
// Nothing to do
break;
} else {
if (indexes[i].fields[0] === '_from') {
fromI = i;
if (toI !== -1) {
break;
}
continue;
}
if (indexes[i].fields[0] === '_to') {
toI = i;
if (fromI !== -1) {
break;
}
continue;
}
}
} else {
result.push(indexes[i]);
}
}
return result;
if (fromI !== -1 && toI !== -1) {
// We got two edge indexes.
// Merge them to pretend we only have one...
let fromIdx = indexes[fromI];
let toIdx = indexes[toI];
// Adjust fields
fromIdx.fields.push('_to');
// Adjust estimate
if (fromIdx.hasOwnProperty('selectivityEstimate') &&
toIdx.hasOwnProperty('selectivityEstimate')) {
fromIdx.selectivityEstimate += toIdx.selectivityEstimate;
fromIdx.selectivityEstimate /= 2;
}
// Splice out _to Index
indexes.splice(toI, 1);
}
}
return indexes;
};