docs: protected static void classifyJoinExpressions(Collection<AbstractExpression> exprList,
              Collection<String> outerTables, Collection<String> innerTables,
              List<AbstractExpression> outerList, List<AbstractExpression> innerList,
              List<AbstractExpression> innerOuterList, List<AbstractExpression> noneList)
      {
          HashSet<String> tableAliasSet = new HashSet<>();
          HashSet<String> outerSet = new HashSet<>(outerTables);
          HashSet<String> innerSet = new HashSet<>(innerTables);
          for (AbstractExpression expr : exprList) {
              tableAliasSet.clear();
              getTablesForExpression(expr, tableAliasSet);
              String tableAliases[] = tableAliasSet.toArray(new String[0]);
              if (tableAliasSet.isEmpty()) {
                  noneList.add(expr);
              } else {
                  boolean outer = false;
                  boolean inner = false;
                  for (String alias : tableAliases) {
                      outer = outer || outerSet.contains(alias);
                      inner = inner || innerSet.contains(alias);
                  }
                  if (outer && inner) {
                      innerOuterList.add(expr);
                  } else if (outer) {
                      outerList.add(expr);
                  } else if (inner) {
                      innerList.add(expr);
                  } else {
                      // can not be, right?
                      assert(false);
                  }
              }
          }
      }