private void evaluationJoinChain(TableFilter filter) {
      TableMate table1 = (TableMate) filter.getTable();
      Column[] columns1 = table1.getRuleColumns();
      if (columns1 == null) {
        throw new IllegalArgumentException("not sharding TableFilter");
      }
      ArrayList<IndexCondition> conditions = getIndexConditions(filter);
      List<IndexCondition> masks = New.arrayList(10);
      List<Column> compareColumns = New.arrayList(10);
      for (Column column : columns1) {
        for (IndexCondition condition : conditions) {
          Column compareColumn = condition.getCompareColumn();
          if ((condition.getMask(conditions) & IndexCondition.EQUALITY)
              != IndexCondition.EQUALITY) {
            continue;
          }
          if (condition.getColumn() != column || compareColumn == null) {
            continue;
          }
          masks.add(condition);
          compareColumns.add(compareColumn);
        }
      }

      Set<Table> tables = New.hashSet();
      for (IndexCondition mask : masks) {
        Column compareColumn = mask.getCompareColumn();
        Table table = compareColumn.getTable();
        if (!(table instanceof TableMate)) {
          continue;
        }
        TableMate tableMate = (TableMate) table;
        Column[] rc = tableMate.getRuleColumns();
        if (compareColumns.containsAll(Arrays.asList(rc))) {
          tables.add(table);
        }
      }
      if (tables.isEmpty()) {
        return;
      }
      for (Table table : tables) {
        for (TableFilter tf : filters) {
          if (tf.getTable() == table && !joinTableChain.contains(tf)) {
            joinTableChain.add(tf);
            evaluationJoinChain(tf);
          }
        }
      }
    }
 private boolean isGropTableFilter(TableFilter filter) {
   TableMate table1 = (TableMate) filter.getTable();
   for (TableFilter item : filters) {
     if (item == filter || isNestedJoinTable(item)) {
       continue;
     }
     TableMate table2 = (TableMate) item.getTable();
     TableRule rule1 = table1.getTableRule();
     TableRule rule2 = table2.getTableRule();
     if (!rule1.isNodeComparable(rule2)) {
       return false;
     }
   }
   return true;
 }
 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);
   }
 }
 private boolean isNestedJoinTable(TableFilter f) {
   return f.getTable() instanceof RangeTable
       && StringUtils.startsWith(f.getTableAlias(), Constants.PREFIX_JOIN);
 }