diff --git a/js/common/tests/shell/shell-edge-index-noncluster.js b/js/common/tests/shell/shell-edge-index-noncluster.js index 9bfb7de8ff..4bbbaa8cf9 100644 --- a/js/common/tests/shell/shell-edge-index-noncluster.js +++ b/js/common/tests/shell/shell-edge-index-noncluster.js @@ -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, { }); } diff --git a/js/server/modules/@arangodb/arango-collection.js b/js/server/modules/@arangodb/arango-collection.js index b906ded1f9..c2b8d59490 100644 --- a/js/server/modules/@arangodb/arango-collection.js +++ b/js/server/modules/@arangodb/arango-collection.js @@ -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; };