-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathengine.py
More file actions
101 lines (78 loc) · 2.61 KB
/
engine.py
File metadata and controls
101 lines (78 loc) · 2.61 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
import csv
from parser import parse_query
def evaluate_condition(row, condition):
"""
Supports:
column=value
column>value
column<value
column>=value (NEW)
column<=value (NEW)
AND / OR logic
"""
if " AND " in condition:
parts = condition.split(" AND ")
return all(evaluate_condition(row, part) for part in parts)
if " OR " in condition:
parts = condition.split(" OR ")
return any(evaluate_condition(row, part) for part in parts)
# NEW: Handle >= operator
if ">=" in condition:
col, val = condition.split(">=")
return float(row[col.strip()]) >= float(val.strip())
# NEW: Handle <= operator
if "<=" in condition:
col, val = condition.split("<=")
return float(row[col.strip()]) <= float(val.strip())
if "=" in condition:
col, val = condition.split("=")
# Check if it's numeric comparison
try:
return float(row[col.strip()]) == float(val.strip())
except ValueError:
return row[col.strip()] == val.strip()
if ">" in condition:
col, val = condition.split(">")
return float(row[col.strip()]) > float(val.strip())
if "<" in condition:
col, val = condition.split("<")
return float(row[col.strip()]) < float(val.strip())
return False
def execute_query(query):
parsed = parse_query(query)
table_file = parsed["table"] + ".csv"
results = []
with open(table_file, newline="") as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
if parsed["where"]:
if evaluate_condition(row, parsed["where"]):
results.append(row)
else:
results.append(row)
# SELECT specific columns
if parsed["columns"] != "*":
results = [
{col: row[col] for col in parsed["columns"]}
for row in results
]
# ORDER BY
if parsed["order_by"]:
reverse = parsed["order_dir"] and parsed["order_dir"].upper() == "DESC"
results.sort(key=lambda x: x[parsed["order_by"]], reverse=reverse)
# LIMIT
if parsed["limit"]:
results = results[:parsed["limit"]]
return results
if __name__ == "__main__":
print("Advanced Mini SQL Engine")
print("Example:")
print("SELECT name,age FROM data WHERE age>=25 AND age<=30 ORDER BY age DESC LIMIT 2")
query = input("Enter query: ")
try:
results = execute_query(query)
print("\nResults:")
for row in results:
print(row)
except Exception as e:
print("Error:", e)