@Override public String getIndexCostInfo(NodeState rootState) { StringBuilder buff = new StringBuilder(); buff.append(quoteJson(selectorName)).append(": "); QueryIndex index = getIndex(); if (index != null) { if (index instanceof AdvancedQueryIndex) { IndexPlan p = plan.getIndexPlan(); buff.append("{ perEntry: ").append(p.getCostPerEntry()); buff.append(", perExecution: ").append(p.getCostPerExecution()); buff.append(", count: ").append(p.getEstimatedEntryCount()); buff.append(" }"); } else { buff.append(index.getCost(createFilter(true), rootState)); } } return buff.toString(); }
@Override public String getIndexCostInfo(NodeState rootState) { StringBuilder buff = new StringBuilder(); buff.append(quoteJson(selectorName)).append(": "); QueryIndex index = getIndex(); if (index != null) { if (index instanceof AdvancedQueryIndex) { IndexPlan p = plan.getIndexPlan(); buff.append("{ perEntry: ").append(p.getCostPerEntry()); buff.append(", perExecution: ").append(p.getCostPerExecution()); buff.append(", count: ").append(p.getEstimatedEntryCount()); buff.append(" }"); } else { buff.append(index.getCost(createFilter(true), rootState)); } } return buff.toString(); }
@Override public String getIndexCostInfo(NodeState rootState) { StringBuilder buff = new StringBuilder(); buff.append(quoteJson(selectorName)).append(": "); QueryIndex index = getIndex(); if (index != null) { if (index instanceof AdvancedQueryIndex) { IndexPlan p = plan.getIndexPlan(); buff.append("{ perEntry: ").append(p.getCostPerEntry()); buff.append(", perExecution: ").append(p.getCostPerExecution()); buff.append(", count: ").append(p.getEstimatedEntryCount()); buff.append(" }"); } else { buff.append(index.getCost(createFilter(true), rootState)); } } return buff.toString(); }
double c = p.getCostPerExecution() + entryCount * p.getCostPerEntry();
double c = p.getCostPerExecution() + entryCount * p.getCostPerEntry();
double c = p.getCostPerExecution() + entryCount * p.getCostPerEntry();
assertEquals(1.0, plan.getCostPerEntry(), 0); assertEquals(1.0, plan.getCostPerEntry(), 0);
double costPerEntry = p.getCostPerEntry(); assertTrue(costPerEntry >= 0); double costPerExecution = p.getCostPerExecution(); assertTrue(estimatedEntryCount >= 0); double c = p.getCostPerExecution() + estimatedEntryCount * p.getCostPerEntry(); assertTrue(c >= 0);
assertEquals(1.0, plan.getCostPerEntry(), 0); assertEquals(1.0, plan.getCostPerEntry(), 0);
@Test public void propertyIndexCost() throws Exception{ NodeBuilder defn = newLucenePropertyIndexDefinition(builder, "test", of("foo"), "async"); long numofDocs = IndexDefinition.DEFAULT_ENTRY_COUNT + 1000; FulltextIndexPlanner.setUseActualEntryCount(false); LuceneIndexDefinition idxDefn = new LuceneIndexDefinition(root, defn.getNodeState(), "/foo"); LuceneIndexNode node = createIndexNode(idxDefn, numofDocs); FilterImpl filter = createFilter("nt:base"); filter.restrictProperty("foo", Operator.EQUAL, PropertyValues.newString("bar")); FulltextIndexPlanner planner = new FulltextIndexPlanner(node, "/foo", filter, Collections.<OrderEntry>emptyList()); QueryIndex.IndexPlan plan = planner.getPlan(); //For propertyIndex if entry count (default to IndexDefinition.DEFAULT_ENTRY_COUNT) is //less than numOfDoc then that would be preferred assertEquals(idxDefn.getEntryCount(), plan.getEstimatedEntryCount()); assertEquals(1.0, plan.getCostPerExecution(), 0); assertEquals(1.0, plan.getCostPerEntry(), 0); }
@Override public double getCostPerEntry() { // calculate the weigted average double costPerEntry = 0; long totalEntries = getEstimatedEntryCount(); if (totalEntries == 0) { return 0; } for (IndexPlan p : basePlans.values()) { if (p != null) { costPerEntry += p.getCostPerEntry() * p.getEstimatedEntryCount() / totalEntries; } } return costPerEntry; }
@Test public void propertyIndexCost2() throws Exception{ NodeBuilder defn = newLucenePropertyIndexDefinition(builder, "test", of("foo"), "async"); defn.setProperty(FulltextIndexConstants.COST_PER_ENTRY, 2.0); defn.setProperty(FulltextIndexConstants.COST_PER_EXECUTION, 3.0); long numofDocs = IndexDefinition.DEFAULT_ENTRY_COUNT - 100; LuceneIndexNode node = createIndexNode(new LuceneIndexDefinition(root, defn.getNodeState(), "/foo"), numofDocs); FilterImpl filter = createFilter("nt:base"); filter.restrictProperty("foo", Operator.EQUAL, PropertyValues.newString("bar")); FulltextIndexPlanner planner = new FulltextIndexPlanner(node, "/foo", filter, Collections.<OrderEntry>emptyList()); QueryIndex.IndexPlan plan = planner.getPlan(); assertEquals(documentsPerValue(numofDocs), plan.getEstimatedEntryCount()); assertEquals(3.0, plan.getCostPerExecution(), 0); assertEquals(2.0, plan.getCostPerEntry(), 0); assertNotNull(plan); }
@Override public double getCostPerEntry() { // calculate the weigted average double costPerEntry = 0; long totalEntries = getEstimatedEntryCount(); if (totalEntries == 0) { return 0; } for (IndexPlan p : basePlans.values()) { if (p != null) { costPerEntry += p.getCostPerEntry() * p.getEstimatedEntryCount() / totalEntries; } } return costPerEntry; }
@Override public double getCostPerEntry() { // calculate the weigted average double costPerEntry = 0; long totalEntries = getEstimatedEntryCount(); if (totalEntries == 0) { return 0; } for (IndexPlan p : basePlans.values()) { if (p != null) { costPerEntry += p.getCostPerEntry() * p.getEstimatedEntryCount() / totalEntries; } } return costPerEntry; }
@Test public void noRestrictionWithTwoSortableFields() throws Exception{ NodeBuilder defn = newLucenePropertyIndexDefinition(builder, "test", of("foo", "bar"), "async"); defn.setProperty(createProperty(ORDERED_PROP_NAMES, of("foo", "bar"), STRINGS)); LuceneIndexDefinition definition = new LuceneIndexDefinition(root, defn.getNodeState(), "/test"); LuceneIndexNode node = createIndexNode(definition); FulltextIndexPlanner planner = new FulltextIndexPlanner(node, "/test", createFilter("nt:base"), ImmutableList.of(new OrderEntry("foo", Type.LONG, OrderEntry.Order.ASCENDING), new OrderEntry("bar", Type.LONG, OrderEntry.Order.ASCENDING))); assertNotNull(planner.getPlan()); assertEquals(1, planner.getPlan().getEstimatedEntryCount()); assertEquals(definition.getCostPerEntry()/3, planner.getPlan().getCostPerEntry(), 0.0001); }
@Test public void noRestrictionWithSingleSortableField() throws Exception{ NodeBuilder defn = newLucenePropertyIndexDefinition(builder, "test", of("foo"), "async"); defn.setProperty(createProperty(ORDERED_PROP_NAMES, of("foo"), STRINGS)); LuceneIndexDefinition definition = new LuceneIndexDefinition(root, defn.getNodeState(), "/test"); LuceneIndexNode node = createIndexNode(definition); FulltextIndexPlanner planner = new FulltextIndexPlanner(node, "/test", createFilter("nt:base"), ImmutableList.of(new OrderEntry("foo", Type.LONG, OrderEntry.Order.ASCENDING), new OrderEntry("bar", Type.LONG, OrderEntry.Order.ASCENDING))); assertNotNull(planner.getPlan()); assertEquals(1, planner.getPlan().getEstimatedEntryCount()); assertEquals(definition.getCostPerEntry()/2, planner.getPlan().getCostPerEntry(), 0.0001); }