import os import duckdb import time import psutil import platform import logging import sys from flask import Flask, request, jsonify, render_template_string from huggingface_hub import hf_hub_download # -------------------------------------------------- # LOGGING (FORCE SHOW) # -------------------------------------------------- sys.stdout.reconfigure(line_buffering=True) logging.basicConfig( level=logging.INFO, format="%(asctime)s | %(message)s", force=True ) log = logging.info log("🔥 APP STARTED") # -------------------------------------------------- # CONFIG # -------------------------------------------------- FILES = [ ("Oiasx/Datx", "chunk_022.parquet"), ("Oiasx/Datx", "chunk_023.parquet") ] app = Flask(__name__) # -------------------------------------------------- # TOKEN # -------------------------------------------------- HF_TOKEN = os.environ.get("Oiasx_TOKEN") if not HF_TOKEN: raise RuntimeError("Oiasx_TOKEN missing") log("🔐 Token loaded") # -------------------------------------------------- # SYSTEM INFO # -------------------------------------------------- log("🚀 Starting system") log(f"CPU: {os.cpu_count()}") ram = psutil.virtual_memory() log(f"RAM: {round(ram.total/1e9,2)} GB") # -------------------------------------------------- # DOWNLOAD FILES # -------------------------------------------------- parquet_files = [] log("📥 Downloading parquet files...") for repo, fname in FILES: try: log(f"⬇️ {fname}") path = hf_hub_download( repo_id=repo, filename=fname, repo_type="dataset", token=HF_TOKEN ) parquet_files.append(path) log(f"✅ Done: {fname}") except Exception as e: log(f"❌ Failed: {fname} | {e}") log(f"📊 Total files: {len(parquet_files)}") # -------------------------------------------------- # CONNECT DUCKDB (NO TABLE) # -------------------------------------------------- con = duckdb.connect() con.execute(f"PRAGMA threads={os.cpu_count()}") con.execute("PRAGMA enable_object_cache") log("⚡ DuckDB ready") # -------------------------------------------------- # GET COLUMNS # -------------------------------------------------- parquet_list_sql = ",".join([f"'{p}'" for p in parquet_files]) log("🔍 Reading schema...") cols = con.execute(f""" DESCRIBE SELECT * FROM read_parquet([{parquet_list_sql}]) """).fetchall() columns = [c[0] for c in cols] log(f"Columns: {columns}") # -------------------------------------------------- # SEARCH (DIRECT PARQUET) # -------------------------------------------------- def run_search(column, value): log(f"🔎 Search: {column} = {value}") if column not in columns: return {"error": "column not found"} value = str(value).strip() base = f"SELECT * FROM read_parquet([{parquet_list_sql}])" if column == "mobile": query = base + f" WHERE mobile = ? LIMIT 100" param = value log("⚡ Mode: EXACT mobile") elif column in ["circle","email","id","alt"]: query = base + f" WHERE {column} = ? LIMIT 100" param = value log("⚡ Mode: EXACT") else: query = base + f" WHERE {column} LIKE ? LIMIT 100" param = value + "%" log("🔍 Mode: PREFIX") start = time.time() rows = con.execute(query, [param]).fetchall() query_time = (time.time() - start) * 1000 log(f"⏱ {round(query_time,3)} ms | Rows: {len(rows)}") result = [dict(zip(columns, r)) for r in rows] return { "rows": result, "returned": len(result), "query_ms": round(query_time, 3) } # -------------------------------------------------- # UI # -------------------------------------------------- HTML = """
Run a search to see results.