File size: 2,209 Bytes
b474ae1
06f01b3
b474ae1
5b4c268
f146007
 
5b4c268
f146007
 
b474ae1
 
 
 
 
5b4c268
b474ae1
 
f146007
 
b474ae1
 
 
 
 
 
 
 
f146007
5b4c268
06f01b3
 
 
b474ae1
f146007
06f01b3
b474ae1
f146007
 
 
 
b474ae1
f146007
b474ae1
 
 
 
 
f146007
 
8cb3a33
f146007
b474ae1
 
f146007
b474ae1
 
 
 
 
 
 
5b4c268
06f01b3
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import json
import gradio as gr
import duckdb

# Load the Parquet dataset path
dataset_path = 'sample_contract_df.parquet'  # Update with your Parquet file path

# Load the dataset schema with DuckDB
def load_dataset_schema():
    con = duckdb.connect()
    con.execute(f"CREATE VIEW contract_data AS SELECT * FROM '{dataset_path}'")
    schema = con.execute("DESCRIBE contract_data").fetchdf()
    con.close()
    return schema.to_dict(orient="records")

# Generate SQL based on schema and user query
def generate_sql_query(features, query):
    # This simple example constructs an SQL condition directly, adapt for complex queries if needed
    sql_query = f"SELECT * FROM contract_data WHERE {query}"
    return sql_query

# Execute the SQL query and display results
def execute_query(sql_query):
    con = duckdb.connect()
    con.execute(f"CREATE VIEW contract_data AS SELECT * FROM '{dataset_path}'")
    result_df = con.execute(sql_query).fetchdf()
    con.close()
    return result_df.to_markdown()  # Display result as markdown

# Gradio app UI
with gr.Blocks() as demo:
    gr.Markdown("""
    # Local Parquet SQL Query App
    Query and explore data in `sample_contract_df.parquet` using DuckDB and SQL queries.
    """)
    
    # Load dataset schema and convert it to JSON for display
    schema = load_dataset_schema()
    schema_json = json.dumps(schema, indent=2)
    features = gr.Code(label="Dataset Schema", value=schema_json, language="json")

    # User input components
    query = gr.Textbox(label="Natural Language Query", placeholder="Enter a condition, e.g., 'amount > 1000'")
    sql_out = gr.Code(label="Generated SQL Query", language="sql")
    results_out = gr.Markdown(label="Query Results")

    # Buttons to generate and execute SQL
    btn_generate = gr.Button("Generate SQL")
    btn_execute = gr.Button("Execute Query")

    # Set up click events with correct inputs and outputs
    btn_generate.click(
        fn=generate_sql_query,
        inputs=[features, query],  # Both are Gradio components now
        outputs=sql_out,
    )
    btn_execute.click(
        fn=execute_query,
        inputs=sql_out,
        outputs=results_out,
    )

# Launch the app
demo.launch()