@Override
  public DecomposedPredicate decomposePredicate(JobConf jobConf, Deserializer deserializer, ExprNodeDesc exprNodeDesc) {
    DecomposedPredicate predicate = new DecomposedPredicate();
    predicate.residualPredicate = (ExprNodeGenericFuncDesc) exprNodeDesc;
    ExprNodeDesc pushedPredicate = exprNodeDesc.clone();

    List<ExprNodeDesc> subExprNodes = pushedPredicate.getChildren();
    Set<String> skipList = Stream.of(FILE_PATH, PARTITION_SPEC_ID, PARTITION_HASH)
        .map(VirtualColumn::getName).collect(Collectors.toSet());

    if (subExprNodes.removeIf(nodeDesc -> nodeDesc.getCols() != null &&
          nodeDesc.getCols().stream().anyMatch(skipList::contains))) {
      if (subExprNodes.size() == 1) {
        pushedPredicate = (subExprNodes.get(0) instanceof ExprNodeGenericFuncDesc) ?
            subExprNodes.get(0) : null;
      } else if (subExprNodes.isEmpty()) {
        pushedPredicate = null;
      }
    }
    predicate.pushedPredicate = (ExprNodeGenericFuncDesc) pushedPredicate;
    Expression filterExpr = HiveIcebergInputFormat.getFilterExpr(conf, predicate.pushedPredicate);
    if (filterExpr != null) {
      SessionStateUtil.addResource(conf, InputFormatConfig.QUERY_FILTERS, filterExpr);
    }
    return predicate;
  }
@param jobConf Job configuration for InputFormat to access
@param deserializer Deserializer
@param exprNodeDesc Filter expression extracted by Hive
@return Entire filter to take advantage of Hive's pruning as well as Iceberg's pruning.
iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/hive/HiveIcebergStorageHandler.java