1
+ import json
2
+ import time
1
3
import traceback
2
4
3
5
import psycopg2
4
- import os
6
+ from psycopg2 . extras import RealDictCursor
5
7
from typing import List
8
+
6
9
from . import models , schemas
7
- from .database import cur , TABEL_NAME , conn , DATABASE_URL
10
+ from .database import TABEL_NAME , DATABASE_URL
8
11
from fastapi import HTTPException
9
12
10
13
@@ -20,10 +23,27 @@ def create_items(items: List[schemas.ItemCreate]):
20
23
conn = psycopg2 .connect (DATABASE_URL )
21
24
# Create a cursor object to interact with the database
22
25
cur = conn .cursor ()
23
- query = f"INSERT INTO { TABEL_NAME } (p_key, question, answer, provider, model, timestamp) VALUES (%s, %s, %s, %s, %s, %s)"
26
+ query = (f"INSERT INTO { TABEL_NAME } (p_key, question, answer, provider, model, timestamp, miner_hot_key, miner_uid"
27
+ f", score, similarity, vali_uid, timeout, time_taken, epoch_num, cycle_num, block_num"
28
+ f", name) VALUES (%s, %s, %s, %s, %s, %s"
29
+ f", %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)" )
24
30
datas = []
25
31
for item in items :
26
- datas .append ((item .p_key , item .question , item .answer , item .provider , item .model , item .timestamp ))
32
+ question = json .loads (item .question )
33
+ miner_uid = question .get ("miner_info" , {}).get ("miner_id" ) or 99999
34
+ miner_hot_key = question .get ("miner_info" , {}).get ("miner_hotkey" ) or ""
35
+ score = question .get ("score" ) or 0
36
+ similarity = question .get ("similarity" ) or 0
37
+ vali_uid = question .get ("validator_info" ).get ("vali_uid" )
38
+ timeout = question .get ("timeout" )
39
+ time_taken = question .get ("time_taken" )
40
+ epoch_num = question .get ("epoch_num" )
41
+ cycle_num = question .get ("cycle_num" )
42
+ block_num = question .get ("block_num" )
43
+ name = question .get ("name" ) or ""
44
+ datas .append ((item .p_key , item .question , item .answer , item .provider , item .model , item .timestamp , miner_hot_key ,
45
+ miner_uid , score , similarity , vali_uid , timeout ,
46
+ time_taken , epoch_num , cycle_num , block_num , name ))
27
47
try :
28
48
if conn .closed :
29
49
print ("connection is closed already" )
@@ -35,27 +55,45 @@ def create_items(items: List[schemas.ItemCreate]):
35
55
raise HTTPException (status_code = 500 , detail = f"Internal Server Error { err } " )
36
56
37
57
38
- def get_items (skip : int = 0 , limit : int = 10 ):
39
- req_body = {
40
- "filters" : {
41
- "min_score" : 0 ,
42
- "min_similarity" : 120 ,
43
- "model" : "" ,
44
- "provider" : "" ,
45
- "min_timestamp" : 12345 ,
46
- "max_timestamp" : 12345
47
- },
48
- "search" : 123 or "2FXABC" ,
49
- "sort_by" : "miner" ,
50
- "sort_order" : "desc"
51
- }
58
+ def get_items (req_body : models .RequestBody ):
52
59
conn = psycopg2 .connect (DATABASE_URL )
53
- # Create a cursor object to interact with the database
54
- cur = conn .cursor ()
55
- query = f"SELECT * FROM { TABEL_NAME } offset { skip } limit { limit } ;"
56
- cur .execute (query )
60
+ cur = conn .cursor (cursor_factory = RealDictCursor )
61
+ skip = req_body .skip
62
+ limit = req_body .limit
63
+
64
+ filter_by_miner_score = f"score>={ req_body .filters .min_score } " if req_body .filters .min_score else ""
65
+ filter_by_miner_similarity = f"score>={ req_body .filters .min_similarity } " if req_body .filters .min_similarity else ""
66
+ filter_by_provider = f"provider='{ req_body .filters .provider } '" if req_body .filters .provider else ""
67
+ filter_by_model = f"model='{ req_body .filters .model } '" if req_body .filters .model else ""
68
+ filter_by_min_timestamp = f"timestamp>={ req_body .filters .min_timestamp } " if req_body .filters .min_timestamp else ""
69
+ filter_by_max_timestamp = f"timestamp<={ req_body .filters .max_timestamp } " if req_body .filters .max_timestamp else ""
70
+ filter_by_epoch_num = f"epoch_num={ req_body .filters .epoch_num } " if req_body .filters .epoch_num else ""
71
+ filter_by_block_num = f"block_num={ req_body .filters .block_num } " if req_body .filters .block_num else ""
72
+ filter_by_cycle_num = f"cycle_num={ req_body .filters .cycle_num } " if req_body .filters .cycle_num else ""
73
+ filter_by_name = f"name={ req_body .filters .name } " if req_body .filters .name else ""
74
+ search_by_uid_or_hotkey = (f"miner_uid=%s" if str (req_body .search ).isdigit ()
75
+ else f"miner_hot_key like %s" ) if req_body .search else ""
76
+ conditions = [filter_by_miner_score , filter_by_miner_similarity , filter_by_provider , filter_by_model ,
77
+ filter_by_min_timestamp ,
78
+ filter_by_max_timestamp , filter_by_epoch_num , filter_by_block_num , filter_by_cycle_num ,
79
+ filter_by_name , search_by_uid_or_hotkey ]
80
+ conditions = [item for item in conditions if item ]
81
+ conditions_query = " and " .join (conditions )
82
+ order_by = f"order by { req_body .sort_by } { req_body .sort_order } "
83
+ query = f"SELECT * FROM { TABEL_NAME } where { conditions_query } { order_by } limit { limit } offset { skip } ;"
84
+ print (query )
85
+ query_cnt = f"SELECT count(*) FROM { TABEL_NAME } where { conditions_query } "
86
+ start_time = time .time ()
87
+ cur .execute (query , (f"%{ req_body .search } %" if not str (req_body .search ).isdigit () else str (req_body .search ),))
88
+ print (f"execution query has been completed. { time .time () - start_time } " )
57
89
items = cur .fetchall () # Fetch all results
58
- return [item for item in items ]
90
+ print (f"loaded to python object array. { time .time () - start_time } " )
91
+ # cur.execute(query_cnt, (f"%{req_body.search}%" if not str(req_body.search).isdigit() else str(req_body.search),))
92
+ # cnt = cur.fetchone().get('count')
93
+ # print(f"all query execution has been succeed. {time.time() - start_time}")
94
+ cur .close ()
95
+ conn .close ()
96
+ return {"records" : items , "limit" : limit , "skip" : skip }
59
97
60
98
61
99
def get_item (p_key : int ):
0 commit comments