Skip to content

Commit 767c273

Browse files
committed
FINISHED WHERE
1 parent dec7fb4 commit 767c273

File tree

6 files changed

+284
-44
lines changed

6 files changed

+284
-44
lines changed

ExceptionFramework/src/main/java/edu/upvictoria/poo/Analyzer.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,22 +33,27 @@ public Analyzer(){
3333
keywords.add("FROM");
3434
keywords.add("WHERE");
3535

36+
operators.add("DIV");
3637
operators.add("AND");
3738
operators.add("OR");
39+
operators.add("<=");
40+
operators.add(">=");
3841
operators.add("=");
3942
operators.add("<");
4043
operators.add(">");
41-
operators.add("<=");
42-
operators.add(">=");
4344
operators.add("!=");
4445
operators.add("(");
4546
operators.add(")");
47+
operators.add("*");
48+
operators.add("+");
49+
operators.add("-");
50+
operators.add("/");
51+
operators.add("%");
4652

4753
constraints.add("NOT NULL");
4854
constraints.add("PRIMARY KEY");
4955
constraints.add("FOREIGN KEY");
5056

51-
dataTypes.add("NUMBER");
5257
dataTypes.add("VARCHAR");
5358
dataTypes.add("CHAR");
5459
dataTypes.add("BOOLEAN");

ExceptionFramework/src/main/java/edu/upvictoria/poo/SQL.java

Lines changed: 86 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -368,18 +368,21 @@ public void handleSelect(String line, String keyword, Database database) throws
368368
ArrayList<String> columns = new ArrayList<>();
369369
ArrayList<String> showingCol = new ArrayList<>();
370370
String cleanedLine, selectedColumns, selectedTable, whereLine = null;
371-
ArrayList<String> whereTokens = new ArrayList<>();
371+
ArrayList<String> whereTokens;
372+
ArrayList<ArrayList<Object>> wheredData = new ArrayList<>();
372373
boolean tableExists = false;
373374

374375
try{
375376
cleanedLine = clean(line, keyword);
376377
selectedColumns = cleanedLine.substring(0,cleanedLine.indexOf("FROM")-1).trim();
377378

378379
if(cleanedLine.contains("WHERE")){
379-
selectedTable = cleanedLine.substring(cleanedLine.indexOf("FROM ") + "FROM".length() + 1, cleanedLine.indexOf(" WHERE")).trim();
380+
selectedTable = cleanedLine.substring(cleanedLine.indexOf("FROM ") + "FROM".length() + 1,
381+
cleanedLine.indexOf(" WHERE")).trim();
380382
whereLine = cleanedLine.substring(cleanedLine.indexOf("WHERE") + "WHERE".length() + 1).trim();
381383
} else {
382-
selectedTable = cleanedLine.substring(cleanedLine.indexOf("FROM ") + "FROM".length() + 1).trim();
384+
selectedTable = cleanedLine.substring(cleanedLine.indexOf("FROM ") +
385+
"FROM".length() + 1).trim();
383386
}
384387

385388
if(!selectedColumns.equals("*")){
@@ -399,6 +402,10 @@ public void handleSelect(String line, String keyword, Database database) throws
399402
if(whereLine != null){
400403
whereTokens = getWhereTokens(whereLine,table);
401404
whereTokens = Where.infixToPostfix(whereTokens);
405+
Tree.Node root = Where.createTree(whereTokens);
406+
wheredData = Where.evaluateTree(root, table.getData(), table);
407+
} else {
408+
wheredData = table.getData();
402409
}
403410

404411
if(!selectedColumns.equals("*")){
@@ -414,10 +421,10 @@ public void handleSelect(String line, String keyword, Database database) throws
414421
throw new ColumnDoesNotMatch("COLUMN DOES NOT MATCH");
415422
}
416423

417-
table.printData(showingCol);
424+
table.printData(showingCol, wheredData);
418425

419426
} else {
420-
table.printData();
427+
table.printData(wheredData);
421428
}
422429
break;
423430
}
@@ -430,17 +437,16 @@ public void handleSelect(String line, String keyword, Database database) throws
430437

431438
public ArrayList<String> getWhereTokens(String line, Table table) throws SQLSyntaxException, IndexOutOfBoundsException {
432439
Analyzer analyzer = new Analyzer();
433-
ArrayList<String> operators = analyzer.getOperators();
434440
ArrayList<String> whereTokens = new ArrayList<>();
435441
String value;
436442

437-
ArrayList<String> homunculus = new ArrayList<>(operators);
438-
homunculus.addAll(table.getColumnsName());
439-
boolean foundKeyword;
443+
/*ArrayList<String> homunculus = new ArrayList<>(analyzer.getOperators());
444+
homunculus.addAll(table.getColumnsName());*/
440445

441446
String format1 = "^'.+'";
442447
String format2 = "^\\d*\\s+";
443448
String format3 = "^\\d*$";
449+
444450
Pattern pattern1 = Pattern.compile(format1);
445451
Pattern pattern2 = Pattern.compile(format2);
446452
Pattern pattern3 = Pattern.compile(format3);
@@ -450,50 +456,101 @@ public ArrayList<String> getWhereTokens(String line, Table table) throws SQLSynt
450456
line = line.replaceAll("^=","!=");
451457

452458
try {
453-
for(int i = 0; i < homunculus.size(); i++){
454-
String homunculee = homunculus.get(i);
455-
if(line.startsWith(homunculee)){
456-
whereTokens.add(homunculee);
457-
line = line.substring(line.indexOf(homunculee) + homunculee.length()).trim();
458-
i = -1;
459-
continue;
459+
while(!line.isBlank()){
460+
String initStateLine = line;
461+
for(int i = 0; i < analyzer.getOperators().size(); i++){
462+
String operator = analyzer.getOperators().get(i);
463+
464+
if(line.startsWith(operator)){
465+
if(operator.equals("(") || operator.equals(")") || operator.equals("AND") || operator.equals("OR")){
466+
whereTokens.add(operator);
467+
} else {
468+
String lastToken = whereTokens.get(whereTokens.size()-1);
469+
470+
if(!table.getColumnsName().contains(lastToken.split(" ")[0])){
471+
throw new SQLSyntaxException("UNEXPECTED OPERATOR: " + operator);
472+
}
473+
474+
lastToken += (" " + operator);
475+
whereTokens.set(whereTokens.size()-1, lastToken);
476+
}
477+
478+
line = line.substring(line.indexOf(operator) + operator.length()).trim();
479+
break;
480+
}
481+
}
482+
483+
for(int i = 0; i < table.getColumnsName().size(); i++){
484+
String columnName = table.getColumnsName().get(i);
485+
486+
if(line.startsWith(columnName)){
487+
whereTokens.add(columnName);
488+
line = line.substring(line.indexOf(columnName) + columnName.length()).trim();
489+
break;
490+
}
460491
}
461492

462493
if(line.startsWith("NULL")){
463-
whereTokens.add("\0");
494+
String lastToken = whereTokens.get(whereTokens.size()-1);
495+
496+
if(!table.getColumnsName().contains(lastToken.split(" ")[0])){
497+
throw new SQLSyntaxException("UNEXPECTED OPERATOR: NULL");
498+
}
499+
500+
lastToken += " \0";
501+
whereTokens.set(whereTokens.size()-1, lastToken);
464502
line = line.substring(line.indexOf("NULL") + "NULL".length()).trim();
465-
i = -1;
466-
continue;
467503
}
468504

469505
matcher1 = pattern1.matcher(line);
470506
if(matcher1.find()){
507+
String lastToken = whereTokens.get(whereTokens.size()-1);
508+
509+
if(!table.getColumnsName().contains(lastToken.split(" ")[0])){
510+
throw new SQLSyntaxException("UNEXPECTED OPERATOR: NULL");
511+
}
512+
471513
line = line.substring(1);
472514
value = line.substring(0, line.indexOf("'")).trim();
473-
whereTokens.add(value);
515+
lastToken += (" " + value);
516+
whereTokens.set(whereTokens.size()-1, lastToken);
474517
line = line.substring(line.indexOf(value) + value.length() + 1).trim();
475-
i = -1;
518+
476519
continue;
477520
}
478521

479522
matcher2 = pattern2.matcher(line);
480523
if(matcher2.find()) {
524+
String lastToken = whereTokens.get(whereTokens.size()-1);
525+
526+
if(!table.getColumnsName().contains(lastToken.split(" ")[0])){
527+
throw new SQLSyntaxException("UNEXPECTED OPERATOR: NULL");
528+
}
529+
481530
value = line.substring(0, line.indexOf(" ")).trim();
482-
whereTokens.add(value);
531+
lastToken += (" " + value);
532+
whereTokens.set(whereTokens.size()-1, lastToken);
483533
line = line.substring(line.indexOf(value) + value.length() + 1).trim();
484-
i = -1;
534+
485535
continue;
486536
}
487537

488538
matcher3 = pattern3.matcher(line);
489539
if(matcher3.find()) {
540+
String lastToken = whereTokens.get(whereTokens.size()-1);
541+
542+
if(!table.getColumnsName().contains(lastToken.split(" ")[0])){
543+
throw new SQLSyntaxException("UNEXPECTED OPERATOR: NULL");
544+
}
545+
490546
value = line.trim();
491-
whereTokens.add(value);
492-
break;
547+
lastToken += (" " + value);
548+
whereTokens.set(whereTokens.size()-1, lastToken);
549+
line = line.substring(line.indexOf(value) + value.length()).trim();
493550
}
494551

495-
if(i == homunculus.size() - 1){
496-
throw new SQLSyntaxException("WHERE STATEMENT MALFORMED AT > " + line);
552+
if(initStateLine.equals(line)){
553+
throw new SQLSyntaxException("MALFORMED STATEMENT");
497554
}
498555
}
499556
} catch (SQLSyntaxException e) {
@@ -506,6 +563,6 @@ public ArrayList<String> getWhereTokens(String line, Table table) throws SQLSynt
506563
}
507564
}
508565

509-
// TODO: COMPROBRAR QUE SE INGRESA UN TIPO DE DATO CORRECTO AL CREAR UN REGISTRO
510-
// TODO: COMPROBRAR QUE NO SE ELIGEN DOS COLUMNAS IGUALES A LAS QUE INGRESAR UN REGISTRO
566+
// TODO: COMPROBAR QUE SE INGRESA UN TIPO DE DATO CORRECTO AL CREAR UN REGISTRO
567+
// TODO: COMPROBAR QUE NO SE ELIGEN DOS COLUMNAS IGUALES A LAS QUE INGRESAR UN REGISTRO
511568
// TODO: CREAR EL WHERE

ExceptionFramework/src/main/java/edu/upvictoria/poo/Table.java

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,10 @@ public ArrayList<Column> getColumns() {
8383
return columns;
8484
}
8585

86+
public ArrayList<ArrayList<Object>> getData() {
87+
return data;
88+
}
89+
8690
public void appendDataToTable(ArrayList<String> data, ArrayList<String> columnNames) throws IOException {
8791
ArrayList<Object> newData = new ArrayList<>();
8892

@@ -182,7 +186,7 @@ public void writeDataToFile(ArrayList<String> rowData) throws IOException {
182186
}
183187
}
184188

185-
public void printData(){
189+
public void printData(ArrayList<ArrayList<Object>> data){
186190
for(Column col : columns){
187191
System.out.print("| " + col.getName() + "\t");
188192
}
@@ -200,7 +204,7 @@ public void printData(){
200204
}
201205
}
202206

203-
public void printData(ArrayList<String> columns) {
207+
public void printData(ArrayList<String> columns, ArrayList<ArrayList<Object>> data) {
204208
for(String colName : columns){
205209
System.out.print("| " + colName + "\t");
206210
}
@@ -241,4 +245,16 @@ public ArrayList<String> getColumnsName(){
241245

242246
return columnsName;
243247
}
248+
249+
public int getColumnPos(String columnName){
250+
ArrayList<String> columnsName = getColumnsName();
251+
252+
for(int i = 0; i < columnsName.size(); i++){
253+
if(columnName.equals(columnsName.get(i))){
254+
return i;
255+
}
256+
}
257+
258+
return -1;
259+
}
244260
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package edu.upvictoria.poo;
2+
3+
public class Tree {
4+
Node root;
5+
6+
public static class Node {
7+
String value;
8+
Node left, right;
9+
10+
Node(String data){
11+
value = data;
12+
left = right = null;
13+
}
14+
}
15+
16+
public static Double getDouble(String str) throws NumberFormatException{
17+
return Double.parseDouble(str);
18+
}
19+
20+
public static void printTree(Node node) {
21+
if (node == null) {
22+
return;
23+
}
24+
printTree(node.left);
25+
System.out.print(node.value + " ");
26+
printTree(node.right);
27+
}
28+
}

0 commit comments

Comments
 (0)