mirror of https://gitee.com/bigwinds/arangodb
RocksDB now properly reports EdgeIndex estimates to the user. Also reactivated edgeIndex tests for the estimate in RocksDB.
This commit is contained in:
parent
9569b67e8d
commit
b19549f5e4
|
@ -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, { });
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue