Skip to content

Commit 4a28e18

Browse files
committed
query convertion into sql
1 parent fcaa6fb commit 4a28e18

File tree

6 files changed

+143
-36
lines changed

6 files changed

+143
-36
lines changed

app.py

+10-21
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from collections import defaultdict
44
from flasgger import Swagger
55
import re,os,traceback
6+
from query import PostgresQuery
67
from utils import *
78
from flask_cors import CORS,cross_origin
89
from v2_app import v2
@@ -127,21 +128,11 @@ def get_issues():
127128
type: string
128129
"""
129130
try:
130-
# Fetch all issues with their details
131-
response = SupabaseInterface().get_instance().client.table('dmp_orgs').select('*, dmp_issues(*)').execute()
132-
res = []
133-
134-
for org in response.data:
135-
obj = {}
136-
issues = org['dmp_issues']
137-
obj['org_id'] = org['id']
138-
obj['org_name'] = org['name']
139-
renamed_issues = [{"id": issue["id"], "name": issue["title"]} for issue in issues]
140-
obj['issues'] = renamed_issues
141-
142-
res.append(obj)
143-
144-
return jsonify({"issues": res})
131+
# Fetch all issues with their details
132+
133+
response = PostgresQuery.get_issue_query()
134+
135+
return jsonify({"issues": response})
145136

146137
except Exception as e:
147138
error_traceback = traceback.format_exc()
@@ -190,16 +181,14 @@ def get_issues_by_owner(owner):
190181
description: Error message
191182
"""
192183
try:
193-
# Construct the GitHub URL based on the owner parameter
194-
org_link = f"https://github.com/{owner}"
195-
184+
196185
# Fetch organization details from dmp_orgs table
197-
response = SupabaseInterface().get_instance().client.table('dmp_orgs').select('name', 'description').eq('name', owner).execute()
186+
response = PostgresQuery.get_issue_owner(owner)
198187

199-
if not response.data:
188+
if not response:
200189
return jsonify({'error': "Organization not found"}), 404
201190

202-
return jsonify(response.data)
191+
return jsonify(response)
203192

204193
except Exception as e:
205194
error_traceback = traceback.format_exc()

db.py

+36
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
from supabase import create_client, Client
44
from supabase.lib.client_options import ClientOptions
55
from abc import ABC, abstractmethod
6+
import psycopg2,json
7+
from psycopg2.extras import RealDictCursor
8+
69

710
client_options = ClientOptions(postgrest_client_timeout=None)
811

@@ -36,6 +39,39 @@ def get_instance():
3639
SupabaseInterface._instance = SupabaseInterface()
3740
return SupabaseInterface._instance
3841

42+
43+
def get_postgres_connection():
44+
45+
# Database configuration
46+
DB_HOST =os.getenv('POSTGRES_DB_HOST')
47+
DB_NAME =os.getenv('POSTGRES_DB_NAME')
48+
DB_USER =os.getenv('POSTGRES_DB_USER')
49+
DB_PASS =os.getenv('POSTGRES_DB_PASS')
50+
conn = psycopg2.connect(
51+
host=DB_HOST,
52+
database=DB_NAME,
53+
user=DB_USER,
54+
password=DB_PASS
55+
)
56+
return conn
57+
58+
def postgres_query(query,params=None):
59+
conn = SupabaseInterface.get_postgres_connection()
60+
61+
cursor = conn.cursor(cursor_factory=RealDictCursor)
62+
63+
# cursor = conn.cursor()
64+
if not params:
65+
cursor.execute(query)
66+
else:
67+
cursor.execute(query,params)
68+
69+
rows = cursor.fetchall()
70+
results_as_dicts = [dict(row) for row in rows]
71+
72+
cursor.close()
73+
conn.close()
74+
return results_as_dicts
3975

4076
def readAll(self, table):
4177
data = self.client.table(f"{table}").select("*").execute()

query.py

+78
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
from db import SupabaseInterface
2+
3+
class PostgresQuery:
4+
5+
def get_issue_query():
6+
query = """
7+
SELECT
8+
dmp_orgs.id AS org_id,
9+
dmp_orgs.name AS org_name,
10+
json_agg(
11+
json_build_object(
12+
'id', dmp_issues.id,
13+
'name', dmp_issues.title
14+
)
15+
) AS issues
16+
FROM
17+
dmp_orgs
18+
LEFT JOIN
19+
dmp_issues
20+
ON
21+
dmp_orgs.id = dmp_issues.org_id
22+
GROUP BY
23+
dmp_orgs.id
24+
ORDER BY
25+
dmp_orgs.id;
26+
"""
27+
28+
data = SupabaseInterface.postgres_query(query)
29+
return data
30+
31+
def get_issue_owner(name):
32+
query = """
33+
SELECT name, description
34+
FROM dmp_orgs
35+
WHERE name = %s;
36+
"""
37+
data = SupabaseInterface.postgres_query(query,(name,))
38+
return data
39+
40+
def get_actual_owner_query(owner):
41+
query = """
42+
SELECT id, name, repo_owner
43+
FROM dmp_orgs
44+
WHERE name LIKE %s;
45+
"""
46+
47+
data = SupabaseInterface.postgres_query(query,(f'%{owner}%',))
48+
return data
49+
50+
51+
def get_dmp_issues(issue_id):
52+
53+
query = """
54+
SELECT * FROM dmp_issues
55+
WHERE id = %s;
56+
"""
57+
data = SupabaseInterface.postgres_query(query,(issue_id,))
58+
return data
59+
60+
def get_dmp_issue_updates(dmp_issue_id):
61+
62+
query = """
63+
SELECT * FROM dmp_issue_updates
64+
WHERE dmp_id = %s;
65+
"""
66+
data = SupabaseInterface.postgres_query(query,(dmp_issue_id,))
67+
return data
68+
69+
70+
def get_pr_data(dmp_issue_id):
71+
72+
query = """
73+
SELECT * FROM dmp_pr_updates
74+
WHERE dmp_id = %s;
75+
"""
76+
data = SupabaseInterface.postgres_query(query,(dmp_issue_id,))
77+
return data
78+

requirements.txt

+4-1
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,7 @@ gunicorn==22.0.0
66
flasgger==0.9.7.1
77
markdown2==2.4.13
88
requests==2.32.2
9-
flask-cors==4.0.1
9+
flask-cors==4.0.1
10+
Flask-SQLAlchemy==3.1.1
11+
postgrest==0.16.4
12+
psycopg2-binary==2.9.9

utils.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,7 @@ def determine_week(input_date_str, start_date_str='2024-06-11'):
250250
try:
251251
# Convert the start date string to a datetime object
252252
start_date = datetime.strptime(start_date_str, '%Y-%m-%d')
253-
input_date = parser.parse(input_date_str).replace(tzinfo=None)
253+
input_date = parser.parse(input_date_str).replace(tzinfo=None) if type(input_date_str) == str else input_date_str.replace(tzinfo=None)
254254

255255
# Calculate the difference in days
256256
difference_in_days = (input_date - start_date).days

v2_app.py

+14-13
Original file line numberDiff line numberDiff line change
@@ -5,39 +5,39 @@
55
from db import SupabaseInterface
66
from utils import determine_week
77
from v2_utils import calculate_overall_progress, define_link_data, week_data_formatter
8+
from query import PostgresQuery
9+
810

911
v2 = Blueprint('v2', __name__)
1012

1113

1214
@v2.route('/issues/<owner>/<issue>', methods=['GET'])
1315
@require_secret_key
1416
def get_issues_by_owner_id_v2(owner, issue):
17+
1518
try:
16-
SUPABASE_DB = SupabaseInterface().get_instance()
1719
# Fetch issue updates based on owner and issue number
1820

1921
url = f"https://github.com/{owner}"
2022

21-
# import pdb;pdb.set_trace()
22-
actual_owner = SUPABASE_DB.client.table('dmp_orgs').select('id','name','repo_owner').like('name',owner).execute().data
23+
actual_owner = PostgresQuery.get_actual_owner_query(owner)
2324
repo_owner =actual_owner[0]['repo_owner'] if actual_owner else ""
2425
#create url with repo owner
2526
url = f"https://github.com/{repo_owner}" if repo_owner else None
2627

27-
28-
dmp_issue_id = SUPABASE_DB.client.table('dmp_issues').select('*').eq('id', issue).execute()
29-
if not dmp_issue_id.data:
28+
dmp_issue_id = PostgresQuery.get_dmp_issues(issue)
29+
if not dmp_issue_id:
3030
print(f"url....{url}....{issue}")
3131
return jsonify({'error': "No data found in dmp_issue"}), 500
3232

33-
dmp_issue_id = dmp_issue_id.data[0]
34-
response = SUPABASE_DB.client.table('dmp_issue_updates').select('*').eq('dmp_id', dmp_issue_id['id']).execute()
33+
dmp_issue_id = dmp_issue_id[0]
3534

36-
if not response.data:
35+
response = PostgresQuery.get_dmp_issue_updates(dmp_issue_id['id'])
36+
if not response:
3737
print(f"dmp_issue_id....{response}....{dmp_issue_id}")
3838
return jsonify({'error': "No data found in dmp_issue_updates"}), 500
3939

40-
data = response.data
40+
data = response
4141

4242
final_data = []
4343
w_learn_url,w_goal_url,avg,cont_details,plain_text_body,plain_text_wurl = None,None,None,None,None,None
@@ -84,10 +84,11 @@ def get_issues_by_owner_id_v2(owner, issue):
8484
"weekly_learnings":week_data_formatter(plain_text_wurl,"Learnings")
8585
}
8686

87-
pr_Data = SUPABASE_DB.client.table('dmp_pr_updates').select('*').eq('dmp_id', dmp_issue_id['id']).execute()
87+
88+
pr_Data = PostgresQuery.get_pr_data(dmp_issue_id['id'])
8889
transformed = {"pr_details": []}
89-
if pr_Data.data:
90-
for pr in pr_Data.data:
90+
if pr_Data:
91+
for pr in pr_Data:
9192
pr_status = pr.get("status", "")
9293
if pr_status == "closed" and pr.get("merged_at"):
9394
pr_status = "merged"

0 commit comments

Comments
 (0)