docs: public static String makeFilterExpression(Pipeline pipeline) {
          List<DataMediaPair> dataMediaPairs = pipeline.getPairs();
          if (dataMediaPairs.isEmpty()) {
              throw new SelectException("ERROR ## the pair is empty,the pipeline id = " + pipeline.getId());
          }
  
          Set<String> mediaNames = new HashSet<String>();
          for (DataMediaPair dataMediaPair : dataMediaPairs) {
              DataMedia.ModeValue namespaceMode = dataMediaPair.getSource().getNamespaceMode();
              DataMedia.ModeValue nameMode = dataMediaPair.getSource().getNameMode();
  
              if (namespaceMode.getMode().isSingle()) {
                  buildFilter(mediaNames, namespaceMode.getSingleValue(), nameMode, false);
              } else if (namespaceMode.getMode().isMulti()) {
                  for (String namespace : namespaceMode.getMultiValue()) {
                      buildFilter(mediaNames, namespace, nameMode, false);
                  }
              } else if (namespaceMode.getMode().isWildCard()) {
                  buildFilter(mediaNames, namespaceMode.getSingleValue(), nameMode, true);
              }
          }
  
          StringBuilder result = new StringBuilder();
          Iterator<String> iter = mediaNames.iterator();
          int i = -1;
          while (iter.hasNext()) {
              i++;
              if (i == 0) {
                  result.append(iter.next());
              } else {
                  result.append(",").append(iter.next());
              }
          }
  
          String markTable = pipeline.getParameters().getSystemSchema() + "."
                             + pipeline.getParameters().getSystemMarkTable();
          String bufferTable = pipeline.getParameters().getSystemSchema() + "."
                               + pipeline.getParameters().getSystemBufferTable();
          String dualTable = pipeline.getParameters().getSystemSchema() + "."
                             + pipeline.getParameters().getSystemDualTable();
  
          if (!mediaNames.contains(markTable)) {
              result.append(",").append(markTable);
          }
  
          if (!mediaNames.contains(bufferTable)) {
              result.append(",").append(bufferTable);
          }
  
          if (!mediaNames.contains(dualTable)) {
              result.append(",").append(dualTable);
          }
  
          // String otterTable = pipeline.getParameters().getSystemSchema() +
          // "\\..*";
          // if (!mediaNames.contains(otterTable)) {
          // result.append(",").append(otterTable);
          // }
  
          return result.toString();
      }