# -*- mode: python -*-

Import([
    "env",
    "get_option",
])

env = env.Clone()

env.SConscript(
    dirs=[
        'boolean_simplification',
        'ce',
        'collation',
        'cost_model',
        'datetime',
        'optimizer',
        'query_settings',
        'query_stats',
        'query_shape',
        'search',
        'stats',
    ],
    exports=[
        'env',
    ],
)

env.Library(
    target='query_knob_configuration',
    source=[
        'query_knob_configuration.cpp',
    ],
    LIBDEPS_PRIVATE=[
        '$BUILD_DIR/mongo/db/mongohasher',
        '$BUILD_DIR/mongo/db/server_base',
        'query_knobs',
    ],
)

env.Library(
    target='canonical_query',
    source=[
        'canonical_query.cpp',
        'canonical_query_encoder.cpp',
        'parsed_distinct_command.cpp',
        'parsed_find_command.cpp',
        'query_shape/distinct_cmd_shape.cpp',
        'query_shape/find_cmd_shape.cpp',
        'query_stats/find_key.cpp',
        'query_utils.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/crypto/encrypted_field_config',
        '$BUILD_DIR/mongo/db/cst/cst',
        '$BUILD_DIR/mongo/db/query_expressions',
        'collation/collator_factory_interface',
        'collation/collator_interface',
        'projection_ast',
        'sort_pattern',
    ],
    LIBDEPS_PRIVATE=[
        'common_query_enums_and_helpers',
    ],
)

env.Library(
    target='query_planner',
    source=[
        'expression_index_knobs.idl',
        'expression_index.cpp',
        'index_bounds_builder.cpp',
        'interval_evaluation_tree.cpp',
        'plan_cache_indexability.cpp',
        'plan_enumerator/enumerator_memo.cpp',
        'plan_enumerator/memo_prune.cpp',
        'plan_enumerator/plan_enumerator.cpp',
        'planner_access.cpp',
        'planner_analysis.cpp',
        'planner_ixselect.cpp',
        'planner_wildcard_helpers.cpp',
        'query_planner_common.cpp',
        'query_planner.cpp',
        'query_settings.cpp',
        'query_solution.cpp',
        'record_id_range.cpp',
        'stage_types.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/db/catalog/collection_options',
        '$BUILD_DIR/mongo/db/exec/sbe/query_sbe_plan_stats',
        '$BUILD_DIR/mongo/db/index/expression_params',
        '$BUILD_DIR/mongo/db/query_expressions',
        'canonical_query',
        'query_index_bounds',
        'query_knobs',
    ],
    LIBDEPS_PRIVATE=[
        '$BUILD_DIR/mongo/db/commands/server_status_core',
        '$BUILD_DIR/mongo/db/fts/base_fts',
        '$BUILD_DIR/mongo/db/index/index_access_method',
        '$BUILD_DIR/mongo/db/record_id_helpers',
        '$BUILD_DIR/mongo/db/server_base',
        'query_plan_cache',
    ],
)

env.Library(
    target="query_index_bounds",
    source=[
        "index_bounds.cpp",
        "index_entry.cpp",
        "index_tag.cpp",
        "interval.cpp",
    ],
    LIBDEPS=[
        "$BUILD_DIR/mongo/base",
        "$BUILD_DIR/mongo/db/query_expressions",
    ],
)

env.Library(
    target='memory_util',
    source=[
        'util/memory_util.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/util/pcre_wrapper',
        '$BUILD_DIR/mongo/util/processinfo',
    ],
)

env.Library(
    target='query_plan_cache',
    source=[
        'classic_plan_cache.cpp',
        'plan_cache_callbacks.cpp',
        'plan_cache_invalidator.cpp',
        'sbe_plan_cache.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/base',
        '$BUILD_DIR/mongo/db/exec/sbe/query_sbe',
        '$BUILD_DIR/mongo/db/query_expressions',
        'canonical_query',
        'memory_util',
        'query_settings/utils',
    ],
)

env.Library(
    target='spill_util',
    source=[
        'util/spill_util.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/base',
        '$BUILD_DIR/mongo/db/storage/disk_space_util',
    ],
)

env.Library(
    target='projection_ast',
    source=[
        'projection.cpp',
        'projection_ast_util.cpp',
        'projection_parser.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/db/query_expressions',
    ],
    LIBDEPS_PRIVATE=[
        '$BUILD_DIR/mongo/db/server_base',
    ],
)

env.Library(
    target='index_hint',
    source=[
        'index_hint.idl',
        'index_hint.cpp',
    ],
    LIBDEPS_PRIVATE=[
        '$BUILD_DIR/mongo/db/server_base',
    ],
)

env.Library(
    target="bucket_predicate_generator",
    source=[
        "timeseries/bucket_spec.cpp",
        "timeseries/bucket_level_comparison_predicate_generator.cpp",
        "timeseries/bucket_level_id_predicate_generator.cpp",
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/db/exec/document_value/document_value',
        "$BUILD_DIR/mongo/db/query_expressions",
    ],
    LIBDEPS_PRIVATE=[
        "$BUILD_DIR/mongo/bson/util/bson_column",
        "$BUILD_DIR/mongo/db/timeseries/timeseries_options",
    ],
)

# Shared mongod/mongos query code.
env.Library(
    target='query_common',
    source=[
        'canonical_distinct.cpp',
        'explain_common.cpp',
        'find_common.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/util/fail_point',
        'collation/collator_factory_icu',
        'collation/collator_icu',
        'common_query_enums_and_helpers',
        'datetime/init_timezone_data',
        'query_planner',
        'query_request',
    ],
    LIBDEPS_PRIVATE=[
        '$BUILD_DIR/mongo/db/curop_failpoint_helpers',
        '$BUILD_DIR/mongo/db/server_base',
    ],
)

env.Library(
    target="common_query_enums_and_helpers",
    source=[
        "allowed_contexts.cpp",
        "analyze_regex.cpp",
        "explain_options.cpp",
        "explain_verbosity.idl",
    ],
    LIBDEPS=[
        "$BUILD_DIR/mongo/db/api_parameters",
    ],
    LIBDEPS_PRIVATE=[
        "$BUILD_DIR/mongo/db/server_base",
        "$BUILD_DIR/mongo/transport/transport_layer_common",
    ],
)

env.Library(
    target='map_reduce_output_format',
    source=[
        'map_reduce_output_format.cpp',
    ],
    LIBDEPS_PRIVATE=[
        '$BUILD_DIR/mongo/db/server_base',
    ],
)

env.Library(
    target='cursor_response_idl',
    source=[
        'cursor_idl_validator.cpp',
        'cursor_response.idl',
    ],
    LIBDEPS_PRIVATE=[
        '$BUILD_DIR/mongo/db/server_base',
    ],
)

env.Library(
    target='command_request_response',
    source=[
        'analyze_command.idl',
        'count_command_as_aggregation_command.cpp',
        'count_command.idl',
        'count_request.cpp',
        'cursor_request.cpp',
        'cursor_response.cpp',
        'kill_cursors.idl',
        'view_response_formatter.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/bson/util/bson_extract',
        '$BUILD_DIR/mongo/db/common',
        '$BUILD_DIR/mongo/db/ops/write_ops_parsers',
        '$BUILD_DIR/mongo/db/query/hint_parser',
        '$BUILD_DIR/mongo/db/repl/optime',
        '$BUILD_DIR/mongo/rpc/command_status',
        '$BUILD_DIR/mongo/rpc/rpc',
        'query_request',
    ],
    LIBDEPS_PRIVATE=[
        '$BUILD_DIR/mongo/db/server_base',
        'cursor_response_idl',
    ],
)

env.Library(
    target='query_request',
    source=[
        'distinct_command.idl',
        'find_command.idl',
        'getmore_command.idl',
        'query_request_helper.cpp',
        'max_time_ms_parser.cpp',
        'tailable_mode.cpp',
        'tailable_mode.idl',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/crypto/fle_fields',
        '$BUILD_DIR/mongo/db/api_parameters',
        '$BUILD_DIR/mongo/db/auth/authprivilege',
        '$BUILD_DIR/mongo/db/auth/security_token_auth',
        '$BUILD_DIR/mongo/db/commands/test_commands_enabled',
        '$BUILD_DIR/mongo/db/pipeline/runtime_constants_idl',
        '$BUILD_DIR/mongo/db/repl/read_concern_args',
        '$BUILD_DIR/mongo/db/repl/repl_coordinator_interface',
        '$BUILD_DIR/mongo/s/common_s',
        'hint_parser',
    ],
    LIBDEPS_PRIVATE=[
        '$BUILD_DIR/mongo/db/server_base',
        'cursor_response_idl',
        'query_settings/query_settings',
    ],
)

env.Library(
    target='query_knobs',
    source=[
        'ce_mode_parameter.cpp',
        'cost_model/cost_model_on_update.cpp',
        'explain_version_validator.cpp',
        'framework_control.cpp',
        'query_feature_flags.idl',
        'query_knobs.idl',
        'query_stats/query_stats_on_parameter_change.cpp',
        'sbe_plan_cache_on_parameter_change.cpp',
    ],
    LIBDEPS_PRIVATE=[
        '$BUILD_DIR/mongo/db/commands/test_commands_enabled',
        '$BUILD_DIR/mongo/db/server_base',
        '$BUILD_DIR/mongo/db/service_context',
        '$BUILD_DIR/mongo/idl/cluster_server_parameter',
        '$BUILD_DIR/mongo/util/pcre_wrapper',
        'memory_util',
    ],
)

env.Library(
    target='query_test_service_context',
    source=[
        'query_test_service_context.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/db/service_context_test_fixture',
        'collation/collator_factory_mock',
    ],
    LIBDEPS_PRIVATE=[
        '$BUILD_DIR/mongo/db/concurrency/lock_manager',
        '$BUILD_DIR/mongo/s/grid',
    ],
)

env.Library(
    target="query_planner_test_fixture",
    source=[
        "query_planner_test_fixture.cpp",
    ],
    LIBDEPS=[
        "$BUILD_DIR/mongo/unittest/unittest",
        "query_planner_test_lib",
    ],
)

env.Library(
    target="query_planner_test_lib",
    source=[
        "query_planner_test_lib.cpp",
    ],
    LIBDEPS=[
        "collation/collator_factory_mock",
        "query_planner",
        "query_test_service_context",
    ],
)

env.Library(
    target='hint_parser',
    source=[
        'hint_parser.cpp',
        'hint.idl',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/base',
    ],
)

env.Library(
    target='sort_pattern',
    source=[
        'sort_pattern.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/base',
        '$BUILD_DIR/mongo/db/exec/document_value/document_value',
        '$BUILD_DIR/mongo/db/query_expressions',
    ],
)

env.Library(
    target='str_trim_utils',
    source=[
        'str_trim_utils.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/base',
    ],
)

env.Library(
    target='plan_yield_policy',
    source=[
        'plan_yield_policy.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/base',
        '$BUILD_DIR/mongo/util/elapsed_tracker',
        '$BUILD_DIR/mongo/util/fail_point',
    ],
    LIBDEPS_PRIVATE=[
        '$BUILD_DIR/mongo/db/catalog/collection_uuid_mismatch_info',
        '$BUILD_DIR/mongo/db/concurrency/exception_util',
        '$BUILD_DIR/mongo/db/shard_role',
        '$BUILD_DIR/mongo/db/storage/recovery_unit_base',
    ],
)

env.Library(
    target='plan_executor',
    source=[
        'plan_executor.cpp',
        'plan_yield_policy_remote_cursor.cpp',
        'yield_policy_callbacks_impl.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/db/catalog/collection_query_info',
        '$BUILD_DIR/mongo/db/shard_filterer',
        '$BUILD_DIR/mongo/db/shard_role',
        'plan_yield_policy',
        'query_common',
    ],
    LIBDEPS_PRIVATE=[
        '$BUILD_DIR/mongo/db/catalog/collection_crud',
        '$BUILD_DIR/mongo/db/catalog/database_holder',
        '$BUILD_DIR/mongo/db/server_base',
        '$BUILD_DIR/mongo/executor/task_executor_cursor',
    ],
)

env.Library(
    target='plan_cache_test_util',
    source=[
        'plan_cache_test_util.cpp',
    ],
    LIBDEPS=['$BUILD_DIR/mongo/db/query_exec'],
)

env.CppUnitTest(
    target='db_query_test',
    source=[
        'canonical_distinct_test.cpp',
        'canonical_query_encoder_test.cpp',
        'canonical_query_test.cpp',
        'canonical_query_test_util.cpp',
        'ce_mode_parameter_test.cpp',
        'classic_runtime_planner_for_sbe/classic_runtime_planner_for_sbe_test.cpp',
        'classic_runtime_planner_for_sbe/classic_runtime_planner_for_sbe_test_util.cpp',
        'classic_stage_builder_test.cpp',
        'collection_query_info_test.cpp',
        'count_command_test.cpp',
        'cqf_fast_paths_test.cpp',
        'cqf_fast_paths_utils_test.cpp',
        'cqf_plan_cache_test.cpp',
        'cursor_response_test.cpp',
        'field_set_test.cpp',
        'find_common_test.cpp',
        'getmore_request_test.cpp',
        'hint_parser_test.cpp',
        'index_bounds_builder_collator_test.cpp',
        'index_bounds_builder_eq_null_test.cpp',
        'index_bounds_builder_interval_test.cpp',
        'index_bounds_builder_regex_test.cpp',
        'index_bounds_builder_test.cpp',
        'index_bounds_builder_type_test.cpp',
        'index_bounds_test.cpp',
        'index_entry_test.cpp',
        'index_hint_test.cpp',
        'interval_evaluation_tree_test.cpp',
        'interval_test.cpp',
        'killcursors_request_test.cpp',
        'lru_key_value_test.cpp',
        'map_reduce_output_format_test.cpp',
        'max_time_ms_parser_test.cpp',
        'plan_cache_indexability_test.cpp',
        'plan_cache_key_info_test.cpp',
        'plan_cache_test.cpp',
        'plan_executor_express_test.cpp',
        'plan_ranker_index_prefix_test.cpp',
        'plan_ranker_test.cpp',
        'planner_access_test.cpp',
        'planner_analysis_test.cpp',
        'planner_ixselect_test.cpp',
        'planner_wildcard_helpers_test.cpp',
        'projection_ast_test.cpp',
        'projection_effects_test.cpp',
        'projection_test.cpp',
        'query_planner_array_test.cpp',
        'query_planner_collation_test.cpp',
        'query_planner_columnar_test.cpp',
        'query_planner_geo_test.cpp',
        'query_planner_hashed_index_test.cpp',
        'query_planner_index_test.cpp',
        'query_planner_operator_test.cpp',
        'query_planner_options_test.cpp',
        'query_planner_params_test.cpp',
        'query_planner_partialidx_test.cpp',
        'query_planner_pipeline_pushdown_test.cpp',
        'query_planner_text_test.cpp',
        'query_planner_tree_test.cpp',
        'query_planner_wildcard_index_test.cpp',
        'query_request_test.cpp',
        'query_settings/query_settings_hash_test.cpp',
        'query_settings/query_settings_manager_test.cpp',
        'query_settings/query_settings_utils_test.cpp',
        'query_settings/query_settings_validation_test.cpp',
        'query_settings_test.cpp',
        'query_shape/agg_cmd_shape_test.cpp',
        'query_shape/cmd_with_let_shape_test.cpp',
        'query_shape/distinct_cmd_shape_test.cpp',
        'query_shape/find_cmd_shape_test.cpp',
        'query_solution_test.cpp',
        'record_id_range_test.cpp',
        'sbe_and_hash_test.cpp',
        'sbe_and_sorted_test.cpp',
        'sbe_shard_filter_test.cpp',
        'sbe_stage_builder_accumulator_test.cpp',
        'sbe_stage_builder_const_eval_test.cpp',
        'sbe_stage_builder_lookup_test.cpp',
        'sbe_stage_builder_test.cpp',
        'sbe_stage_builder_test_fixture.cpp',
        'sbe_stage_builder_type_checker_test.cpp',
        'sbe_stage_builder_vectorizer_test.cpp',
        'sbe_stage_builder_value_lifetime_test.cpp',
        'sbe_stage_builder_window_function_test.cpp',
        'shard_filterer_factory_mock.cpp',
        'sort_pattern_test.cpp',
        'util/cartesian_product_test.cpp',
        'util/deferred_test.cpp',
        'util/hash_roaring_set_test.cpp',
        'util/memory_util_test.cpp',
        'view_response_formatter_test.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/db/auth/authmocks',
        '$BUILD_DIR/mongo/db/catalog/catalog_impl',
        '$BUILD_DIR/mongo/db/catalog/collection_crud',
        '$BUILD_DIR/mongo/db/catalog/collection_query_info',
        '$BUILD_DIR/mongo/db/exec/document_value/document_value_test_util',
        '$BUILD_DIR/mongo/db/exec/sbe/sbe_plan_stage_test',
        '$BUILD_DIR/mongo/db/multitenancy',
        '$BUILD_DIR/mongo/db/pipeline/abt_translation',
        '$BUILD_DIR/mongo/db/pipeline/aggregation_request_helper',
        '$BUILD_DIR/mongo/db/pipeline/document_source_mock',
        '$BUILD_DIR/mongo/db/query_exec',
        '$BUILD_DIR/mongo/db/record_id_helpers',
        '$BUILD_DIR/mongo/db/repl/replmocks',
        '$BUILD_DIR/mongo/db/repl/storage_interface_impl',
        '$BUILD_DIR/mongo/db/service_context_d_test_fixture',
        '$BUILD_DIR/mongo/db/storage/devnull/storage_devnull_core',
        '$BUILD_DIR/mongo/db/storage/storage_options',
        '$BUILD_DIR/mongo/dbtests/mocklib',
        '$BUILD_DIR/mongo/idl/idl_parser',
        '$BUILD_DIR/mongo/rpc/rpc',
        '$BUILD_DIR/mongo/util/clock_source_mock',
        'collation/collator_factory_mock',
        'collation/collator_interface_mock',
        'common_query_enums_and_helpers',
        'hint_parser',
        'index_hint',
        'map_reduce_output_format',
        'optimizer/unit_test_utils',
        'plan_cache_test_util',
        'query_common',
        'query_planner',
        'query_planner_test_fixture',
        'query_request',
        'query_settings/manager',
        'query_shape/query_shape',
        'query_test_service_context',
    ],
)

env.CppUnitTest(
    target='express_execution_test',
    source=['express_plan_test.cpp'],
    LIBDEPS=[
        '$BUILD_DIR/mongo/db/catalog/catalog_test_fixture',
        '$BUILD_DIR/mongo/db/catalog/collection_crud',
        '$BUILD_DIR/mongo/db/query_exec',
        '$BUILD_DIR/mongo/db/record_id_helpers',
        '$BUILD_DIR/mongo/db/shard_role',
        '$BUILD_DIR/mongo/db/write_stage_common',
        'query_planner',
    ],
)

env.Benchmark(
    target='sbe_expression_bm',
    source=[
        'sbe_expression_bm.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/db/auth/authmocks',
        '$BUILD_DIR/mongo/db/exec/sbe/query_sbe_stages',
        '$BUILD_DIR/mongo/db/pipeline/expression_bm_fixture',
        '$BUILD_DIR/mongo/db/query_exec',
        '$BUILD_DIR/mongo/db/service_context_non_d',
        'query_test_service_context',
    ],
)

env.Benchmark(
    target='canonical_query_bm',
    source=['canonical_query_bm.cpp'],
    LIBDEPS=[
        '$BUILD_DIR/mongo/db/matcher/expressions_mongod_only',
        '$BUILD_DIR/mongo/db/query/canonical_query',
        '$BUILD_DIR/mongo/db/query/query_test_service_context',
    ],
)

env.Benchmark(
    target='plan_cache_key_encoding_bm',
    source=[
        'plan_cache_key_encoding_agg_bm.cpp',
        'plan_cache_key_encoding_find_bm.cpp',
        'plan_cache_parse_encode_bm.cpp',
        'plan_cache_parse_encode_pipeline_bm.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/db/bonsai_query_bm_fixture',
        '$BUILD_DIR/mongo/db/pipeline/pipeline',
        '$BUILD_DIR/mongo/db/query/canonical_query',
        '$BUILD_DIR/mongo/db/query/query_test_service_context',
        '$BUILD_DIR/mongo/db/query_exec',
        '$BUILD_DIR/mongo/db/query_expressions',
        '$BUILD_DIR/mongo/db/service_context_non_d',
    ],
)

env.Benchmark(
    target='query_planner_bm',
    source=[
        'query_planner_bm.cpp',
    ],
    LIBDEPS=[
        'query_planner',
        'query_test_service_context',
    ],
)

env.Benchmark(
    target='plan_cache_classic_bm',
    source=[
        'plan_cache_classic_bm.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/db/catalog/catalog_impl',
        '$BUILD_DIR/mongo/db/query/canonical_query',
        '$BUILD_DIR/mongo/db/query/query_test_service_context',
        '$BUILD_DIR/mongo/s/sharding_router_api',
        'plan_cache_test_util',
    ],
)
