Files
Anton_wireframe/app/services/__pycache__/querying.cpython-312.pyc
T

109 lines
10 KiB
Plaintext
Raw Normal View History

Ë
2025-10-28 20:54:15 +01:00
Zi&ãóØddlZddlZddlZddlmZmZddlmZddlm Z m
Z
2025-10-28 20:54:15 +01:00
m Z ddl m
Z
ddlmZddlmZmZmZmZddlmZdd lmZdd
lmZej6e«ZGd d «Zy)
éN)ÚListÚOptional)Úget_db)Ú FundTableÚ
InvestorTableÚ ProjectTable)ÚChatPromptTemplate)Ú
2025-09-25 17:00:38 +01:00
ChatOpenAI)ÚCompanyMinimalÚInvestmentResponseÚPaginatedResponseÚ
2025-10-28 20:54:15 +01:00
SectorMinimal)Útext)Ú selectinload)Ú(calculate_project_investor_compatibilitycópeZdZdZdedefdZ d
dedeedee fdZ
d
de edeedee fd „Z y) ÚQueryProcessorcó˜ttjd«ddd¬«|_i|_t j ddg«|_y)OPENROUTER_API_KEYzhttps://openrouter.ai/api/v1zopenai/gpt-4o-minir)Úapi_keyÚbase_urlÚmodelÚ temperature)Úsystemu\You are a SQL expert. Generate a SQLite query to find fund IDs based on user requirements.
Database Schema:
- funds: id, fund_name, investor_id, check_size_lower, check_size_upper, geographic_focus
- fund_sectors: fund_id, sector_id
2025-10-28 20:54:15 +01:00
- fund_investment_stages: fund_id, stage_id
- sectors: id, name
- investment_stages: id, name
- investors: id, name, aum
IMPORTANT RULES:
1. ALWAYS return ONLY fund IDs (funds.id) - use SELECT DISTINCT f.id
2. For geography: use LIKE '%keyword%' for partial matching
- 'Europe' → WHERE geographic_focus LIKE '%Europe%'
- 'America' → WHERE geographic_focus LIKE '%America%'
- 'Asia' → WHERE geographic_focus LIKE '%Asia%'
3. For stages: JOIN fund_investment_stages and investment_stages
- Use LIKE for stage matching: s.name LIKE '%Seed%'
4. For sectors: JOIN fund_sectors and sectors
- Use LIKE for sector matching: sec.name LIKE '%Fintech%'
5. For check size filters:
- "under X" → WHERE check_size_upper <= X
2025-10-28 20:54:15 +01:00
- "over X" → WHERE check_size_lower >= X
- "between X and Y" → WHERE check_size_lower >= X AND check_size_upper <= Y
6. Use DISTINCT to avoid duplicates from joins
7. Return a single, complete SELECT query
Example Queries:
Q: "Seed stage investors in Europe"
A: SELECT DISTINCT f.id FROM funds f
JOIN fund_investment_stages fis ON f.id = fis.fund_id
JOIN investment_stages s ON fis.stage_id = s.id
WHERE s.name LIKE '%Seed%' AND f.geographic_focus LIKE '%Europe%'
Q: "Fintech investors with check size under 5 million"
A: SELECT DISTINCT f.id FROM funds f
JOIN fund_sectors fs ON f.id = fs.fund_id
JOIN sectors sec ON fs.sector_id = sec.id
WHERE sec.name LIKE '%Fintech%' AND f.check_size_upper <= 5000000
Q: "Growth stage investors"
A: SELECT DISTINCT f.id FROM funds f
JOIN fund_investment_stages fis ON f.id = fis.fund_id
JOIN investment_stages s ON fis.stage_id = s.id
WHERE s.name LIKE '%Growth%'
Q: "Investors in North America"
A: SELECT DISTINCT f.id FROM funds f
WHERE f.geographic_focus LIKE '%North America%' OR f.geographic_focus LIKE '%America%'
Return ONLY the SQL query, no explanations or markdown.)Úuserz
{question})r
ÚosÚgetenvÚllmÚ query_cacher Ú
from_messagesÚ
sql_prompt)Úselfs úL/home/oluwasanmi/Documents/Work/MKD/anton_wireframe/app/services/querying.pyÚ__init__zQueryProcessor.__init__sSÜÜ—Iô 
ˆŒðˆÔô5ðl'ðo8
ó:
ˆóÚquestionÚreturncóœtj|j«j«j ««j «S)z,Generate cache key from normalized question.)ÚhashlibÚmd5ÚlowerÚstripÚencodeÚ hexdigest)r"r&s r#Ú_get_cache_keyzQueryProcessor._get_cache_keyas3ä{‰{˜8Ÿ>™>Ó+×3×=×Ir%
project_idc ó2|j|«}||jvr(|j|}tjd|«n¨|jj |¬«}|j j|«}|jj«}|jdd«jdd«j«}||j|<tjd|«tt««} |jt|««}|j«D cgc]} | dŒ }
} tjdt!|
«d |
d
d t!|
«d kDrd nd«|j#|
2025-10-28 20:54:15 +01:00
|«|j%«Scc} w#t&$rZ} tj)d
| «tj)d|«t+gddd d¬«cYd
} ~ |j%«Sd
} ~ wwxYw#|j%«wxYw)zÓProcess a query by generating and executing SQL directly.
Args:
question: The natural language query to process
project_id: Optional project ID for compatibility scoring
zUsing cached SQL: )r&z```sqlÚz```zGenerated SQL: rzFound z fund IDs: Né
z...zSQL execution error: z Failed SQL: é©ÚitemsÚtotalÚpageÚ page_sizeÚ total_pages)r/rÚloggerÚinfor!Úformat_messagesrÚinvokeÚcontentr,ÚreplaceÚnextrÚexecuterÚfetchallÚlenÚ_fetch_funds_by_idsÚcloseÚ ExceptionÚerrorr
) r"r&r0Ú cache_keyÚ sql_queryÚmessagesÚresponseÚ
db_sessionÚresultÚrowÚfund_idsÚes r#Ú
process_queryzQueryProcessor.process_queryeð×Ó1ˆ ð ˜× ×Ñ3ˆIÜ K‰KÐ,¨Y¨KÐ ×ÐIˆHØ—x‘x— xÓ0ˆHØ ×(×0ˆ"×)¨(°BÓ7×ÀrÓRˆIð+4ˆD× Ñ ˜ K‰K˜/¨)¨Ð œ&(“^ˆ
ð Ø×¨Y«Ó8ˆFØ*0¯/©/Ó*;Ö< 3˜˜AÐ<ˆ K‰KØœ˜X›˜ {°8¸C¸R°=°/Ì3ÈxË=Ð[]ÒK]Á%ÐceÐAfÐ
ð×+¨H°jÓ
× Ñ Õ ùò=øô ò Ü L‰LаРL‰L˜   ¨°RÀQôô
ð
× Ñ Õ ûð ûð
× Ñ Õ úsCÄ,FÄ0 FÄ<A FÆFÆ HÆ'?G<Ç&HÇ'HÇ<HÈHÈHrPc
óD|s#tgdd|rt|«d¬«Sdd¬«Stt««} d}|i|j t
«j
2025-10-28 20:54:15 +01:00
tt
j««jt
j|k(«j«}|j t«j
ttj«jtj«ttj«jtj «ttj«jtj"«ttj$«ttj"««jtjj'|««j)«}g}|D]o}|j}d} |t+||d¬«} |jdd D
cgc]#}
t-|
2025-10-28 20:54:15 +01:00
j|
j.¬
«Œ%} }
|j$r3d j1|j$D cgc]} | j.Œc} «nd}
|j"r|j"dd ngDcgc]#}t3|j|j.¬