void toDuckDbFilter()

in velox/dwio/parquet/reader/ParquetReader.cpp [53:158]


void toDuckDbFilter(
    uint64_t colIdx,
    ::duckdb::LogicalType type,
    common::Filter* filter,
    ::duckdb::TableFilterSet& filters) {
  switch (filter->kind()) {
    case common::FilterKind::kBigintRange: {
      auto rangeFilter = static_cast<common::BigintRange*>(filter);
      if (rangeFilter->isSingleValue()) {
        filters.PushFilter(
            colIdx, constantEqualFilter(makeValue(type, rangeFilter->lower())));
      } else {
        if (rangeFilter->lower() != std::numeric_limits<int64_t>::min()) {
          filters.PushFilter(
              colIdx,
              constantFilter(
                  ::duckdb::ExpressionType::COMPARE_GREATERTHANOREQUALTO,
                  makeValue(type, rangeFilter->lower())));
        }
        if (rangeFilter->upper() != std::numeric_limits<int64_t>::max()) {
          filters.PushFilter(
              colIdx,
              constantFilter(
                  ::duckdb::ExpressionType::COMPARE_LESSTHANOREQUALTO,
                  makeValue(type, rangeFilter->upper())));
        }
      }
      break;
    }

    case common::FilterKind::kDoubleRange: {
      auto rangeFilter = static_cast<common::DoubleRange*>(filter);
      if (!rangeFilter->lowerUnbounded()) {
        auto expressionType = rangeFilter->lowerExclusive()
            ? ::duckdb::ExpressionType::COMPARE_GREATERTHAN
            : ::duckdb::ExpressionType::COMPARE_GREATERTHANOREQUALTO;
        filters.PushFilter(
            colIdx,
            constantFilter(
                expressionType, ::duckdb::Value(rangeFilter->lower())));
      }
      if (!rangeFilter->upperUnbounded()) {
        auto expressionType = rangeFilter->upperExclusive()
            ? ::duckdb::ExpressionType::COMPARE_LESSTHAN
            : ::duckdb::ExpressionType::COMPARE_LESSTHANOREQUALTO;
        filters.PushFilter(
            colIdx,
            constantFilter(
                expressionType, ::duckdb::Value(rangeFilter->upper())));
      }
      break;
    }

    case common::FilterKind::kBytesValues: {
      auto valuesFilter = static_cast<common::BytesValues*>(filter);
      const auto& values = valuesFilter->values();
      if (values.size() == 1) {
        filters.PushFilter(colIdx, constantEqualFilter(*values.begin()));
      } else {
        auto duckFilter = std::make_unique<::duckdb::ConjunctionOrFilter>();
        for (const auto& value : values) {
          duckFilter->child_filters.push_back(constantEqualFilter(value));
        }
        filters.PushFilter(colIdx, std::move(duckFilter));
      }
      break;
    }

    case common::FilterKind::kBytesRange: {
      auto rangeFilter = static_cast<common::BytesRange*>(filter);
      if (!rangeFilter->lowerUnbounded()) {
        auto expressionType = rangeFilter->lowerExclusive()
            ? ::duckdb::ExpressionType::COMPARE_GREATERTHAN
            : ::duckdb::ExpressionType::COMPARE_GREATERTHANOREQUALTO;
        filters.PushFilter(
            colIdx,
            constantFilter(
                expressionType, ::duckdb::Value(rangeFilter->lower())));
      }
      if (!rangeFilter->upperUnbounded()) {
        auto expressionType = rangeFilter->upperExclusive()
            ? ::duckdb::ExpressionType::COMPARE_LESSTHAN
            : ::duckdb::ExpressionType::COMPARE_LESSTHANOREQUALTO;
        filters.PushFilter(
            colIdx,
            constantFilter(
                expressionType, ::duckdb::Value(rangeFilter->upper())));
      }
      break;
    }

    case common::FilterKind::kAlwaysFalse:
    case common::FilterKind::kAlwaysTrue:
    case common::FilterKind::kIsNull:
    case common::FilterKind::kIsNotNull:
    case common::FilterKind::kBoolValue:
    case common::FilterKind::kBigintValuesUsingHashTable:
    case common::FilterKind::kBigintValuesUsingBitmask:
    case common::FilterKind::kFloatRange:
    case common::FilterKind::kBigintMultiRange:
    case common::FilterKind::kMultiRange:
    default:
      VELOX_UNSUPPORTED(
          "Unsupported filter in parquet reader: {}", filter->toString());
  }
}