From e81e25c4e0a43fb7f87d712ec819c8f691f3466b Mon Sep 17 00:00:00 2001 From: siddigz <80242309+Siddigz@users.noreply.github.com> Date: Wed, 17 Sep 2025 09:50:03 -0400 Subject: [PATCH 1/3] fixed parser --- __pycache__/app.cpython-313.pyc | Bin 0 -> 23961 bytes app.py | 17 +++++++++-------- input.txt | 20 +++++++++++--------- output.txt | 4 +++- 4 files changed, 23 insertions(+), 18 deletions(-) create mode 100644 __pycache__/app.cpython-313.pyc diff --git a/__pycache__/app.cpython-313.pyc b/__pycache__/app.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f30f06defcd11b5af12f869465f05e4cf914e78d GIT binary patch literal 23961 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 literal 0 HcmV?d00001 diff --git a/app.py b/app.py index b98ba18..bbf1a2f 100644 --- a/app.py +++ b/app.py @@ -8,9 +8,10 @@ def __init__(self, name, attr, tuples): self.attrIndex = {attr:i for i, attr in enumerate(attr)} def __str__(self): - result = f"{self.name} = {{ {', '.join(self.attr)}\n" + result = f"{self.name} = {{{', '.join(self.attr)}}}\n" for row in self.tuples: - result += f" {', '.join(str(val) for val in row)}\n" + value = [f'"{val}"' for val in row] + result += f" {', '.join(value)}\n" result += "}" return result @@ -46,7 +47,7 @@ def selection(self, relName, condition): if(self._evaluate_condition(row, relation, condition)): result.append(row) - return Relation(f"select_{condition.replace(" ", "_")}({relName})", relation.get_attrs(), result) + return Relation(relName, relation.attr, result) def projection(self, relName, attributes): relation = self.get_relation(relName) @@ -77,9 +78,9 @@ def intersection(self, rel1Name, rel2Name): if(tuple(row) in rel2_set): commons.append(row) - return Relation(f"{rel1Name}_intersection_{rel2Name}", rel1.get_attrs(), commons) + return Relation(f"{rel1Name}_intersection_{rel2Name}", rel1.attr, commons) - def join(self, rel1Name, rel2Name): + def join(self, rel1Name, rel2Name, condition = None): rel1 = self.get_relation(rel1Name) rel2 = self.get_relation(rel2Name) commons = set(rel1.attr) & set(rel2.attr) @@ -113,7 +114,7 @@ def union(self, rel1Name, rel2Name): rel2 = self.get_relation(rel2Name) if(rel1.attr != rel2.attr): - return ValueError("Relations must have the same attributes to do a union operations.") + raise ValueError("Relations must have the same attributes to do a union operations.") allPairs = rel1.tuples + rel2.tuples uniquePairs = [] @@ -124,7 +125,7 @@ def union(self, rel1Name, rel2Name): seen.add(key) uniquePairs.append(row) - return Relation(f"{rel1Name}_union_{rel2Name}", rel1.get_attrs(), uniquePairs) + return Relation(f"{rel1Name}_union_{rel2Name}", rel1.attr, uniquePairs) def difference(self, rel1Name, rel2Name): rel1 = self.get_relation(rel1Name) @@ -139,7 +140,7 @@ def difference(self, rel1Name, rel2Name): if(tuple(row) not in rel2_set): diff.append(row) - return Relation(f"{rel1Name}_difference_{rel2Name}", rel1.get_attrs(), diff) + return Relation(f"{rel1Name}_difference_{rel2Name}", rel1.attr, diff) def _evaluate_condition(self, row, relation: Relation, condition): condition = condition.strip() diff --git a/input.txt b/input.txt index c2b90d5..21bd4e3 100644 --- a/input.txt +++ b/input.txt @@ -1,11 +1,13 @@ -// Test the specification requirement: πName(σAge > 30(Employees)) -Employees (EID, Name, Age, Department) = { - E1, John, 32, IT - E2, Alice, 28, HR - E3, Bob, 29, IT - E4, Carol, 35, Finance +Employees (EID, Name, Age) = { + E1, John, 32 + E2, Alice, 28 + E3, Bob, 29 } -// This should be equivalent to the specification example: -// πName(σAge > 30(Employees)) = project Name (select Age > 30 (Employees)) -Query: project Name (select Age > 30 (Employees)) \ No newline at end of file +Students (SID, Name, Age, GPA) = { + 101111111, Siddig, 100, 12.0 + 101222222, Ahmed, 50, 11.0 + 101333333, Khalid, 25, 10.0 +} + +Query: select Age < 30 (Students) \ No newline at end of file diff --git a/output.txt b/output.txt index 4f8cc24..629fe2b 100644 --- a/output.txt +++ b/output.txt @@ -1,2 +1,4 @@ -Error running query 'project Name (select Age > 30 (Employees))': 'function' object has no attribute 'attrIndex'. +Students = {SID, Name, Age, GPA} + "101333333", "Khalid", "25", "10.0" +} From 76017dca19a41e3244ce3997a88305c1c0e98353 Mon Sep 17 00:00:00 2001 From: siddigz <80242309+Siddigz@users.noreply.github.com> Date: Wed, 17 Sep 2025 10:43:42 -0400 Subject: [PATCH 2/3] Checkpoint from VS Code for coding agent session --- app.py | 35 ++++++++++++++++++++++++++++++++++- input.txt | 23 ++++++++++++++++++++++- output.txt | 23 ++++++++++++++++++++--- 3 files changed, 76 insertions(+), 5 deletions(-) diff --git a/app.py b/app.py index bbf1a2f..9758d74 100644 --- a/app.py +++ b/app.py @@ -12,8 +12,25 @@ def __str__(self): for row in self.tuples: value = [f'"{val}"' for val in row] result += f" {', '.join(value)}\n" - result += "}" + # result += "}" return result + # result = f"{self.name} = {{{', '.join(self.attr)}}}\n" + # for row in self.tuples: + # value = [] + # for val in row: + # # Try to print as number if possible + # try: + # float_val = float(val) + # # If it's an integer, print as int + # if float_val.is_integer(): + # value.append(str(int(float_val))) + # else: + # value.append(str(float_val)) + # except ValueError: + # value.append(f'"{val}"') + # result += f" {', '.join(value)}\n" + # result += "}" + # return result def get_attr_val(self, row, attr): if(attr in self.attrIndex): @@ -64,6 +81,12 @@ def projection(self, relName, attributes): result.append(new) return Relation(f"project_{','.join(attributes)}({relName})", attributes, result) + + # base_name = relation.name + # if base_name.startswith("temp_") and hasattr(relation, "source_name"): + # base_name = relation.source_name + # return Relation(f"project_{','.join(attributes)}({base_name})", attributes, result) + def intersection(self, rel1Name, rel2Name): rel1 = self.get_relation(rel1Name) @@ -271,6 +294,11 @@ def _parse_and_run(cpu: Processor, query): if(rORq.startswith("(") or any(op in rORq for op in ops)): nestedResult = _parse_and_run(cpu, rORq) temp = f"temp_{len(cpu.relations)}" + # temp = f"temp_{len(cpu.relations)}" + # rel = Relation(temp, nestedResult.attr, nestedResult.tuples) + # rel.source_name = nestedResult.name if hasattr(nestedResult, "name") else temp + # cpu.add_relation(rel) + # temp = f"{len(cpu.relations)}" cpu.add_relation(Relation(temp, nestedResult.attr, nestedResult.tuples)) result = cpu.selection(temp, condition) del cpu.relations[temp] @@ -286,6 +314,11 @@ def _parse_and_run(cpu: Processor, query): if(rORq.startswith("(") or any(op in rORq for op in ops)): nestedResult = _parse_and_run(cpu, rORq) temp = f"temp_{len(cpu.relations)}" + # temp = f"temp_{len(cpu.relations)}" + # rel = Relation(temp, nestedResult.attr, nestedResult.tuples) + # rel.source_name = nestedResult.name if hasattr(nestedResult, "name") else temp + # cpu.add_relation(rel) + # temp = f"{len(cpu.relations)}" cpu.add_relation(Relation(temp, nestedResult.attr, nestedResult.tuples)) result = cpu.projection(temp, attrs) del cpu.relations[temp] diff --git a/input.txt b/input.txt index 21bd4e3..902a6f2 100644 --- a/input.txt +++ b/input.txt @@ -4,10 +4,31 @@ Employees (EID, Name, Age) = { E3, Bob, 29 } +// Table with employees of ages about 30 +Query: select Age > 30 (Employees) + + + +Employees (EID, Name, Age, Department) = { + E1, John, 32, IT + E2, Alice, 28, HR + E3, Bob, 29, IT + E4, Carol, 35, Finance +} + +// Table with the departments only +Query: project Department (Employees) + + + Students (SID, Name, Age, GPA) = { 101111111, Siddig, 100, 12.0 101222222, Ahmed, 50, 11.0 101333333, Khalid, 25, 10.0 } -Query: select Age < 30 (Students) \ No newline at end of file +// Displays student id and names of students aged 50 +Query: project SID, Name (select Age = 50 (Students)) + +// Names of students with GPA > 10.5 +Query: project Name (select GPA > 10.5 (Students)) \ No newline at end of file diff --git a/output.txt b/output.txt index 629fe2b..524a3d7 100644 --- a/output.txt +++ b/output.txt @@ -1,4 +1,21 @@ -Students = {SID, Name, Age, GPA} - "101333333", "Khalid", "25", "10.0" -} +Employees = {EID, Name, Age, Department} + "E1", "John", "32", "IT" + "E4", "Carol", "35", "Finance" + + +project_Department(Employees) = {Department} + "IT" + "HR" + "IT" + "Finance" + + +project_SID,Name(temp_2) = {SID, Name} + "101222222", "Ahmed" + + +project_Name(temp_2) = {Name} + "Siddig" + "Ahmed" + From 01be6837fb1f5bc5447380b1aeee9d3e3d475e21 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 17 Sep 2025 14:43:48 +0000 Subject: [PATCH 3/3] Initial plan