icmr-data2 / app.py
kzropx's picture
Update app.py
67a6061 verified
Raw
History Blame Contribute Delete
3.39 kB
from fastapi import FastAPI, HTTPException, Query
import duckdb
from contextlib import asynccontextmanager
con = None
@asynccontextmanager
async def lifespan(app: FastAPI):
global con
con = duckdb.connect()
con.execute("PRAGMA memory_limit='14GB'")
con.execute("PRAGMA threads=4")
con.execute("SET enable_object_cache=true")
con.execute("SET preserve_insertion_order=false")
con.execute("INSTALL httpfs; LOAD httpfs;")
URLS = [
"https://huggingface.co/datasets/Kzr0xx/Icmr-and-hitek/resolve/main/part1.parquet",
"https://huggingface.co/datasets/Kzr0xx/Icmr-and-hitek/resolve/main/part2a.parquet",
"https://huggingface.co/datasets/Kzr0xx/Icmr-and-hitek/resolve/main/part2b_new.parquet"
]
# Warm-up cache (load metadata)
for url in URLS:
con.execute(f"SELECT 1 FROM read_parquet('{url}') LIMIT 1")
print("🟢 All parts cached! Ready.")
yield
con.close()
app = FastAPI(lifespan=lifespan)
VALID_KEY = "@kzr0x"
@app.get("/")
def home(key: str = Query(...)):
if key != VALID_KEY:
return {"status": "error", "message": "Invalid key"}
return {"status": "success", "message": "API Live! Use /search"}
@app.get("/search")
async def search_data(
key: str = Query(...),
number: str = Query(None),
aadhar: str = Query(None),
q: str = Query(None)
):
if key != VALID_KEY:
return {"status": "error", "message": "Invalid key"}
if not number and not aadhar and not q:
raise HTTPException(status_code=400, detail="Provide number, aadhar, or q")
search_term = q or number or aadhar
URLS = [
"https://huggingface.co/datasets/Kzr0xx/Icmr-and-hitek/resolve/main/part1.parquet",
"https://huggingface.co/datasets/Kzr0xx/Icmr-and-hitek/resolve/main/part2a.parquet",
"https://huggingface.co/datasets/Kzr0xx/Icmr-and-hitek/resolve/main/part2b_new.parquet"
]
# Build query with per-part WHERE clauses
queries = []
for url in URLS:
queries.append(f"""
SELECT * FROM read_parquet('{url}')
WHERE phoneNumber = ? OR aadharNumber = ?
""")
full_query = " UNION ALL ".join(queries) + " LIMIT 10"
params = [search_term, search_term] * len(URLS)
result = con.execute(full_query, params).fetchall()
if not result:
return {
"status": "error",
"message": f"'{search_term}' not found in any dataset."
}
# Format response
data_list = []
for row in result:
data_list.append({
"name": row[0],
"fathersName": row[1],
"phoneNumber": row[2],
"aadharNumber": row[3],
"otherNumber": row[4],
"address": row[5],
"district": row[6],
"pincode": row[7],
"state": row[8],
"town": row[9],
"source": row[10] # icmr or inddata
})
icmr_data = [d for d in data_list if d["source"] == "icmr"]
hitek_data = [d for d in data_list if d["source"] == "inddata"]
return {
"credits": {
"developer": "@kzr0x",
"team": "TEAM DARK KNIGHT APIs",
"channel": "@API_WALLAH"
},
"icmr_data": icmr_data,
"hitek_data": hitek_data,
"results": data_list # all matches
}