protected LookupFunction getLookupFunction(int[] joinKeys) {
    Schema projectedSchema = getProjectedSchema();

    List<String> joinKeyNames = getJoinKeyNames(joinKeys, projectedSchema);

    Configuration config = new Configuration();
    properties.forEach(config::setString);

    Optional<RowDataPredicate> rowDataPredicate =
        generatePredicate(projectedSchema, flinkExpression);

    AbstractAdaptHiveKeyedDataReader<RowData> flinkMORDataReader =
        generateMORReader(mixedTable, projectedSchema);
    DataIteratorReaderFunction<RowData> readerFunction =
        generateReaderFunction(mixedTable, projectedSchema);

    return new MixedFormatRowDataLookupFunction(
        KVTableFactory.INSTANCE,
        mixedTable,
        joinKeyNames,
        projectedSchema,
        filters,
        tableLoader,
        config,
        rowDataPredicate.orElse(null),
        flinkMORDataReader,
        readerFunction);
  }
@param tableName tableName
@param mixedFormatDynamicSource underlying source
@param mixedTable mixedTable
@param properties With all mixed-format table properties and sql options
@param tableLoader
amoro-format-mixed/amoro-mixed-flink/amoro-mixed-flink-common/src/main/java/org/apache/amoro/flink/table/MixedFormatDynamicSource.java