Skip to content

Commit 6027495

Browse files
committed
Added WHERE clause and Delete Procedure
1 parent 9018355 commit 6027495

File tree

9 files changed

+455
-18
lines changed

9 files changed

+455
-18
lines changed

src/interpreter/CreateTableProc.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public Relation createRelation(CreateStatement stmt) {
3030
System.out.print("Creating table " + stmt.getTableName() + "\n");
3131
Relation relation = schema_manager.createRelation(stmt.getTableName(), schema);
3232

33-
System.out.println("Create Procedure Result \n" + relation);
33+
System.out.println("\n Create Procedure Result \n" + relation);
3434
return relation;
3535
}
3636
}

src/interpreter/DeleteProc.java

Lines changed: 49 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,57 @@
11
package interpreter;
22

3-
import storageManager.Disk;
4-
import storageManager.MainMemory;
5-
import storageManager.SchemaManager;
3+
import parser.DeleteStatement;
4+
import storageManager.*;
5+
6+
import java.util.ArrayList;
7+
import java.util.Iterator;
68

79
public class DeleteProc extends Procedures {
810
public DeleteProc(MainMemory mem, Disk disk, SchemaManager schema_manager) {
911
super(mem, disk, schema_manager);
1012
}
13+
14+
public void deleteTuples(DeleteStatement stmt) {
15+
ArrayList<String> clause = WhereClause.convertToPostFix((ArrayList<String>) stmt.getCondition());
16+
Relation relation = schema_manager.getRelation(stmt.getTableName());
17+
if (relation == null)
18+
throw new RuntimeException(stmt.getTableName()+ " Table does not exists");
19+
20+
int blocksInRel = relation.getNumOfBlocks();
21+
22+
if (clause == null) {
23+
// Delete all Tuples if Table exists
24+
relation.deleteBlocks(0);
25+
} else {
26+
// Delete tuples satisfying the given WHERE clause
27+
int validBlocks = 0;
28+
// Reading blocks from disk in accordance to memory capacity
29+
for (int i=0; i<blocksInRel; i += mem.getMemorySize()) {
30+
relation.getBlocks(i, 0, (blocksInRel - i >= mem.getMemorySize()) ?
31+
mem.getMemorySize() : blocksInRel - i);
32+
33+
ArrayList<Tuple> temp = mem.getTuples(0, (blocksInRel - i >= mem.getMemorySize()) ?
34+
mem.getMemorySize() : blocksInRel - i);
35+
36+
Iterator<Tuple> iter = temp.iterator();
37+
while (iter.hasNext()) {
38+
Tuple tup = iter.next();
39+
if (WhereClause.evaluatePostfix(clause, tup))
40+
iter.remove();
41+
}
42+
43+
// Rearrange to avoid holes
44+
if (!temp.isEmpty()) {
45+
mem.setTuples(0, temp);
46+
// System.out.println("Main Memory \n" + mem);
47+
int numBlocks = (int) Math.ceil((double)temp.size() / temp.get(0).getTuplesPerBlock());
48+
relation.setBlocks(validBlocks, 0, numBlocks);
49+
validBlocks += numBlocks;
50+
}
51+
}
52+
// Delete redundant blocks at the end having indices staring from validBlocks count
53+
relation.deleteBlocks(validBlocks);
54+
}
55+
System.out.println("\n Delete Procedure \n" + relation);
56+
}
1157
}

src/interpreter/DropTableProc.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,11 @@ public DropTableProc(MainMemory mem, Disk disk, SchemaManager schema_manager) {
1313

1414
public void dropRelation(DropStatement stmt) {
1515
Relation relation = schema_manager.getRelation(stmt.getTableName());
16-
relation.deleteBlocks(0);
17-
System.out.println("Drop Procedure \n" + relation);
16+
if (relation == null)
17+
throw new RuntimeException(stmt.getTableName()+ " Table does not exists");
18+
if (relation.getNumOfBlocks() > 0)
19+
relation.deleteBlocks(0);
20+
System.out.println("\n Drop Procedure \n" + relation);
1821
schema_manager.deleteRelation(stmt.getTableName());
1922
}
2023
}

src/interpreter/InsertProc.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public InsertProc(MainMemory mem, Disk disk, SchemaManager schema_manager) {
1212
super(mem, disk, schema_manager);
1313
}
1414

15-
public void insertTuple(InsertStatement stmt) {
15+
public void insertTuples(InsertStatement stmt) {
1616
Relation relation_ref = schema_manager.getRelation(stmt.getTableName());
1717
Tuple tuple = relation_ref.createTuple();
1818
Schema schema = relation_ref.getSchema();
@@ -54,11 +54,11 @@ public void insertTuple(InsertStatement stmt) {
5454
}
5555
}
5656

57-
System.out.println("Insert Procedure Result \n" + relation_ref);
57+
System.out.println("\n Insert Procedure Result \n" + relation_ref);
5858
}
5959

6060
// This method appends new tuple blocks at the end of relation
61-
private void appendTuplesToRelation(Relation relation_ref, ArrayList<Tuple> tuples) {
61+
public void appendTuplesToRelation(Relation relation_ref, ArrayList<Tuple> tuples) {
6262
if (tuples == null || tuples.isEmpty()) {
6363
return;
6464
}
@@ -69,7 +69,7 @@ private void appendTuplesToRelation(Relation relation_ref, ArrayList<Tuple> tupl
6969
ArrayList<Tuple> subList = new ArrayList<Tuple>(tuples.subList(i, endIndex));
7070
mem.setTuples(0, subList);
7171
relation_ref.setBlocks(relation_ref.getNumOfBlocks(),0,
72-
(int)Math.ceil(subList.size()/tuplesPerBlock));
72+
(int)Math.ceil((double)subList.size()/tuplesPerBlock));
7373
}
7474
}
7575

src/interpreter/Main.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ public static void main(String[] args) {
2020
procedure.getSchema_manager());
2121
SelectProc select_proc = new SelectProc(procedure.getMem(), procedure.getDisk(),
2222
procedure.getSchema_manager());
23+
DeleteProc delete_proc = new DeleteProc(procedure.getMem(), procedure.getDisk(),
24+
procedure.getSchema_manager());
2325

2426
ArrayList<Statement> tableList = parser.init();
2527
for(Statement t : tableList)
@@ -29,14 +31,16 @@ public static void main(String[] args) {
2931
create_proc.createRelation((CreateStatement) t);
3032
break;
3133
case INSERT:
32-
insert_proc.insertTuple((InsertStatement) t);
34+
insert_proc.insertTuples((InsertStatement) t);
3335
break;
3436
case DROP:
3537
drop_proc.dropRelation((DropStatement) t);
3638
break;
3739
case SELECT:
3840
select_proc.selectTuples((SelectStatement) t);
3941
break;
42+
case DELETE:
43+
delete_proc.deleteTuples((DeleteStatement) t);
4044
}
4145
}
4246
}catch (Exception ex)

src/interpreter/SelectProc.java

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import storageManager.*;
55

66
import java.util.ArrayList;
7-
import java.util.HashSet;
87
import java.util.LinkedHashSet;
98
import java.util.Set;
109

@@ -15,6 +14,9 @@ public SelectProc(MainMemory mem, Disk disk, SchemaManager schema_manager) {
1514

1615
public ArrayList<Tuple> selectTuples(SelectStatement stmt) {
1716
ArrayList<Tuple> result = new ArrayList<>();
17+
final ArrayList<String> clause = WhereClause.convertToPostFix((ArrayList<String>) stmt.getCondition());
18+
// System.out.println(" WHERE Clause : " + clause);
19+
1820
if (stmt.getTables().size()==1) {
1921
Relation relation = schema_manager.getRelation(stmt.getTables().get(0));
2022
int blocksInRel = relation.getNumOfBlocks();
@@ -25,8 +27,17 @@ public ArrayList<Tuple> selectTuples(SelectStatement stmt) {
2527
relation.getBlocks(i, 0, (blocksInRel - i >= mem.getMemorySize())?
2628
mem.getMemorySize(): blocksInRel - i);
2729

28-
result.addAll(mem.getTuples(0, (blocksInRel - i >= mem.getMemorySize())?
29-
mem.getMemorySize(): blocksInRel - i));
30+
ArrayList<Tuple> temp = mem.getTuples(0, (blocksInRel - i >= mem.getMemorySize()) ?
31+
mem.getMemorySize() : blocksInRel - i);
32+
// WHERE clause check
33+
if (clause == null) {
34+
result.addAll(temp);
35+
} else {
36+
temp.forEach(tuple -> {
37+
if (WhereClause.evaluatePostfix(clause, tuple))
38+
result.add(tuple);
39+
});
40+
}
3041
}
3142
} else {
3243
// Create temporary schema and relation to store Tuple results
@@ -83,10 +94,16 @@ public ArrayList<Tuple> selectTuples(SelectStatement stmt) {
8394
temp_Tuple.setField(s, tuple.getField(s).str);
8495
}
8596
});
86-
// Add this to final list
87-
tempResult.add(temp_Tuple);
97+
// Add this to final list after checking WHERE clause
98+
if (clause == null || WhereClause.evaluatePostfix(clause, tuple))
99+
tempResult.add(temp_Tuple);
100+
88101
});
102+
89103
}
104+
105+
// Delete Temporary Tables
106+
schema_manager.deleteRelation("tempSelect");
90107
}
91108
}
92109

0 commit comments

Comments
 (0)