From 86b40aa522e75eb6d1fd72f54759f768964d05f9 Mon Sep 17 00:00:00 2001 From: tjworks Date: Wed, 28 Oct 2026 09:59:29 +0000 Subject: [PATCH 1/2] Support MongoDB aggregation pipelines and persistent DBs in scaffold - query_db now accepts {"collection": ..., "pipeline": [...]} for MongoDB and runs it via aggregate(); documented in the tool schema and prompt. - Mongo find() no longer silently caps results at 5 documents, matching SQL behaviour of returning every row. - DAB_PERSISTENT_DBS env var skips reload/cleanup of Mongo and Postgres databases that already exist, so repeated runs reuse loaded data. Needed by the bank freshness datasets, whose Mongo-only variants rely on aggregation queries. Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_01SQhxfVKEX2459gdzzSfZEw --- common_scaffold/prompts/prompt_builder.py | 1 + common_scaffold/tools/QueryDBTool.py | 2 +- common_scaffold/tools/db_utils/mongo_utils.py | 26 ++++++++++++++----- .../tools/db_utils/postgres_utils.py | 4 +++ 4 files changed, 25 insertions(+), 8 deletions(-) diff --git a/common_scaffold/prompts/prompt_builder.py b/common_scaffold/prompts/prompt_builder.py index fb83f9fa86..3eb9c57fbd 100644 --- a/common_scaffold/prompts/prompt_builder.py +++ b/common_scaffold/prompts/prompt_builder.py @@ -58,6 +58,7 @@ - query_db: {"tool": "query_db", "args": {"db_name": "some_db_name", "query": "SELECT * FROM some_table LIMIT some_limit;"}} # for SQL databases {"tool": "query_db", "args": {"db_name": "some_db_name", "query": "{\"collection\": \"some_collection\", \"filter\": {some_filter}, \"projection\": {some_projection}, \"limit\": some_limit}"}} # for MongoDB databases +{"tool": "query_db", "args": {"db_name": "some_db_name", "query": "{\"collection\": \"some_collection\", \"pipeline\": [some_aggregation_stages]}"}} # MongoDB aggregation - list_db: {"tool": "list_db", "args": {"db_name": "some_db_name"}} diff --git a/common_scaffold/tools/QueryDBTool.py b/common_scaffold/tools/QueryDBTool.py index b47e919441..1cd48368c7 100644 --- a/common_scaffold/tools/QueryDBTool.py +++ b/common_scaffold/tools/QueryDBTool.py @@ -46,7 +46,7 @@ def get_spec(self): }, "query": { "type": "string", - "description": "The query to execute. For SQL databases, provide a SQL query string. For MongoDB, provide a JSON string representing the query, including `collection` field, and optional `filter`, `projection`, and `limit` fields." + "description": "The query to execute. For SQL databases, provide a SQL query string. For MongoDB, provide a JSON string representing the query, including `collection` field, and optional `filter`, `projection`, and `limit` fields; or `collection` plus `pipeline` (a list of aggregation stages) to run an aggregation instead." } }, "required": ["db_name", "query"] diff --git a/common_scaffold/tools/db_utils/mongo_utils.py b/common_scaffold/tools/db_utils/mongo_utils.py index 4e7e0a6e48..2830ac03aa 100644 --- a/common_scaffold/tools/db_utils/mongo_utils.py +++ b/common_scaffold/tools/db_utils/mongo_utils.py @@ -1,4 +1,5 @@ import json +import os import pandas as pd from pymongo import MongoClient from common_scaffold.tools.db_utils import db_config @@ -17,6 +18,8 @@ # Reference: https://www.mongodb.com/docs/manual/administration/install-community/?linux-distribution=ubuntu&linux-package=default&operating-system=linux&search-linux=with-search-linux#start-mongodb-12 def load_db(dump_folder: str, db_name: str): + if os.getenv("DAB_PERSISTENT_DBS") and check_db_exists(db_name): + return if check_db_exists(db_name) == True: logging.getLogger(__name__).warning(f"Database '{db_name}' already exists. Cleaning up before loading dump.") clean_up(db_name) @@ -53,6 +56,8 @@ def check_db_exists(db_name): raise FatalError(f"MongoDB existence check error ({type(e).__name__}): {str(e)}") def clean_up(db_name): + if os.getenv("DAB_PERSISTENT_DBS"): + return logging.getLogger(__name__).debug(f"Cleaning up MongoDB database '{db_name}'") with MongoClient(db_config.MONGO_URI) as mongo_client: try: @@ -77,17 +82,21 @@ def check_args(db_client: dict, query: str): collection = query_json["collection"] filter = query_json.get("filter", {}) projection = query_json.get("projection", None) - limit = query_json.get("limit", 5) + limit = query_json.get("limit", None) # no silent cap: matches SQL, which returns every row + pipeline = query_json.get("pipeline", None) + if pipeline is not None and not isinstance(pipeline, list): + raise ValueError("Invalid Mongo query: `pipeline` must be a list of aggregation stages") return { "db_name": db_client['db_name'], "collection": collection, "filter": filter, "projection": projection, - "limit": limit + "limit": limit, + "pipeline": pipeline, } @staticmethod - def exec(db_name, collection, filter, projection, limit): + def exec(db_name, collection, filter, projection, limit, pipeline=None): with MongoClient(db_config.MONGO_URI) as mongo_client: db = mongo_client[db_name] @@ -95,10 +104,13 @@ def exec(db_name, collection, filter, projection, limit): raise ValueError(f"Collection does not exist: {collection}") try: - cursor = db[collection].find(filter, projection) - if limit is not None: - cursor = cursor.limit(limit) - result = list(cursor) + if pipeline is not None: + result = list(db[collection].aggregate(pipeline)) + else: + cursor = db[collection].find(filter, projection) + if limit is not None: + cursor = cursor.limit(limit) + result = list(cursor) except Exception as e: raise ValueError(f"MongoDB query execution error ({type(e).__name__}): {str(e)}") diff --git a/common_scaffold/tools/db_utils/postgres_utils.py b/common_scaffold/tools/db_utils/postgres_utils.py index 8b49e6e07a..f4855682c5 100644 --- a/common_scaffold/tools/db_utils/postgres_utils.py +++ b/common_scaffold/tools/db_utils/postgres_utils.py @@ -22,6 +22,8 @@ def pg_ident(identifier: str) -> str: def load_db(sql_file: str, db_name: str): + if os.getenv("DAB_PERSISTENT_DBS") and check_db_exists(db_name): + return if check_db_exists(db_name): logging.getLogger(__name__).warning(f"Database '{db_name}' already exists. Cleaning up before loading dump.") clean_up(db_name) @@ -91,6 +93,8 @@ def check_db_exists(db_name): def clean_up(db_name): + if os.getenv("DAB_PERSISTENT_DBS"): + return logging.getLogger(__name__).debug(f"Cleaning up PostgreSQL database '{db_name}'") try: conn = psycopg2.connect( From 5f09441fd4658431db570aa0ccce6c1eca70d720 Mon Sep 17 00:00:00 2001 From: tjworks Date: Wed, 28 Oct 2026 09:59:50 +0000 Subject: [PATCH 2/2] Add bank freshness datasets (48 queries, three DB layouts) Three variants of the same 48 time-sensitive banking questions, each with its own db_config.yaml, db_description.txt, ground_truth.csv and validate.py per query: - query_bank_fresh_direct: six source systems (Postgres core banking, SQLite cards/payments, DuckDB lending/insurance, Mongo CRM) - query_bank_fresh_live: single Mongo collection (bank_live) - query_bank_fresh_warehouse: single Mongo collection plus _meta (bank_warehouse) Agent run logs are intentionally left out, as for the other datasets. Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_01SQhxfVKEX2459gdzzSfZEw --- query_bank_fresh_direct/db_config.yaml | 21 +++++ query_bank_fresh_direct/db_description.txt | 55 ++++++++++++ .../db_description_withhint.txt | 0 .../query1/ground_truth.csv | 1 + query_bank_fresh_direct/query1/query.json | 1 + query_bank_fresh_direct/query1/validate.py | 81 ++++++++++++++++++ .../query10/ground_truth.csv | 1 + query_bank_fresh_direct/query10/query.json | 1 + query_bank_fresh_direct/query10/validate.py | 81 ++++++++++++++++++ .../query11/ground_truth.csv | 1 + query_bank_fresh_direct/query11/query.json | 1 + query_bank_fresh_direct/query11/validate.py | 81 ++++++++++++++++++ .../query12/ground_truth.csv | 1 + query_bank_fresh_direct/query12/query.json | 1 + query_bank_fresh_direct/query12/validate.py | 81 ++++++++++++++++++ .../query13/ground_truth.csv | 1 + query_bank_fresh_direct/query13/query.json | 1 + query_bank_fresh_direct/query13/validate.py | 81 ++++++++++++++++++ .../query14/ground_truth.csv | 1 + query_bank_fresh_direct/query14/query.json | 1 + query_bank_fresh_direct/query14/validate.py | 81 ++++++++++++++++++ .../query15/ground_truth.csv | 1 + query_bank_fresh_direct/query15/query.json | 1 + query_bank_fresh_direct/query15/validate.py | 81 ++++++++++++++++++ .../query16/ground_truth.csv | 1 + query_bank_fresh_direct/query16/query.json | 1 + query_bank_fresh_direct/query16/validate.py | 81 ++++++++++++++++++ .../query17/ground_truth.csv | 1 + query_bank_fresh_direct/query17/query.json | 1 + query_bank_fresh_direct/query17/validate.py | 81 ++++++++++++++++++ .../query18/ground_truth.csv | 1 + query_bank_fresh_direct/query18/query.json | 1 + query_bank_fresh_direct/query18/validate.py | 81 ++++++++++++++++++ .../query19/ground_truth.csv | 1 + query_bank_fresh_direct/query19/query.json | 1 + query_bank_fresh_direct/query19/validate.py | 81 ++++++++++++++++++ .../query2/ground_truth.csv | 1 + query_bank_fresh_direct/query2/query.json | 1 + query_bank_fresh_direct/query2/validate.py | 81 ++++++++++++++++++ .../query20/ground_truth.csv | 1 + query_bank_fresh_direct/query20/query.json | 1 + query_bank_fresh_direct/query20/validate.py | 81 ++++++++++++++++++ .../query21/ground_truth.csv | 1 + query_bank_fresh_direct/query21/query.json | 1 + query_bank_fresh_direct/query21/validate.py | 81 ++++++++++++++++++ .../query22/ground_truth.csv | 1 + query_bank_fresh_direct/query22/query.json | 1 + query_bank_fresh_direct/query22/validate.py | 81 ++++++++++++++++++ .../query23/ground_truth.csv | 1 + query_bank_fresh_direct/query23/query.json | 1 + query_bank_fresh_direct/query23/validate.py | 81 ++++++++++++++++++ .../query24/ground_truth.csv | 1 + query_bank_fresh_direct/query24/query.json | 1 + query_bank_fresh_direct/query24/validate.py | 81 ++++++++++++++++++ .../query25/ground_truth.csv | 1 + query_bank_fresh_direct/query25/query.json | 1 + query_bank_fresh_direct/query25/validate.py | 81 ++++++++++++++++++ .../query26/ground_truth.csv | 1 + query_bank_fresh_direct/query26/query.json | 1 + query_bank_fresh_direct/query26/validate.py | 81 ++++++++++++++++++ .../query27/ground_truth.csv | 1 + query_bank_fresh_direct/query27/query.json | 1 + query_bank_fresh_direct/query27/validate.py | 81 ++++++++++++++++++ .../query28/ground_truth.csv | 1 + query_bank_fresh_direct/query28/query.json | 1 + query_bank_fresh_direct/query28/validate.py | 81 ++++++++++++++++++ .../query29/ground_truth.csv | 1 + query_bank_fresh_direct/query29/query.json | 1 + query_bank_fresh_direct/query29/validate.py | 81 ++++++++++++++++++ .../query3/ground_truth.csv | 1 + query_bank_fresh_direct/query3/query.json | 1 + query_bank_fresh_direct/query3/validate.py | 81 ++++++++++++++++++ .../query30/ground_truth.csv | 1 + query_bank_fresh_direct/query30/query.json | 1 + query_bank_fresh_direct/query30/validate.py | 81 ++++++++++++++++++ .../query31/ground_truth.csv | 1 + query_bank_fresh_direct/query31/query.json | 1 + query_bank_fresh_direct/query31/validate.py | 81 ++++++++++++++++++ .../query32/ground_truth.csv | 1 + query_bank_fresh_direct/query32/query.json | 1 + query_bank_fresh_direct/query32/validate.py | 81 ++++++++++++++++++ .../query33/ground_truth.csv | 1 + query_bank_fresh_direct/query33/query.json | 1 + query_bank_fresh_direct/query33/validate.py | 81 ++++++++++++++++++ .../query34/ground_truth.csv | 1 + query_bank_fresh_direct/query34/query.json | 1 + query_bank_fresh_direct/query34/validate.py | 81 ++++++++++++++++++ .../query35/ground_truth.csv | 1 + query_bank_fresh_direct/query35/query.json | 1 + query_bank_fresh_direct/query35/validate.py | 81 ++++++++++++++++++ .../query36/ground_truth.csv | 1 + query_bank_fresh_direct/query36/query.json | 1 + query_bank_fresh_direct/query36/validate.py | 81 ++++++++++++++++++ .../query37/ground_truth.csv | 1 + query_bank_fresh_direct/query37/query.json | 1 + query_bank_fresh_direct/query37/validate.py | 81 ++++++++++++++++++ .../query38/ground_truth.csv | 1 + query_bank_fresh_direct/query38/query.json | 1 + query_bank_fresh_direct/query38/validate.py | 81 ++++++++++++++++++ .../query39/ground_truth.csv | 1 + query_bank_fresh_direct/query39/query.json | 1 + query_bank_fresh_direct/query39/validate.py | 81 ++++++++++++++++++ .../query4/ground_truth.csv | 1 + query_bank_fresh_direct/query4/query.json | 1 + query_bank_fresh_direct/query4/validate.py | 81 ++++++++++++++++++ .../query40/ground_truth.csv | 1 + query_bank_fresh_direct/query40/query.json | 1 + query_bank_fresh_direct/query40/validate.py | 81 ++++++++++++++++++ .../query41/ground_truth.csv | 1 + query_bank_fresh_direct/query41/query.json | 1 + query_bank_fresh_direct/query41/validate.py | 81 ++++++++++++++++++ .../query42/ground_truth.csv | 1 + query_bank_fresh_direct/query42/query.json | 1 + query_bank_fresh_direct/query42/validate.py | 81 ++++++++++++++++++ .../query43/ground_truth.csv | 1 + query_bank_fresh_direct/query43/query.json | 1 + query_bank_fresh_direct/query43/validate.py | 81 ++++++++++++++++++ .../query44/ground_truth.csv | 1 + query_bank_fresh_direct/query44/query.json | 1 + query_bank_fresh_direct/query44/validate.py | 81 ++++++++++++++++++ .../query45/ground_truth.csv | 1 + query_bank_fresh_direct/query45/query.json | 1 + query_bank_fresh_direct/query45/validate.py | 81 ++++++++++++++++++ .../query46/ground_truth.csv | 1 + query_bank_fresh_direct/query46/query.json | 1 + query_bank_fresh_direct/query46/validate.py | 81 ++++++++++++++++++ .../query47/ground_truth.csv | 1 + query_bank_fresh_direct/query47/query.json | 1 + query_bank_fresh_direct/query47/validate.py | 81 ++++++++++++++++++ .../query48/ground_truth.csv | 1 + query_bank_fresh_direct/query48/query.json | 1 + query_bank_fresh_direct/query48/validate.py | 81 ++++++++++++++++++ .../query5/ground_truth.csv | 1 + query_bank_fresh_direct/query5/query.json | 1 + query_bank_fresh_direct/query5/validate.py | 81 ++++++++++++++++++ .../query6/ground_truth.csv | 1 + query_bank_fresh_direct/query6/query.json | 1 + query_bank_fresh_direct/query6/validate.py | 81 ++++++++++++++++++ .../query7/ground_truth.csv | 1 + query_bank_fresh_direct/query7/query.json | 1 + query_bank_fresh_direct/query7/validate.py | 81 ++++++++++++++++++ .../query8/ground_truth.csv | 1 + query_bank_fresh_direct/query8/query.json | 1 + query_bank_fresh_direct/query8/validate.py | 81 ++++++++++++++++++ .../query9/ground_truth.csv | 1 + query_bank_fresh_direct/query9/query.json | 1 + query_bank_fresh_direct/query9/validate.py | 81 ++++++++++++++++++ .../bank_crm_dump/bank_crm/customers.bson | 3 + .../bank_crm/customers.metadata.json | 1 + .../bank_crm_dump/bank_crm/offers.bson | 3 + .../bank_crm/offers.metadata.json | 1 + .../bank_crm/service_requests.bson | 3 + .../bank_crm/service_requests.metadata.json | 1 + .../query_dataset/cards.db | 3 + query_bank_fresh_direct/query_dataset/cbs.sql | 3 + .../query_dataset/insurance.duckdb | Bin 0 -> 798720 bytes .../query_dataset/lending.duckdb | Bin 0 -> 798720 bytes .../query_dataset/payments.db | 3 + query_bank_fresh_live/db_config.yaml | 5 ++ query_bank_fresh_live/db_description.txt | 38 ++++++++ .../db_description_withhint.txt | 0 query_bank_fresh_live/query1/ground_truth.csv | 1 + query_bank_fresh_live/query1/query.json | 1 + query_bank_fresh_live/query1/validate.py | 81 ++++++++++++++++++ .../query10/ground_truth.csv | 1 + query_bank_fresh_live/query10/query.json | 1 + query_bank_fresh_live/query10/validate.py | 81 ++++++++++++++++++ .../query11/ground_truth.csv | 1 + query_bank_fresh_live/query11/query.json | 1 + query_bank_fresh_live/query11/validate.py | 81 ++++++++++++++++++ .../query12/ground_truth.csv | 1 + query_bank_fresh_live/query12/query.json | 1 + query_bank_fresh_live/query12/validate.py | 81 ++++++++++++++++++ .../query13/ground_truth.csv | 1 + query_bank_fresh_live/query13/query.json | 1 + query_bank_fresh_live/query13/validate.py | 81 ++++++++++++++++++ .../query14/ground_truth.csv | 1 + query_bank_fresh_live/query14/query.json | 1 + query_bank_fresh_live/query14/validate.py | 81 ++++++++++++++++++ .../query15/ground_truth.csv | 1 + query_bank_fresh_live/query15/query.json | 1 + query_bank_fresh_live/query15/validate.py | 81 ++++++++++++++++++ .../query16/ground_truth.csv | 1 + query_bank_fresh_live/query16/query.json | 1 + query_bank_fresh_live/query16/validate.py | 81 ++++++++++++++++++ .../query17/ground_truth.csv | 1 + query_bank_fresh_live/query17/query.json | 1 + query_bank_fresh_live/query17/validate.py | 81 ++++++++++++++++++ .../query18/ground_truth.csv | 1 + query_bank_fresh_live/query18/query.json | 1 + query_bank_fresh_live/query18/validate.py | 81 ++++++++++++++++++ .../query19/ground_truth.csv | 1 + query_bank_fresh_live/query19/query.json | 1 + query_bank_fresh_live/query19/validate.py | 81 ++++++++++++++++++ query_bank_fresh_live/query2/ground_truth.csv | 1 + query_bank_fresh_live/query2/query.json | 1 + query_bank_fresh_live/query2/validate.py | 81 ++++++++++++++++++ .../query20/ground_truth.csv | 1 + query_bank_fresh_live/query20/query.json | 1 + query_bank_fresh_live/query20/validate.py | 81 ++++++++++++++++++ .../query21/ground_truth.csv | 1 + query_bank_fresh_live/query21/query.json | 1 + query_bank_fresh_live/query21/validate.py | 81 ++++++++++++++++++ .../query22/ground_truth.csv | 1 + query_bank_fresh_live/query22/query.json | 1 + query_bank_fresh_live/query22/validate.py | 81 ++++++++++++++++++ .../query23/ground_truth.csv | 1 + query_bank_fresh_live/query23/query.json | 1 + query_bank_fresh_live/query23/validate.py | 81 ++++++++++++++++++ .../query24/ground_truth.csv | 1 + query_bank_fresh_live/query24/query.json | 1 + query_bank_fresh_live/query24/validate.py | 81 ++++++++++++++++++ .../query25/ground_truth.csv | 1 + query_bank_fresh_live/query25/query.json | 1 + query_bank_fresh_live/query25/validate.py | 81 ++++++++++++++++++ .../query26/ground_truth.csv | 1 + query_bank_fresh_live/query26/query.json | 1 + query_bank_fresh_live/query26/validate.py | 81 ++++++++++++++++++ .../query27/ground_truth.csv | 1 + query_bank_fresh_live/query27/query.json | 1 + query_bank_fresh_live/query27/validate.py | 81 ++++++++++++++++++ .../query28/ground_truth.csv | 1 + query_bank_fresh_live/query28/query.json | 1 + query_bank_fresh_live/query28/validate.py | 81 ++++++++++++++++++ .../query29/ground_truth.csv | 1 + query_bank_fresh_live/query29/query.json | 1 + query_bank_fresh_live/query29/validate.py | 81 ++++++++++++++++++ query_bank_fresh_live/query3/ground_truth.csv | 1 + query_bank_fresh_live/query3/query.json | 1 + query_bank_fresh_live/query3/validate.py | 81 ++++++++++++++++++ .../query30/ground_truth.csv | 1 + query_bank_fresh_live/query30/query.json | 1 + query_bank_fresh_live/query30/validate.py | 81 ++++++++++++++++++ .../query31/ground_truth.csv | 1 + query_bank_fresh_live/query31/query.json | 1 + query_bank_fresh_live/query31/validate.py | 81 ++++++++++++++++++ .../query32/ground_truth.csv | 1 + query_bank_fresh_live/query32/query.json | 1 + query_bank_fresh_live/query32/validate.py | 81 ++++++++++++++++++ .../query33/ground_truth.csv | 1 + query_bank_fresh_live/query33/query.json | 1 + query_bank_fresh_live/query33/validate.py | 81 ++++++++++++++++++ .../query34/ground_truth.csv | 1 + query_bank_fresh_live/query34/query.json | 1 + query_bank_fresh_live/query34/validate.py | 81 ++++++++++++++++++ .../query35/ground_truth.csv | 1 + query_bank_fresh_live/query35/query.json | 1 + query_bank_fresh_live/query35/validate.py | 81 ++++++++++++++++++ .../query36/ground_truth.csv | 1 + query_bank_fresh_live/query36/query.json | 1 + query_bank_fresh_live/query36/validate.py | 81 ++++++++++++++++++ .../query37/ground_truth.csv | 1 + query_bank_fresh_live/query37/query.json | 1 + query_bank_fresh_live/query37/validate.py | 81 ++++++++++++++++++ .../query38/ground_truth.csv | 1 + query_bank_fresh_live/query38/query.json | 1 + query_bank_fresh_live/query38/validate.py | 81 ++++++++++++++++++ .../query39/ground_truth.csv | 1 + query_bank_fresh_live/query39/query.json | 1 + query_bank_fresh_live/query39/validate.py | 81 ++++++++++++++++++ query_bank_fresh_live/query4/ground_truth.csv | 1 + query_bank_fresh_live/query4/query.json | 1 + query_bank_fresh_live/query4/validate.py | 81 ++++++++++++++++++ .../query40/ground_truth.csv | 1 + query_bank_fresh_live/query40/query.json | 1 + query_bank_fresh_live/query40/validate.py | 81 ++++++++++++++++++ .../query41/ground_truth.csv | 1 + query_bank_fresh_live/query41/query.json | 1 + query_bank_fresh_live/query41/validate.py | 81 ++++++++++++++++++ .../query42/ground_truth.csv | 1 + query_bank_fresh_live/query42/query.json | 1 + query_bank_fresh_live/query42/validate.py | 81 ++++++++++++++++++ .../query43/ground_truth.csv | 1 + query_bank_fresh_live/query43/query.json | 1 + query_bank_fresh_live/query43/validate.py | 81 ++++++++++++++++++ .../query44/ground_truth.csv | 1 + query_bank_fresh_live/query44/query.json | 1 + query_bank_fresh_live/query44/validate.py | 81 ++++++++++++++++++ .../query45/ground_truth.csv | 1 + query_bank_fresh_live/query45/query.json | 1 + query_bank_fresh_live/query45/validate.py | 81 ++++++++++++++++++ .../query46/ground_truth.csv | 1 + query_bank_fresh_live/query46/query.json | 1 + query_bank_fresh_live/query46/validate.py | 81 ++++++++++++++++++ .../query47/ground_truth.csv | 1 + query_bank_fresh_live/query47/query.json | 1 + query_bank_fresh_live/query47/validate.py | 81 ++++++++++++++++++ .../query48/ground_truth.csv | 1 + query_bank_fresh_live/query48/query.json | 1 + query_bank_fresh_live/query48/validate.py | 81 ++++++++++++++++++ query_bank_fresh_live/query5/ground_truth.csv | 1 + query_bank_fresh_live/query5/query.json | 1 + query_bank_fresh_live/query5/validate.py | 81 ++++++++++++++++++ query_bank_fresh_live/query6/ground_truth.csv | 1 + query_bank_fresh_live/query6/query.json | 1 + query_bank_fresh_live/query6/validate.py | 81 ++++++++++++++++++ query_bank_fresh_live/query7/ground_truth.csv | 1 + query_bank_fresh_live/query7/query.json | 1 + query_bank_fresh_live/query7/validate.py | 81 ++++++++++++++++++ query_bank_fresh_live/query8/ground_truth.csv | 1 + query_bank_fresh_live/query8/query.json | 1 + query_bank_fresh_live/query8/validate.py | 81 ++++++++++++++++++ query_bank_fresh_live/query9/ground_truth.csv | 1 + query_bank_fresh_live/query9/query.json | 1 + query_bank_fresh_live/query9/validate.py | 81 ++++++++++++++++++ .../bank_live_dump/bank_live/customer.bson | 3 + .../bank_live/customer.metadata.json | 1 + query_bank_fresh_warehouse/db_config.yaml | 5 ++ query_bank_fresh_warehouse/db_description.txt | 39 +++++++++ .../db_description_withhint.txt | 0 .../query1/ground_truth.csv | 1 + query_bank_fresh_warehouse/query1/query.json | 1 + query_bank_fresh_warehouse/query1/validate.py | 81 ++++++++++++++++++ .../query10/ground_truth.csv | 1 + query_bank_fresh_warehouse/query10/query.json | 1 + .../query10/validate.py | 81 ++++++++++++++++++ .../query11/ground_truth.csv | 1 + query_bank_fresh_warehouse/query11/query.json | 1 + .../query11/validate.py | 81 ++++++++++++++++++ .../query12/ground_truth.csv | 1 + query_bank_fresh_warehouse/query12/query.json | 1 + .../query12/validate.py | 81 ++++++++++++++++++ .../query13/ground_truth.csv | 1 + query_bank_fresh_warehouse/query13/query.json | 1 + .../query13/validate.py | 81 ++++++++++++++++++ .../query14/ground_truth.csv | 1 + query_bank_fresh_warehouse/query14/query.json | 1 + .../query14/validate.py | 81 ++++++++++++++++++ .../query15/ground_truth.csv | 1 + query_bank_fresh_warehouse/query15/query.json | 1 + .../query15/validate.py | 81 ++++++++++++++++++ .../query16/ground_truth.csv | 1 + query_bank_fresh_warehouse/query16/query.json | 1 + .../query16/validate.py | 81 ++++++++++++++++++ .../query17/ground_truth.csv | 1 + query_bank_fresh_warehouse/query17/query.json | 1 + .../query17/validate.py | 81 ++++++++++++++++++ .../query18/ground_truth.csv | 1 + query_bank_fresh_warehouse/query18/query.json | 1 + .../query18/validate.py | 81 ++++++++++++++++++ .../query19/ground_truth.csv | 1 + query_bank_fresh_warehouse/query19/query.json | 1 + .../query19/validate.py | 81 ++++++++++++++++++ .../query2/ground_truth.csv | 1 + query_bank_fresh_warehouse/query2/query.json | 1 + query_bank_fresh_warehouse/query2/validate.py | 81 ++++++++++++++++++ .../query20/ground_truth.csv | 1 + query_bank_fresh_warehouse/query20/query.json | 1 + .../query20/validate.py | 81 ++++++++++++++++++ .../query21/ground_truth.csv | 1 + query_bank_fresh_warehouse/query21/query.json | 1 + .../query21/validate.py | 81 ++++++++++++++++++ .../query22/ground_truth.csv | 1 + query_bank_fresh_warehouse/query22/query.json | 1 + .../query22/validate.py | 81 ++++++++++++++++++ .../query23/ground_truth.csv | 1 + query_bank_fresh_warehouse/query23/query.json | 1 + .../query23/validate.py | 81 ++++++++++++++++++ .../query24/ground_truth.csv | 1 + query_bank_fresh_warehouse/query24/query.json | 1 + .../query24/validate.py | 81 ++++++++++++++++++ .../query25/ground_truth.csv | 1 + query_bank_fresh_warehouse/query25/query.json | 1 + .../query25/validate.py | 81 ++++++++++++++++++ .../query26/ground_truth.csv | 1 + query_bank_fresh_warehouse/query26/query.json | 1 + .../query26/validate.py | 81 ++++++++++++++++++ .../query27/ground_truth.csv | 1 + query_bank_fresh_warehouse/query27/query.json | 1 + .../query27/validate.py | 81 ++++++++++++++++++ .../query28/ground_truth.csv | 1 + query_bank_fresh_warehouse/query28/query.json | 1 + .../query28/validate.py | 81 ++++++++++++++++++ .../query29/ground_truth.csv | 1 + query_bank_fresh_warehouse/query29/query.json | 1 + .../query29/validate.py | 81 ++++++++++++++++++ .../query3/ground_truth.csv | 1 + query_bank_fresh_warehouse/query3/query.json | 1 + query_bank_fresh_warehouse/query3/validate.py | 81 ++++++++++++++++++ .../query30/ground_truth.csv | 1 + query_bank_fresh_warehouse/query30/query.json | 1 + .../query30/validate.py | 81 ++++++++++++++++++ .../query31/ground_truth.csv | 1 + query_bank_fresh_warehouse/query31/query.json | 1 + .../query31/validate.py | 81 ++++++++++++++++++ .../query32/ground_truth.csv | 1 + query_bank_fresh_warehouse/query32/query.json | 1 + .../query32/validate.py | 81 ++++++++++++++++++ .../query33/ground_truth.csv | 1 + query_bank_fresh_warehouse/query33/query.json | 1 + .../query33/validate.py | 81 ++++++++++++++++++ .../query34/ground_truth.csv | 1 + query_bank_fresh_warehouse/query34/query.json | 1 + .../query34/validate.py | 81 ++++++++++++++++++ .../query35/ground_truth.csv | 1 + query_bank_fresh_warehouse/query35/query.json | 1 + .../query35/validate.py | 81 ++++++++++++++++++ .../query36/ground_truth.csv | 1 + query_bank_fresh_warehouse/query36/query.json | 1 + .../query36/validate.py | 81 ++++++++++++++++++ .../query37/ground_truth.csv | 1 + query_bank_fresh_warehouse/query37/query.json | 1 + .../query37/validate.py | 81 ++++++++++++++++++ .../query38/ground_truth.csv | 1 + query_bank_fresh_warehouse/query38/query.json | 1 + .../query38/validate.py | 81 ++++++++++++++++++ .../query39/ground_truth.csv | 1 + query_bank_fresh_warehouse/query39/query.json | 1 + .../query39/validate.py | 81 ++++++++++++++++++ .../query4/ground_truth.csv | 1 + query_bank_fresh_warehouse/query4/query.json | 1 + query_bank_fresh_warehouse/query4/validate.py | 81 ++++++++++++++++++ .../query40/ground_truth.csv | 1 + query_bank_fresh_warehouse/query40/query.json | 1 + .../query40/validate.py | 81 ++++++++++++++++++ .../query41/ground_truth.csv | 1 + query_bank_fresh_warehouse/query41/query.json | 1 + .../query41/validate.py | 81 ++++++++++++++++++ .../query42/ground_truth.csv | 1 + query_bank_fresh_warehouse/query42/query.json | 1 + .../query42/validate.py | 81 ++++++++++++++++++ .../query43/ground_truth.csv | 1 + query_bank_fresh_warehouse/query43/query.json | 1 + .../query43/validate.py | 81 ++++++++++++++++++ .../query44/ground_truth.csv | 1 + query_bank_fresh_warehouse/query44/query.json | 1 + .../query44/validate.py | 81 ++++++++++++++++++ .../query45/ground_truth.csv | 1 + query_bank_fresh_warehouse/query45/query.json | 1 + .../query45/validate.py | 81 ++++++++++++++++++ .../query46/ground_truth.csv | 1 + query_bank_fresh_warehouse/query46/query.json | 1 + .../query46/validate.py | 81 ++++++++++++++++++ .../query47/ground_truth.csv | 1 + query_bank_fresh_warehouse/query47/query.json | 1 + .../query47/validate.py | 81 ++++++++++++++++++ .../query48/ground_truth.csv | 1 + query_bank_fresh_warehouse/query48/query.json | 1 + .../query48/validate.py | 81 ++++++++++++++++++ .../query5/ground_truth.csv | 1 + query_bank_fresh_warehouse/query5/query.json | 1 + query_bank_fresh_warehouse/query5/validate.py | 81 ++++++++++++++++++ .../query6/ground_truth.csv | 1 + query_bank_fresh_warehouse/query6/query.json | 1 + query_bank_fresh_warehouse/query6/validate.py | 81 ++++++++++++++++++ .../query7/ground_truth.csv | 1 + query_bank_fresh_warehouse/query7/query.json | 1 + query_bank_fresh_warehouse/query7/validate.py | 81 ++++++++++++++++++ .../query8/ground_truth.csv | 1 + query_bank_fresh_warehouse/query8/query.json | 1 + query_bank_fresh_warehouse/query8/validate.py | 81 ++++++++++++++++++ .../query9/ground_truth.csv | 1 + query_bank_fresh_warehouse/query9/query.json | 1 + query_bank_fresh_warehouse/query9/validate.py | 81 ++++++++++++++++++ .../bank_warehouse/_meta.bson | 3 + .../bank_warehouse/_meta.metadata.json | 1 + .../bank_warehouse/customer.bson | 3 + .../bank_warehouse/customer.metadata.json | 1 + 458 files changed, 12148 insertions(+) create mode 100644 query_bank_fresh_direct/db_config.yaml create mode 100644 query_bank_fresh_direct/db_description.txt create mode 100644 query_bank_fresh_direct/db_description_withhint.txt create mode 100644 query_bank_fresh_direct/query1/ground_truth.csv create mode 100644 query_bank_fresh_direct/query1/query.json create mode 100644 query_bank_fresh_direct/query1/validate.py create mode 100644 query_bank_fresh_direct/query10/ground_truth.csv create mode 100644 query_bank_fresh_direct/query10/query.json create mode 100644 query_bank_fresh_direct/query10/validate.py create mode 100644 query_bank_fresh_direct/query11/ground_truth.csv create mode 100644 query_bank_fresh_direct/query11/query.json create mode 100644 query_bank_fresh_direct/query11/validate.py create mode 100644 query_bank_fresh_direct/query12/ground_truth.csv create mode 100644 query_bank_fresh_direct/query12/query.json create mode 100644 query_bank_fresh_direct/query12/validate.py create mode 100644 query_bank_fresh_direct/query13/ground_truth.csv create mode 100644 query_bank_fresh_direct/query13/query.json create mode 100644 query_bank_fresh_direct/query13/validate.py create mode 100644 query_bank_fresh_direct/query14/ground_truth.csv create mode 100644 query_bank_fresh_direct/query14/query.json create mode 100644 query_bank_fresh_direct/query14/validate.py create mode 100644 query_bank_fresh_direct/query15/ground_truth.csv create mode 100644 query_bank_fresh_direct/query15/query.json create mode 100644 query_bank_fresh_direct/query15/validate.py create mode 100644 query_bank_fresh_direct/query16/ground_truth.csv create mode 100644 query_bank_fresh_direct/query16/query.json create mode 100644 query_bank_fresh_direct/query16/validate.py create mode 100644 query_bank_fresh_direct/query17/ground_truth.csv create mode 100644 query_bank_fresh_direct/query17/query.json create mode 100644 query_bank_fresh_direct/query17/validate.py create mode 100644 query_bank_fresh_direct/query18/ground_truth.csv create mode 100644 query_bank_fresh_direct/query18/query.json create mode 100644 query_bank_fresh_direct/query18/validate.py create mode 100644 query_bank_fresh_direct/query19/ground_truth.csv create mode 100644 query_bank_fresh_direct/query19/query.json create mode 100644 query_bank_fresh_direct/query19/validate.py create mode 100644 query_bank_fresh_direct/query2/ground_truth.csv create mode 100644 query_bank_fresh_direct/query2/query.json create mode 100644 query_bank_fresh_direct/query2/validate.py create mode 100644 query_bank_fresh_direct/query20/ground_truth.csv create mode 100644 query_bank_fresh_direct/query20/query.json create mode 100644 query_bank_fresh_direct/query20/validate.py create mode 100644 query_bank_fresh_direct/query21/ground_truth.csv create mode 100644 query_bank_fresh_direct/query21/query.json create mode 100644 query_bank_fresh_direct/query21/validate.py create mode 100644 query_bank_fresh_direct/query22/ground_truth.csv create mode 100644 query_bank_fresh_direct/query22/query.json create mode 100644 query_bank_fresh_direct/query22/validate.py create mode 100644 query_bank_fresh_direct/query23/ground_truth.csv create mode 100644 query_bank_fresh_direct/query23/query.json create mode 100644 query_bank_fresh_direct/query23/validate.py create mode 100644 query_bank_fresh_direct/query24/ground_truth.csv create mode 100644 query_bank_fresh_direct/query24/query.json create mode 100644 query_bank_fresh_direct/query24/validate.py create mode 100644 query_bank_fresh_direct/query25/ground_truth.csv create mode 100644 query_bank_fresh_direct/query25/query.json create mode 100644 query_bank_fresh_direct/query25/validate.py create mode 100644 query_bank_fresh_direct/query26/ground_truth.csv create mode 100644 query_bank_fresh_direct/query26/query.json create mode 100644 query_bank_fresh_direct/query26/validate.py create mode 100644 query_bank_fresh_direct/query27/ground_truth.csv create mode 100644 query_bank_fresh_direct/query27/query.json create mode 100644 query_bank_fresh_direct/query27/validate.py create mode 100644 query_bank_fresh_direct/query28/ground_truth.csv create mode 100644 query_bank_fresh_direct/query28/query.json create mode 100644 query_bank_fresh_direct/query28/validate.py create mode 100644 query_bank_fresh_direct/query29/ground_truth.csv create mode 100644 query_bank_fresh_direct/query29/query.json create mode 100644 query_bank_fresh_direct/query29/validate.py create mode 100644 query_bank_fresh_direct/query3/ground_truth.csv create mode 100644 query_bank_fresh_direct/query3/query.json create mode 100644 query_bank_fresh_direct/query3/validate.py create mode 100644 query_bank_fresh_direct/query30/ground_truth.csv create mode 100644 query_bank_fresh_direct/query30/query.json create mode 100644 query_bank_fresh_direct/query30/validate.py create mode 100644 query_bank_fresh_direct/query31/ground_truth.csv create mode 100644 query_bank_fresh_direct/query31/query.json create mode 100644 query_bank_fresh_direct/query31/validate.py create mode 100644 query_bank_fresh_direct/query32/ground_truth.csv create mode 100644 query_bank_fresh_direct/query32/query.json create mode 100644 query_bank_fresh_direct/query32/validate.py create mode 100644 query_bank_fresh_direct/query33/ground_truth.csv create mode 100644 query_bank_fresh_direct/query33/query.json create mode 100644 query_bank_fresh_direct/query33/validate.py create mode 100644 query_bank_fresh_direct/query34/ground_truth.csv create mode 100644 query_bank_fresh_direct/query34/query.json create mode 100644 query_bank_fresh_direct/query34/validate.py create mode 100644 query_bank_fresh_direct/query35/ground_truth.csv create mode 100644 query_bank_fresh_direct/query35/query.json create mode 100644 query_bank_fresh_direct/query35/validate.py create mode 100644 query_bank_fresh_direct/query36/ground_truth.csv create mode 100644 query_bank_fresh_direct/query36/query.json create mode 100644 query_bank_fresh_direct/query36/validate.py create mode 100644 query_bank_fresh_direct/query37/ground_truth.csv create mode 100644 query_bank_fresh_direct/query37/query.json create mode 100644 query_bank_fresh_direct/query37/validate.py create mode 100644 query_bank_fresh_direct/query38/ground_truth.csv create mode 100644 query_bank_fresh_direct/query38/query.json create mode 100644 query_bank_fresh_direct/query38/validate.py create mode 100644 query_bank_fresh_direct/query39/ground_truth.csv create mode 100644 query_bank_fresh_direct/query39/query.json create mode 100644 query_bank_fresh_direct/query39/validate.py create mode 100644 query_bank_fresh_direct/query4/ground_truth.csv create mode 100644 query_bank_fresh_direct/query4/query.json create mode 100644 query_bank_fresh_direct/query4/validate.py create mode 100644 query_bank_fresh_direct/query40/ground_truth.csv create mode 100644 query_bank_fresh_direct/query40/query.json create mode 100644 query_bank_fresh_direct/query40/validate.py create mode 100644 query_bank_fresh_direct/query41/ground_truth.csv create mode 100644 query_bank_fresh_direct/query41/query.json create mode 100644 query_bank_fresh_direct/query41/validate.py create mode 100644 query_bank_fresh_direct/query42/ground_truth.csv create mode 100644 query_bank_fresh_direct/query42/query.json create mode 100644 query_bank_fresh_direct/query42/validate.py create mode 100644 query_bank_fresh_direct/query43/ground_truth.csv create mode 100644 query_bank_fresh_direct/query43/query.json create mode 100644 query_bank_fresh_direct/query43/validate.py create mode 100644 query_bank_fresh_direct/query44/ground_truth.csv create mode 100644 query_bank_fresh_direct/query44/query.json create mode 100644 query_bank_fresh_direct/query44/validate.py create mode 100644 query_bank_fresh_direct/query45/ground_truth.csv create mode 100644 query_bank_fresh_direct/query45/query.json create mode 100644 query_bank_fresh_direct/query45/validate.py create mode 100644 query_bank_fresh_direct/query46/ground_truth.csv create mode 100644 query_bank_fresh_direct/query46/query.json create mode 100644 query_bank_fresh_direct/query46/validate.py create mode 100644 query_bank_fresh_direct/query47/ground_truth.csv create mode 100644 query_bank_fresh_direct/query47/query.json create mode 100644 query_bank_fresh_direct/query47/validate.py create mode 100644 query_bank_fresh_direct/query48/ground_truth.csv create mode 100644 query_bank_fresh_direct/query48/query.json create mode 100644 query_bank_fresh_direct/query48/validate.py create mode 100644 query_bank_fresh_direct/query5/ground_truth.csv create mode 100644 query_bank_fresh_direct/query5/query.json create mode 100644 query_bank_fresh_direct/query5/validate.py create mode 100644 query_bank_fresh_direct/query6/ground_truth.csv create mode 100644 query_bank_fresh_direct/query6/query.json create mode 100644 query_bank_fresh_direct/query6/validate.py create mode 100644 query_bank_fresh_direct/query7/ground_truth.csv create mode 100644 query_bank_fresh_direct/query7/query.json create mode 100644 query_bank_fresh_direct/query7/validate.py create mode 100644 query_bank_fresh_direct/query8/ground_truth.csv create mode 100644 query_bank_fresh_direct/query8/query.json create mode 100644 query_bank_fresh_direct/query8/validate.py create mode 100644 query_bank_fresh_direct/query9/ground_truth.csv create mode 100644 query_bank_fresh_direct/query9/query.json create mode 100644 query_bank_fresh_direct/query9/validate.py create mode 100644 query_bank_fresh_direct/query_dataset/bank_crm_dump/bank_crm/customers.bson create mode 100644 query_bank_fresh_direct/query_dataset/bank_crm_dump/bank_crm/customers.metadata.json create mode 100644 query_bank_fresh_direct/query_dataset/bank_crm_dump/bank_crm/offers.bson create mode 100644 query_bank_fresh_direct/query_dataset/bank_crm_dump/bank_crm/offers.metadata.json create mode 100644 query_bank_fresh_direct/query_dataset/bank_crm_dump/bank_crm/service_requests.bson create mode 100644 query_bank_fresh_direct/query_dataset/bank_crm_dump/bank_crm/service_requests.metadata.json create mode 100644 query_bank_fresh_direct/query_dataset/cards.db create mode 100644 query_bank_fresh_direct/query_dataset/cbs.sql create mode 100644 query_bank_fresh_direct/query_dataset/insurance.duckdb create mode 100644 query_bank_fresh_direct/query_dataset/lending.duckdb create mode 100644 query_bank_fresh_direct/query_dataset/payments.db create mode 100644 query_bank_fresh_live/db_config.yaml create mode 100644 query_bank_fresh_live/db_description.txt create mode 100644 query_bank_fresh_live/db_description_withhint.txt create mode 100644 query_bank_fresh_live/query1/ground_truth.csv create mode 100644 query_bank_fresh_live/query1/query.json create mode 100644 query_bank_fresh_live/query1/validate.py create mode 100644 query_bank_fresh_live/query10/ground_truth.csv create mode 100644 query_bank_fresh_live/query10/query.json create mode 100644 query_bank_fresh_live/query10/validate.py create mode 100644 query_bank_fresh_live/query11/ground_truth.csv create mode 100644 query_bank_fresh_live/query11/query.json create mode 100644 query_bank_fresh_live/query11/validate.py create mode 100644 query_bank_fresh_live/query12/ground_truth.csv create mode 100644 query_bank_fresh_live/query12/query.json create mode 100644 query_bank_fresh_live/query12/validate.py create mode 100644 query_bank_fresh_live/query13/ground_truth.csv create mode 100644 query_bank_fresh_live/query13/query.json create mode 100644 query_bank_fresh_live/query13/validate.py create mode 100644 query_bank_fresh_live/query14/ground_truth.csv create mode 100644 query_bank_fresh_live/query14/query.json create mode 100644 query_bank_fresh_live/query14/validate.py create mode 100644 query_bank_fresh_live/query15/ground_truth.csv create mode 100644 query_bank_fresh_live/query15/query.json create mode 100644 query_bank_fresh_live/query15/validate.py create mode 100644 query_bank_fresh_live/query16/ground_truth.csv create mode 100644 query_bank_fresh_live/query16/query.json create mode 100644 query_bank_fresh_live/query16/validate.py create mode 100644 query_bank_fresh_live/query17/ground_truth.csv create mode 100644 query_bank_fresh_live/query17/query.json create mode 100644 query_bank_fresh_live/query17/validate.py create mode 100644 query_bank_fresh_live/query18/ground_truth.csv create mode 100644 query_bank_fresh_live/query18/query.json create mode 100644 query_bank_fresh_live/query18/validate.py create mode 100644 query_bank_fresh_live/query19/ground_truth.csv create mode 100644 query_bank_fresh_live/query19/query.json create mode 100644 query_bank_fresh_live/query19/validate.py create mode 100644 query_bank_fresh_live/query2/ground_truth.csv create mode 100644 query_bank_fresh_live/query2/query.json create mode 100644 query_bank_fresh_live/query2/validate.py create mode 100644 query_bank_fresh_live/query20/ground_truth.csv create mode 100644 query_bank_fresh_live/query20/query.json create mode 100644 query_bank_fresh_live/query20/validate.py create mode 100644 query_bank_fresh_live/query21/ground_truth.csv create mode 100644 query_bank_fresh_live/query21/query.json create mode 100644 query_bank_fresh_live/query21/validate.py create mode 100644 query_bank_fresh_live/query22/ground_truth.csv create mode 100644 query_bank_fresh_live/query22/query.json create mode 100644 query_bank_fresh_live/query22/validate.py create mode 100644 query_bank_fresh_live/query23/ground_truth.csv create mode 100644 query_bank_fresh_live/query23/query.json create mode 100644 query_bank_fresh_live/query23/validate.py create mode 100644 query_bank_fresh_live/query24/ground_truth.csv create mode 100644 query_bank_fresh_live/query24/query.json create mode 100644 query_bank_fresh_live/query24/validate.py create mode 100644 query_bank_fresh_live/query25/ground_truth.csv create mode 100644 query_bank_fresh_live/query25/query.json create mode 100644 query_bank_fresh_live/query25/validate.py create mode 100644 query_bank_fresh_live/query26/ground_truth.csv create mode 100644 query_bank_fresh_live/query26/query.json create mode 100644 query_bank_fresh_live/query26/validate.py create mode 100644 query_bank_fresh_live/query27/ground_truth.csv create mode 100644 query_bank_fresh_live/query27/query.json create mode 100644 query_bank_fresh_live/query27/validate.py create mode 100644 query_bank_fresh_live/query28/ground_truth.csv create mode 100644 query_bank_fresh_live/query28/query.json create mode 100644 query_bank_fresh_live/query28/validate.py create mode 100644 query_bank_fresh_live/query29/ground_truth.csv create mode 100644 query_bank_fresh_live/query29/query.json create mode 100644 query_bank_fresh_live/query29/validate.py create mode 100644 query_bank_fresh_live/query3/ground_truth.csv create mode 100644 query_bank_fresh_live/query3/query.json create mode 100644 query_bank_fresh_live/query3/validate.py create mode 100644 query_bank_fresh_live/query30/ground_truth.csv create mode 100644 query_bank_fresh_live/query30/query.json create mode 100644 query_bank_fresh_live/query30/validate.py create mode 100644 query_bank_fresh_live/query31/ground_truth.csv create mode 100644 query_bank_fresh_live/query31/query.json create mode 100644 query_bank_fresh_live/query31/validate.py create mode 100644 query_bank_fresh_live/query32/ground_truth.csv create mode 100644 query_bank_fresh_live/query32/query.json create mode 100644 query_bank_fresh_live/query32/validate.py create mode 100644 query_bank_fresh_live/query33/ground_truth.csv create mode 100644 query_bank_fresh_live/query33/query.json create mode 100644 query_bank_fresh_live/query33/validate.py create mode 100644 query_bank_fresh_live/query34/ground_truth.csv create mode 100644 query_bank_fresh_live/query34/query.json create mode 100644 query_bank_fresh_live/query34/validate.py create mode 100644 query_bank_fresh_live/query35/ground_truth.csv create mode 100644 query_bank_fresh_live/query35/query.json create mode 100644 query_bank_fresh_live/query35/validate.py create mode 100644 query_bank_fresh_live/query36/ground_truth.csv create mode 100644 query_bank_fresh_live/query36/query.json create mode 100644 query_bank_fresh_live/query36/validate.py create mode 100644 query_bank_fresh_live/query37/ground_truth.csv create mode 100644 query_bank_fresh_live/query37/query.json create mode 100644 query_bank_fresh_live/query37/validate.py create mode 100644 query_bank_fresh_live/query38/ground_truth.csv create mode 100644 query_bank_fresh_live/query38/query.json create mode 100644 query_bank_fresh_live/query38/validate.py create mode 100644 query_bank_fresh_live/query39/ground_truth.csv create mode 100644 query_bank_fresh_live/query39/query.json create mode 100644 query_bank_fresh_live/query39/validate.py create mode 100644 query_bank_fresh_live/query4/ground_truth.csv create mode 100644 query_bank_fresh_live/query4/query.json create mode 100644 query_bank_fresh_live/query4/validate.py create mode 100644 query_bank_fresh_live/query40/ground_truth.csv create mode 100644 query_bank_fresh_live/query40/query.json create mode 100644 query_bank_fresh_live/query40/validate.py create mode 100644 query_bank_fresh_live/query41/ground_truth.csv create mode 100644 query_bank_fresh_live/query41/query.json create mode 100644 query_bank_fresh_live/query41/validate.py create mode 100644 query_bank_fresh_live/query42/ground_truth.csv create mode 100644 query_bank_fresh_live/query42/query.json create mode 100644 query_bank_fresh_live/query42/validate.py create mode 100644 query_bank_fresh_live/query43/ground_truth.csv create mode 100644 query_bank_fresh_live/query43/query.json create mode 100644 query_bank_fresh_live/query43/validate.py create mode 100644 query_bank_fresh_live/query44/ground_truth.csv create mode 100644 query_bank_fresh_live/query44/query.json create mode 100644 query_bank_fresh_live/query44/validate.py create mode 100644 query_bank_fresh_live/query45/ground_truth.csv create mode 100644 query_bank_fresh_live/query45/query.json create mode 100644 query_bank_fresh_live/query45/validate.py create mode 100644 query_bank_fresh_live/query46/ground_truth.csv create mode 100644 query_bank_fresh_live/query46/query.json create mode 100644 query_bank_fresh_live/query46/validate.py create mode 100644 query_bank_fresh_live/query47/ground_truth.csv create mode 100644 query_bank_fresh_live/query47/query.json create mode 100644 query_bank_fresh_live/query47/validate.py create mode 100644 query_bank_fresh_live/query48/ground_truth.csv create mode 100644 query_bank_fresh_live/query48/query.json create mode 100644 query_bank_fresh_live/query48/validate.py create mode 100644 query_bank_fresh_live/query5/ground_truth.csv create mode 100644 query_bank_fresh_live/query5/query.json create mode 100644 query_bank_fresh_live/query5/validate.py create mode 100644 query_bank_fresh_live/query6/ground_truth.csv create mode 100644 query_bank_fresh_live/query6/query.json create mode 100644 query_bank_fresh_live/query6/validate.py create mode 100644 query_bank_fresh_live/query7/ground_truth.csv create mode 100644 query_bank_fresh_live/query7/query.json create mode 100644 query_bank_fresh_live/query7/validate.py create mode 100644 query_bank_fresh_live/query8/ground_truth.csv create mode 100644 query_bank_fresh_live/query8/query.json create mode 100644 query_bank_fresh_live/query8/validate.py create mode 100644 query_bank_fresh_live/query9/ground_truth.csv create mode 100644 query_bank_fresh_live/query9/query.json create mode 100644 query_bank_fresh_live/query9/validate.py create mode 100644 query_bank_fresh_live/query_dataset/bank_live_dump/bank_live/customer.bson create mode 100644 query_bank_fresh_live/query_dataset/bank_live_dump/bank_live/customer.metadata.json create mode 100644 query_bank_fresh_warehouse/db_config.yaml create mode 100644 query_bank_fresh_warehouse/db_description.txt create mode 100644 query_bank_fresh_warehouse/db_description_withhint.txt create mode 100644 query_bank_fresh_warehouse/query1/ground_truth.csv create mode 100644 query_bank_fresh_warehouse/query1/query.json create mode 100644 query_bank_fresh_warehouse/query1/validate.py create mode 100644 query_bank_fresh_warehouse/query10/ground_truth.csv create mode 100644 query_bank_fresh_warehouse/query10/query.json create mode 100644 query_bank_fresh_warehouse/query10/validate.py create mode 100644 query_bank_fresh_warehouse/query11/ground_truth.csv create mode 100644 query_bank_fresh_warehouse/query11/query.json create mode 100644 query_bank_fresh_warehouse/query11/validate.py create mode 100644 query_bank_fresh_warehouse/query12/ground_truth.csv create mode 100644 query_bank_fresh_warehouse/query12/query.json create mode 100644 query_bank_fresh_warehouse/query12/validate.py create mode 100644 query_bank_fresh_warehouse/query13/ground_truth.csv create mode 100644 query_bank_fresh_warehouse/query13/query.json create mode 100644 query_bank_fresh_warehouse/query13/validate.py create mode 100644 query_bank_fresh_warehouse/query14/ground_truth.csv create mode 100644 query_bank_fresh_warehouse/query14/query.json create mode 100644 query_bank_fresh_warehouse/query14/validate.py create mode 100644 query_bank_fresh_warehouse/query15/ground_truth.csv create mode 100644 query_bank_fresh_warehouse/query15/query.json create mode 100644 query_bank_fresh_warehouse/query15/validate.py create mode 100644 query_bank_fresh_warehouse/query16/ground_truth.csv create mode 100644 query_bank_fresh_warehouse/query16/query.json create mode 100644 query_bank_fresh_warehouse/query16/validate.py create mode 100644 query_bank_fresh_warehouse/query17/ground_truth.csv create mode 100644 query_bank_fresh_warehouse/query17/query.json create mode 100644 query_bank_fresh_warehouse/query17/validate.py create mode 100644 query_bank_fresh_warehouse/query18/ground_truth.csv create mode 100644 query_bank_fresh_warehouse/query18/query.json create mode 100644 query_bank_fresh_warehouse/query18/validate.py create mode 100644 query_bank_fresh_warehouse/query19/ground_truth.csv create mode 100644 query_bank_fresh_warehouse/query19/query.json create mode 100644 query_bank_fresh_warehouse/query19/validate.py create mode 100644 query_bank_fresh_warehouse/query2/ground_truth.csv create mode 100644 query_bank_fresh_warehouse/query2/query.json create mode 100644 query_bank_fresh_warehouse/query2/validate.py create mode 100644 query_bank_fresh_warehouse/query20/ground_truth.csv create mode 100644 query_bank_fresh_warehouse/query20/query.json create mode 100644 query_bank_fresh_warehouse/query20/validate.py create mode 100644 query_bank_fresh_warehouse/query21/ground_truth.csv create mode 100644 query_bank_fresh_warehouse/query21/query.json create mode 100644 query_bank_fresh_warehouse/query21/validate.py create mode 100644 query_bank_fresh_warehouse/query22/ground_truth.csv create mode 100644 query_bank_fresh_warehouse/query22/query.json create mode 100644 query_bank_fresh_warehouse/query22/validate.py create mode 100644 query_bank_fresh_warehouse/query23/ground_truth.csv create mode 100644 query_bank_fresh_warehouse/query23/query.json create mode 100644 query_bank_fresh_warehouse/query23/validate.py create mode 100644 query_bank_fresh_warehouse/query24/ground_truth.csv create mode 100644 query_bank_fresh_warehouse/query24/query.json create mode 100644 query_bank_fresh_warehouse/query24/validate.py create mode 100644 query_bank_fresh_warehouse/query25/ground_truth.csv create mode 100644 query_bank_fresh_warehouse/query25/query.json create mode 100644 query_bank_fresh_warehouse/query25/validate.py create mode 100644 query_bank_fresh_warehouse/query26/ground_truth.csv create mode 100644 query_bank_fresh_warehouse/query26/query.json create mode 100644 query_bank_fresh_warehouse/query26/validate.py create mode 100644 query_bank_fresh_warehouse/query27/ground_truth.csv create mode 100644 query_bank_fresh_warehouse/query27/query.json create mode 100644 query_bank_fresh_warehouse/query27/validate.py create mode 100644 query_bank_fresh_warehouse/query28/ground_truth.csv create mode 100644 query_bank_fresh_warehouse/query28/query.json create mode 100644 query_bank_fresh_warehouse/query28/validate.py create mode 100644 query_bank_fresh_warehouse/query29/ground_truth.csv create mode 100644 query_bank_fresh_warehouse/query29/query.json create mode 100644 query_bank_fresh_warehouse/query29/validate.py create mode 100644 query_bank_fresh_warehouse/query3/ground_truth.csv create mode 100644 query_bank_fresh_warehouse/query3/query.json create mode 100644 query_bank_fresh_warehouse/query3/validate.py create mode 100644 query_bank_fresh_warehouse/query30/ground_truth.csv create mode 100644 query_bank_fresh_warehouse/query30/query.json create mode 100644 query_bank_fresh_warehouse/query30/validate.py create mode 100644 query_bank_fresh_warehouse/query31/ground_truth.csv create mode 100644 query_bank_fresh_warehouse/query31/query.json create mode 100644 query_bank_fresh_warehouse/query31/validate.py create mode 100644 query_bank_fresh_warehouse/query32/ground_truth.csv create mode 100644 query_bank_fresh_warehouse/query32/query.json create mode 100644 query_bank_fresh_warehouse/query32/validate.py create mode 100644 query_bank_fresh_warehouse/query33/ground_truth.csv create mode 100644 query_bank_fresh_warehouse/query33/query.json create mode 100644 query_bank_fresh_warehouse/query33/validate.py create mode 100644 query_bank_fresh_warehouse/query34/ground_truth.csv create mode 100644 query_bank_fresh_warehouse/query34/query.json create mode 100644 query_bank_fresh_warehouse/query34/validate.py create mode 100644 query_bank_fresh_warehouse/query35/ground_truth.csv create mode 100644 query_bank_fresh_warehouse/query35/query.json create mode 100644 query_bank_fresh_warehouse/query35/validate.py create mode 100644 query_bank_fresh_warehouse/query36/ground_truth.csv create mode 100644 query_bank_fresh_warehouse/query36/query.json create mode 100644 query_bank_fresh_warehouse/query36/validate.py create mode 100644 query_bank_fresh_warehouse/query37/ground_truth.csv create mode 100644 query_bank_fresh_warehouse/query37/query.json create mode 100644 query_bank_fresh_warehouse/query37/validate.py create mode 100644 query_bank_fresh_warehouse/query38/ground_truth.csv create mode 100644 query_bank_fresh_warehouse/query38/query.json create mode 100644 query_bank_fresh_warehouse/query38/validate.py create mode 100644 query_bank_fresh_warehouse/query39/ground_truth.csv create mode 100644 query_bank_fresh_warehouse/query39/query.json create mode 100644 query_bank_fresh_warehouse/query39/validate.py create mode 100644 query_bank_fresh_warehouse/query4/ground_truth.csv create mode 100644 query_bank_fresh_warehouse/query4/query.json create mode 100644 query_bank_fresh_warehouse/query4/validate.py create mode 100644 query_bank_fresh_warehouse/query40/ground_truth.csv create mode 100644 query_bank_fresh_warehouse/query40/query.json create mode 100644 query_bank_fresh_warehouse/query40/validate.py create mode 100644 query_bank_fresh_warehouse/query41/ground_truth.csv create mode 100644 query_bank_fresh_warehouse/query41/query.json create mode 100644 query_bank_fresh_warehouse/query41/validate.py create mode 100644 query_bank_fresh_warehouse/query42/ground_truth.csv create mode 100644 query_bank_fresh_warehouse/query42/query.json create mode 100644 query_bank_fresh_warehouse/query42/validate.py create mode 100644 query_bank_fresh_warehouse/query43/ground_truth.csv create mode 100644 query_bank_fresh_warehouse/query43/query.json create mode 100644 query_bank_fresh_warehouse/query43/validate.py create mode 100644 query_bank_fresh_warehouse/query44/ground_truth.csv create mode 100644 query_bank_fresh_warehouse/query44/query.json create mode 100644 query_bank_fresh_warehouse/query44/validate.py create mode 100644 query_bank_fresh_warehouse/query45/ground_truth.csv create mode 100644 query_bank_fresh_warehouse/query45/query.json create mode 100644 query_bank_fresh_warehouse/query45/validate.py create mode 100644 query_bank_fresh_warehouse/query46/ground_truth.csv create mode 100644 query_bank_fresh_warehouse/query46/query.json create mode 100644 query_bank_fresh_warehouse/query46/validate.py create mode 100644 query_bank_fresh_warehouse/query47/ground_truth.csv create mode 100644 query_bank_fresh_warehouse/query47/query.json create mode 100644 query_bank_fresh_warehouse/query47/validate.py create mode 100644 query_bank_fresh_warehouse/query48/ground_truth.csv create mode 100644 query_bank_fresh_warehouse/query48/query.json create mode 100644 query_bank_fresh_warehouse/query48/validate.py create mode 100644 query_bank_fresh_warehouse/query5/ground_truth.csv create mode 100644 query_bank_fresh_warehouse/query5/query.json create mode 100644 query_bank_fresh_warehouse/query5/validate.py create mode 100644 query_bank_fresh_warehouse/query6/ground_truth.csv create mode 100644 query_bank_fresh_warehouse/query6/query.json create mode 100644 query_bank_fresh_warehouse/query6/validate.py create mode 100644 query_bank_fresh_warehouse/query7/ground_truth.csv create mode 100644 query_bank_fresh_warehouse/query7/query.json create mode 100644 query_bank_fresh_warehouse/query7/validate.py create mode 100644 query_bank_fresh_warehouse/query8/ground_truth.csv create mode 100644 query_bank_fresh_warehouse/query8/query.json create mode 100644 query_bank_fresh_warehouse/query8/validate.py create mode 100644 query_bank_fresh_warehouse/query9/ground_truth.csv create mode 100644 query_bank_fresh_warehouse/query9/query.json create mode 100644 query_bank_fresh_warehouse/query9/validate.py create mode 100644 query_bank_fresh_warehouse/query_dataset/bank_warehouse_dump/bank_warehouse/_meta.bson create mode 100644 query_bank_fresh_warehouse/query_dataset/bank_warehouse_dump/bank_warehouse/_meta.metadata.json create mode 100644 query_bank_fresh_warehouse/query_dataset/bank_warehouse_dump/bank_warehouse/customer.bson create mode 100644 query_bank_fresh_warehouse/query_dataset/bank_warehouse_dump/bank_warehouse/customer.metadata.json diff --git a/query_bank_fresh_direct/db_config.yaml b/query_bank_fresh_direct/db_config.yaml new file mode 100644 index 0000000000..ac2b8bbbb5 --- /dev/null +++ b/query_bank_fresh_direct/db_config.yaml @@ -0,0 +1,21 @@ +db_clients: + core_banking: + db_type: postgres + db_name: bank_cbs + sql_file: query_dataset/cbs.sql + cards: + db_type: sqlite + db_path: query_dataset/cards.db + lending: + db_type: duckdb + db_path: query_dataset/lending.duckdb + payments: + db_type: sqlite + db_path: query_dataset/payments.db + crm: + db_type: mongo + db_name: bank_crm + dump_folder: query_dataset/bank_crm_dump + insurance: + db_type: duckdb + db_path: query_dataset/insurance.duckdb diff --git a/query_bank_fresh_direct/db_description.txt b/query_bank_fresh_direct/db_description.txt new file mode 100644 index 0000000000..c2d089c321 --- /dev/null +++ b/query_bank_fresh_direct/db_description.txt @@ -0,0 +1,55 @@ +You are working with six databases to solve this query. They are the operational systems of one retail bank in India. Amounts are in Indian rupees (INR). They are the bank's live systems: every transaction is visible in them as soon as it is posted. + +Here are the descriptions of these six databases: + +1. core_banking + - This database is stored in a PostgreSQL database and is the bank's core banking system: customers, their deposit accounts, account transactions, cheques, and fixed and recurring deposits. + - This database consists of six tables: + - customers: Bank customers + - Fields: customer_id, name, age, gender, senior_citizen, kyc_status, monthly_income, comm_line1, comm_line2, comm_city, comm_state, comm_pincode, perm_line1, perm_line2, perm_city, perm_state, perm_pincode (comm_ = communication address, perm_ = permanent address) + - accounts: Savings and current accounts + - Fields: account_id, customer_id, account_type, status, ifsc, home_branch, nominee_name, nominee_relationship, open_date, available_balance, hold_amount, currency + - account_holders: Holders of each account, in order (holder_seq 1 is the primary holder) + - Fields: account_id, holder_seq, holder_name + - transactions: Account transactions + - Fields: reference_id, account_id, txn_date, description, amount, direction, channel, balance_after + - cheques: Cheque leaves issued on accounts + - Fields: account_id, cheque_number, status + - deposits: Fixed deposits (kind FD) and recurring deposits (kind RD) + - Fields: deposit_id, payout_account, kind, principal, rate, tenure_months, start_date, maturity_date, maturity_amount, payout_type, maturity_instruction, status, nominee_name, nominee_relationship, monthly_installment, installments_paid, total_deposited, source_account + +2. cards + - This database is stored in a SQLite database and is the bank's card management system. + - This database consists of two tables: + - cards: Debit and credit cards + - Fields: card_id, account_no, card_type, network, status, credit_limit, available_limit + - card_controls: Per-card usage controls, one row per channel (atm, online, pos) and region (domestic, international) + - Fields: card_id, account_no, channel, region, enabled, daily_limit + +3. lending + - This database is stored in a DuckDB database and is the bank's loan management system. + - This database consists of one table: + - loans: Home, personal and gold loans + - Fields: loan_id, borrower_ref, loan_type, outstanding, rate, emi, remaining_tenure_months, next_due_date, status + +4. payments + - This database is stored in a SQLite database and is the bank's payments hub. + - This database consists of one table: + - mandates: Standing payment mandates (UPI autopay, NACH and similar) that debit an account + - Fields: mandate_id, debit_account, payee, amount, frequency, next_debit_date, status, mandate_type + +5. crm + - This database is stored in a MongoDB database and is the bank's customer relationship management system. + - This database consists of three collections: + - customers: Customer relationship data + - Fields: _id, segment, profession, sector, employer, marital_status, email, phone + - service_requests: Service requests raised by customers + - Fields: _id, request_id, category, description, related_transaction_id, account_id, status, priority, created_at, eta + - offers: Product offers shown to customers + - Fields: _id, customer, offer_id, type, title, detail, indicative + +6. insurance + - This database is stored in a DuckDB database and is the feed of insurance policies the bank distributes for its partner insurers. + - This database consists of one table: + - policies: Insurance policies held by bank customers + - Fields: policy_id, policyholder_ref, policy_name, insurer, sum_assured, premium, frequency, status, next_premium_date, nominee_name, nominee_relationship diff --git a/query_bank_fresh_direct/db_description_withhint.txt b/query_bank_fresh_direct/db_description_withhint.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/query_bank_fresh_direct/query1/ground_truth.csv b/query_bank_fresh_direct/query1/ground_truth.csv new file mode 100644 index 0000000000..78f789d4f3 --- /dev/null +++ b/query_bank_fresh_direct/query1/ground_truth.csv @@ -0,0 +1 @@ +1113900.00 diff --git a/query_bank_fresh_direct/query1/query.json b/query_bank_fresh_direct/query1/query.json new file mode 100644 index 0000000000..0c771ff880 --- /dev/null +++ b/query_bank_fresh_direct/query1/query.json @@ -0,0 +1 @@ +"Current time: 2026-07-01 08:13 IST. What is the available balance of account SB4516247616 right now?" \ No newline at end of file diff --git a/query_bank_fresh_direct/query1/validate.py b/query_bank_fresh_direct/query1/validate.py new file mode 100644 index 0000000000..1e656414c7 --- /dev/null +++ b/query_bank_fresh_direct/query1/validate.py @@ -0,0 +1,81 @@ +"""Bank freshness question 1 (control, 2026-07-01 08:13). Generated by make_fresh_datasets.py; do not edit.""" +import re + +SPEC = ['money', 1113900.0, 1.0] +DATETIME = re.compile('\\b\\d{4}-\\d{2}-\\d{2}(?:[ T]\\d{1,2}:\\d{2}(?::\\d{2})?)?\\b|\\b\\d{1,2}:\\d{2}\\b') + +import re + +NUMBER = re.compile(r"(?FVmLr{49{ zQ`I%S%W*$GdilO*-qKlIRG2;8+OnUu&b0V6XY+YoI~DKfsKl$O&FA425+DH*AOR8} z0TLhq5+DH*AOR8}f&c#qOzT?y%lKpG|Fmi7Do01_=`r)E#T+)1zn+^PNPq-LfCNZ@ z1W14cNPq-LfCNZ@1l~CW{+gMPII(m0QJzJc0zY25Wo`NMKfnJUpvF%mKmsH{0wh2J zBtQZrKmsH{0wnNGAkcf+;Ws)grOJrv9s1 zqiWr2`g<$gORED}9H=CtWH%{hc(_@ z>g?(2sP>-NTU|CNN2}c2U0GEfbg^02U+o=qp><9FsuL?~U|dyKx=mF#8@Z;h($~LcQ2N&0)l>UUl;Th9sPyRu zY}Hu#nC_lcweD*5#37qE$-CNH?W*+Edb-zi)>a3q*|g~qD}vsLK4djLY*~+3O#`?$ zZBpIzkm)vc-+K8$*F7<6)23zCcOx1EvQ1d9aMs-1!edVKI`2fgI*@;vHL}Cn9uTc% z8l-AN(~lyZR@27AYe-dnX{&$s8pu<%HXg3?twOd-_x7?~gUY>Ps@Cgkbe0`emfgH8 z7mQFvT`*pCl=^umj1SsC0wh2JBtQZrKmsH{0wh2J|6>Hy6Mq$th0E}?*rXrLI`PTE zBik~|T5jRte!=`Xj-7Bb59^QFY$BU_#In9)H9czKky8DrC(U{x?^A`~L9w9_ok{=G zkPkPk-(|=O=Pz2AKhU-ls8D|_7Ykm6V@*;2X@z&sQx(R1#-W96Gb_C(_4Kx(!lREl zwrx&rSrw1fx`hY6wF*DeH*|&V)$TrQ1NbU5NaJsX*N~;=l%Ech1z3=tnG1Zdq`ayUjI|;TdnG;%XL+Qx~|gQ-CyalERgg*dcHF9 zt&#l96+_oJYu<_F`3nmr)aZTmYHWFHHU8DqI3&(HZh$qy^RZ9h^INOx`m2X-T&|IS6 zLtFgj_xUI4u=&Hbqc}d63-jO1Fqu(uA!L5@3^eE=(hufa8{`^j}CoKQ4 z{u#EtVapF|f7ty0?e>J_9~}R0c0SyEhTHzI<%jj3un#4hd&qc`Hxjq(A>++DGk87h z6J+rI|JUbXopZSD4Ley3w>@FY4{Lwe!4=k?;m#k{f5PSu%V)UD56d&G{qMB$-$C~H zo^!%-4eJ+SC$X^h3^&)X_J`#Y*8Z^egv}q;p5e|v-2O1!_76Az;Vyr;`GhS$?7ARq z`C;=9w|~CV$`ADp7BUb0knx7Ug|uZ47{d)FtRuYB^8a584D^S0ng`Mz5+H&9R|MW^ z@i6Sd?f=^R71mF}_pjMv9qtFzuy%#bAJ&h;at)h5tUY1*hvoC%K5oL={{{~jL;m4` zcgE92STFGH*@bn{Eyy3%o-HWSmnEzh54SyGe~T@w{b8d**!(`Y!*CLo|8VmO+h1X$ zNLYl!%_nU6?=<_v`a@Xz!}f1jp2KZ_*z*6|^M~ahHh)+?Vf`npfBv`U56d%bd*5m6 znXvP3SpN*mXSn&l)9eZRwL;kZGv1!x?)Lt$*yjGm*p@w9goXbW^M_qKy~XM_e|y+L zw)v8Hg#<`|1W14cNPq-LfCT>g2n_wzMg4CHZ|=_uzat+q{`=_DViI@@1m0;oG=rPc zGB}ATBtQZrKmsH{0{Oye*t62|C7j;Jza$T{xs~?|8VCI+x1~rdttvH9PaYN z+7p(4*z(_L`NMu6J>2$(9baMnCv5p)+dJGm!~VI5u=a=L6V{&L<`eci->~+CE_15#le+2>Kx&!^`?GJcI_1y3IZfnEmdgK0TN~oXn0|}4-36KB@kN^pg z011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!) z36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@ zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg z011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!) z36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@ zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg z011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!) z36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@ zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg z011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!) z36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@ zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg z011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!) z36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@ zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg z011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!) z36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@ zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg z011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!) z36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@ zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg z011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!) z36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@ zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg z011!)36KB@kN^pg011!)36KB@kN^pgz}rILqQ6{w)YH3uv-umXmi6!PmNg2cPJpIB zyFvRyDd;e0CUgXJEVLBrg8HHNLgz!5LLY{1gl>Vp41FDX5c(eU6!aYQ3iJo)pU{XV z%Nhr52emRD|Y2i=h*tPUvLlH0W&TBIrZV$DmI`w?X$n_d(x*o`jx-UV?rL z{S|78Sk`E0A~Y4+9hwHEq3O^pXd!eQ)B&x6)CWeduZE7tpKFpP+w3%_A&pJTw{F1=<%%K!-qOXg+i_RDo7NYoODibD@i& ztD)z6w16JqG;<`Z@G6^gHP9P;{haje)j-c7pbVY$yxmq1n)p&%j&4uxhw3!r15 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 zKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{ z0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2J zBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZr zKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{ z0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2J zBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZr zKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{ z0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2J zBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZr zKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{ z0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2J zBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZr zKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{ z0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2J zBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZr zKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{ z0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2J zBtQZrKmsK2|FuI0Bme*a0D}I%ZbzUKG+@Ah0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM U7%*VKfB^#r3>YwAz<`0zK;8GnrT_o{ literal 0 HcmV?d00001 diff --git a/query_bank_fresh_direct/query_dataset/lending.duckdb b/query_bank_fresh_direct/query_dataset/lending.duckdb new file mode 100644 index 0000000000000000000000000000000000000000..b0bf232170da68cf2bf64508c4085805aac18b33 GIT binary patch literal 798720 zcmeFa2b>nw`Sw3s*j@H{7M3DKKo*c9qE0Uw5d;+!5gS=Fi8~ckLD7RV+;1h7A#SWMzNzw6iXsW(4Z#zzs}5gu*5dLpZ&eQ|KIf_7rW0rXHNN^``o9@ zAO}C!ICb0k*G(IH;F!HeDc|igN88@mUiWUG13OcJy&Gbx>Sn}qk3J+iCO#yR z1$X}Zp?>FU;v~Lbk!xv0z@TAL5doe{jOq~ zQnu-kLtz!2rHVg>eU>IxHXV|tJEaWimT9GQEhxH_Ppq^oMb(hmP^4*AOKBE&5ScBm z7qu3jAA;|*4kSPVBtQZrKmsH{0wh2JB=EnGfY|ZJ*f}QHP-fe=Y4}aSzAjOesmf}l zX2L{G)lE}*MEvS`wx=tPD#~L@+2aa!o#G=lqnk7Nh1dg@e<71JQToT{(&2^`L(=`? z7t*3YRg2ZYi3}8&#C~Wej#etLCd=yk7Pw@RD6sO&1x`J3dL(wrC~#&xYxa>d{OP3v zvELV;?_1#NeMNy)Un(%A@W)xu|De+kEKo zeOt9G{@Q}p+*`G|r1$@JTWw13{{Z01nO|EJcu9KirAH#7sPEgNB}ad4G0QJQ?y{hJ z#qZhY`*=xBl&&|K^wLzLv-rFXZKu*FW>}Y47^v<)7F8 z^VYw;`Q)vC=P$a)w|>jp-n{(t^2zJ}dHLl1yQuBm-n@MB)+cZOws-pWZf{;bdFzum ze&+SJy#Ajzect}f+urt0pSS*b`!{d;y#AIq{n+}-(Ru#AYo5f&`Mac-lSswqD>5c$ zIoXcnzcv})wsHS%n~c1JpuL?muM@SmQ|E1O-bpp@rmFa@%aSi9Xz%*x<)61cdHo@8 zkjUF#?Op%8JoC0UZ~pC_{)bloy!FZJpLxf7-t>9>IqxDXZ+r9BCvX0F`zvqyyoXHf zJznzWpOX=k=ew^~uY#z4PBA=VCtZ;y-Wt-E-FG zYc?0(_K@zoZ7#mJ6y-M(_+LgKZ?yVfhUfb>H}9hL`Z9&Z!*5|#k}vf!N|M5%GkoMs+IiFGJ)Oy0|GfP3=AZX;I4_^P{*br5dE-ys{PXh6n}2)zPi@Y5wDhzl zFW2_w)ZY2$_3OO#$;&fu`n=;TZ~l4Pn|Bo4V#Ov{tNiuZF`Y7{O3*o z74Dh0<=>b-?;bO6{lBsBueiwkzXHnVOg}V#Xm9_?+upqX)81hxZ~Z^l)!*sYy!CJI z`h2HK{|_cAo#lVmBJ=ulUY>dVGjINR)90ywvf-t_GqpYygiFaNylZSVYd%lS7WKL1y?zsv7=>;DbgivRwPZGE>bMP8TB z>tcCbCU5?Er_j8Q=i9A5Us@~V<&?MG?fp0~Z++T(sOLRa$y=Yi>GS$gUVq42pS=B* zw?6IN-n^l+z4_$LKQGU`>GQ_*A6ou-dA4_Z^ZHxf`sB?&@A%4_KJROa?d?B#<5gas zdHXAGd-L+oJAdWnlQ(_d_U29B-u3x^J^#Fasr$S9m!>|yMfrxU#aI3ZcE8*1BJU{7 zn?A3X<(*aXrq4TS^R~CW)8}n(-umS2ue|xUclsY%{qy!$-dQeh`u66ZH~;qTukVq6 z-i1}(CNn(={2vp@>(}j_K5v8auD0{$pLaExH~+jm^XC8mdiuQcUf%ZR^&hVLzM1e> z?=Cj~OB!GIk81odHW}aCG+u3Q0t|-jO_=$U011!)3A6)&Z0*B;SG^t3GD{Npj6gQf z(mezIb-dC?{KI@@tCi+@ak;c_jKn{nDgI5(j*-$VKez|~dgT|sAM>T}Z{S}S{6d1~ z%D-fIu;NRG8!EqKXzB1J!>3<1yoG;IaH@iT1hUiw{v-hsAOR8}0TLhq5+DH*_@NW{ z^1i=xj9vOEo*|a@BjTUbEB(H?UH{H<*!-QpkN^pg011!)36KB@kN^pg011!)36KB@ zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg z011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!) z36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@ zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg z011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!) z36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@ zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg z011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!) z36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@ zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg z011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!) z36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@ zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg z011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!) z36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@ zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg z011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!) z36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@ zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg z011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!) z36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@ zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg z011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!) z36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@ zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@d?SH3ce>;1TaLZyrEQCf zGPIkbR3mjKXbY$>Gzc0FX^;!;0__g%4IKa-3&6m4(bl| zfd)d`Kq}-wBca`(3DEw~L68qkgN}seK=YtQ(5cW_&;`&k=xXRj=r-tX=mF?a=qYF| z^eXfQ^jByj^f6Rkp(q`pdZ;I~6*L$c0U6Ma&}e8Jv=1~H`Y9AaheNZVl9L3bjC&LRUdIK(|77LH9$CKx?4qpjV*3K<`5Tgg%1G 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%0DZV!)Yg*GfCG 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