Skip to content

Commit

Permalink
TEIID-5531 adding support for implicit indexes on composite keys
Browse files Browse the repository at this point in the history
  • Loading branch information
shawkins committed Nov 9, 2018
1 parent f94f091 commit d81c4ff
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 16 deletions.
35 changes: 19 additions & 16 deletions engine/src/main/java/org/teiid/query/tempdata/TempTable.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,15 +22,7 @@
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.nio.IntBuffer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.locks.ReentrantReadWriteLock;
Expand Down Expand Up @@ -583,6 +575,8 @@ public TupleSource createTupleSource(final List<? extends Expression> projectedC
}

private boolean createImplicitIndexIfNeeded(final Criteria condition) throws TeiidComponentException, TeiidProcessingException {
int operator = CompareCriteria.EQ;
LinkedHashSet<ElementSymbol> symbols = null;
for (Criteria c : Criteria.separateCriteriaByAnd(condition)) {
if (!(c instanceof CompareCriteria)) {
continue;
Expand All @@ -591,28 +585,37 @@ private boolean createImplicitIndexIfNeeded(final Criteria condition) throws Tei
if (cc.getOperator() == CompareCriteria.NE) {
continue;
}
if (symbols == null) {
symbols = new LinkedHashSet<>();
} else {
if (!symbols.isEmpty()) {
if (operator != cc.getOperator()) {
break;
}
}
operator = cc.getOperator();
}
//TODO: an assumption is that only a single predicate will be bind eligible - if not we'll just take the first
if (cc.getRightExpression() instanceof Constant && ((Constant)cc.getRightExpression()).isBindEligible()) {
//the left can be a array or a column
if (cc.getLeftExpression() instanceof ElementSymbol) {
this.addIndex(Arrays.asList((ElementSymbol)cc.getLeftExpression()), false);
return true;
symbols.add((ElementSymbol) cc.getLeftExpression());
} else if (cc.getLeftExpression() instanceof Array) {
List<ElementSymbol> symbols = new ArrayList<>();
for (Expression ex : ((Array)cc.getLeftExpression()).getExpressions()) {
if (ex instanceof ElementSymbol) {
symbols.add((ElementSymbol)ex);
} else {
break;
}
}
if (!symbols.isEmpty()) {
this.addIndex(symbols, false);
return true;
}
}
}
}
if (symbols != null && !symbols.isEmpty()) {
//TODO: order by ndv
this.addIndex(new ArrayList<>(symbols), false);
return true;
}
return false;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1271,6 +1271,43 @@ public TupleSource registerRequest(CommandContext context,
assertTrue(reads < 500000);
}

@Test public void testWithImplicitIndexingCompositeKey() throws Exception {
String sql = "with a (x, y, z) as /*+ no_inline */ (select e1, e2, e3 from pm1.g1) "
+ "select (select max(x) from a where z = pm1.g2.e3 and y = pm1.g2.e2), pm1.g2.* from pm1.g2"; //$NON-NLS-1$

HardcodedDataManager dataManager = new HardcodedDataManager();

ProcessorPlan plan = helpGetPlan(helpParse(sql), RealMetadataFactory.example1Cached());

int rowCount = 10240;

List<?>[] rows = new List<?>[rowCount];
for (int i = 0; i < rows.length; i++) {
rows[i] = Arrays.asList(String.valueOf(i), i, i%2==0);
}

dataManager.addData("SELECT pm1.g1.e1, pm1.g1.e2, pm1.g1.e3 FROM pm1.g1", rows);

rows = new List<?>[rowCount];
for (int i = 0; i < rows.length; i++) {
rows[i] = Arrays.asList("a", i, i%2==0, 1.1);
}

dataManager.addData("SELECT pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4 FROM pm1.g2", rows);

List<?>[] expected = new List[rowCount];
for (int i = 0; i < rows.length; i++) {
expected[i] = Arrays.asList(String.valueOf(i), "a", i, i%2==0, 1.1);
}

CommandContext cc = createCommandContext();
BufferManagerImpl bm = (BufferManagerImpl) cc.getBufferManager();
long reads = bm.getReadAttempts();
helpProcess(plan, cc, dataManager, expected);
reads = bm.getReadAttempts() - reads;
assertTrue(reads < 250000);
}

@Test public void testRecursiveWithProjectionMinimization() throws Exception {
String sql = "WITH table3 (column5,column6,column7) AS (\n" +
"SELECT column1, column2, column3 FROM table1 where column1 = 'joe'\n" +
Expand Down

0 comments on commit d81c4ff

Please sign in to comment.