protected static ArrayList<TableFilter> filterNotTableMate(TableFilter f) { ArrayList<TableFilter> result = New.arrayList(); do { if (f.isFromTableMate()) { result.add(f); } TableFilter n = f.getNestedJoin(); if (n != null) { result.addAll(filterNotTableMate(n)); } f = f.getJoin(); } while (f != null); return result; }
protected static TableMate getTableMate(TableFilter filter) { if (filter.isFromTableMate()) { return (TableMate) filter.getTable(); } throw DbException.get(ErrorCode.TABLE_OR_VIEW_NOT_FOUND_1, filter.getTable().getName()); }
protected void doPrepare() { searchColumns = tableFilter.getTable().getColumns(); Select select = tableFilter.getSelect(); if (select != null && tableFilter.isFromTableMate()) { HashSet<Column> columns = New.linkedHashSet(); select.isEverything(ExpressionVisitor.getColumnsVisitor(columns)); ArrayList<Column> selected = New.arrayList(10); for (Column column : columns) { if (table == column.getTable()) { selected.add(column); } } //product_category columns is empty null where visitor this sql //SELECT count(*) FROM product_category a LEFT JOIN (SELECT product_category_id, count(*) //c FROM product GROUP BY product_category_id) b ON a.product_category_id = b.product_category_id; if(!selected.isEmpty()) { searchColumns = selected.toArray(new Column[selected.size()]); } } }
private boolean isDirectLookup() { for (TableFilter tf : filters) { if (!tf.isFromTableMate() && !isNestedJoinTable(tf)) { return false; } } if (filters.size() == 1) { return true; } else { List<TableFilter> shardingTableFilter = New.arrayList(); for (TableFilter tf : filters) { if(isNestedJoinTable(tf)) { continue; } if (!isGropTableFilter(tf)) { return false; } TableMate table = (TableMate) tf.getTable(); if (table.getRuleColumns() != null) { shardingTableFilter.add(tf); } } if (shardingTableFilter.size() < 2) { return true; } this.joinTableChain = New.hashSet(); evaluationJoinChain(shardingTableFilter.iterator().next()); return joinTableChain.containsAll(shardingTableFilter); } }