fieldlist) {
28 | this.s = s;
29 | this.fieldlist = fieldlist;
30 | }
31 |
32 | public void seekToQueryStart() {
33 | s.seekToQueryStart();
34 | }
35 |
36 | public boolean next() {
37 | return s.next();
38 | }
39 |
40 | public int getInt(String fldname) {
41 | if (hasField(fldname))
42 | return s.getInt(fldname);
43 | else
44 | throw new RuntimeException("field " + fldname + " not found.");
45 | }
46 |
47 | public String getString(String fldname) {
48 | if (hasField(fldname))
49 | return s.getString(fldname);
50 | else
51 | throw new RuntimeException("field " + fldname + " not found.");
52 | }
53 |
54 | public D_Constant getVal(String fldname) {
55 | if (hasField(fldname))
56 | return s.getVal(fldname);
57 | else
58 | throw new RuntimeException("field " + fldname + " not found.");
59 | }
60 |
61 | public boolean hasField(String fldname) {
62 | return fieldlist.contains(fldname);
63 | }
64 |
65 | public void close() {
66 | s.close();
67 | }
68 | }
69 |
--------------------------------------------------------------------------------
/src/main/java/com/arjunsk/tiny_db/server/b_query_engine/impl/basic/b_execution_engine/README.md:
--------------------------------------------------------------------------------
1 | ## Notes
2 |
3 | 1. This will contain Join Scans
4 | 2. External Sorting
5 | 3. Aggregations etc.
--------------------------------------------------------------------------------
/src/main/java/com/arjunsk/tiny_db/server/b_query_engine/impl/calcite/CalciteQueryEngine.java:
--------------------------------------------------------------------------------
1 | package com.arjunsk.tiny_db.server.b_query_engine.impl.calcite;
2 |
3 | import com.arjunsk.tiny_db.server.b_query_engine.impl.calcite.core.B_Table;
4 | import com.arjunsk.tiny_db.server.b_query_engine.impl.calcite.core.C_Schema;
5 | import com.arjunsk.tiny_db.server.b_query_engine.impl.calcite.core.D_JavaSqlTypeToCalciteSqlTypeConversionRules;
6 | import com.arjunsk.tiny_db.server.d_storage_engine.common.file.FileMgr;
7 | import com.arjunsk.tiny_db.server.b_query_engine.IQueryEngine;
8 | import com.arjunsk.tiny_db.server.b_query_engine.common.catalog.MetadataMgr;
9 | import com.arjunsk.tiny_db.server.b_query_engine.common.catalog.table.TablePhysicalLayout;
10 | import com.arjunsk.tiny_db.server.b_query_engine.common.dto.TableDto;
11 | import com.arjunsk.tiny_db.server.d_storage_engine.common.transaction.Transaction;
12 | import java.io.File;
13 | import java.sql.Connection;
14 | import java.sql.DriverManager;
15 | import java.sql.ResultSet;
16 | import java.sql.Statement;
17 | import java.util.ArrayList;
18 | import java.util.Collections;
19 | import java.util.List;
20 | import java.util.Properties;
21 | import java.util.stream.Collectors;
22 | import lombok.SneakyThrows;
23 | import org.apache.calcite.jdbc.CalciteConnection;
24 | import org.apache.calcite.schema.SchemaPlus;
25 | import org.apache.calcite.sql.type.SqlTypeName;
26 |
27 | /**
28 | * QueryEngine Implementation with Calcite Parser and Planner.
29 | *
30 | * NOTE: There is no Optimizer implemented. Also, Since ModifiableTable is not implemented in
31 | * {@link B_Table}, we currently don't support DML operations.
32 | *
33 | * @author Arjun Sunil Kumar
34 | */
35 | public class CalciteQueryEngine implements IQueryEngine {
36 |
37 | public static int BLOCK_SIZE = 512;
38 | FileMgr fm;
39 | MetadataMgr mdm;
40 | Connection connection;
41 |
42 | String tableName = "T1";
43 | String schemaName = "tinydb";
44 |
45 | @SneakyThrows
46 | public CalciteQueryEngine(String dirname) {
47 |
48 | //1. Init MetaDataManager (Catalog)
49 | File dbDirectory = new File(dirname);
50 | fm = new FileMgr(dbDirectory, BLOCK_SIZE);
51 | Transaction tx1 = newTx();
52 | mdm = new MetadataMgr(fm.isNew(), tx1);
53 | tx1.commit();
54 |
55 | // 4.a JDBC similar
56 | Class.forName("org.apache.calcite.jdbc.Driver");
57 | Properties info = new Properties();
58 | info.setProperty("lex", "JAVA");
59 | connection = DriverManager.getConnection("jdbc:calcite:", info);
60 | }
61 |
62 |
63 | /**
64 | * Use the Syntax:
65 | *
66 | * select A,B from tinydb.T1;
67 | *
68 | */
69 | @SneakyThrows
70 | public TableDto doQuery(String sql) {
71 | //2.a Get Table Layout
72 | Transaction tx2 = newTx();
73 | TablePhysicalLayout tableLayout = mdm.getLayout(tableName, tx2);
74 |
75 | // 2.b Create List
76 | D_JavaSqlTypeToCalciteSqlTypeConversionRules dataTypeRules = D_JavaSqlTypeToCalciteSqlTypeConversionRules.instance();
77 | List fieldTypes = tableLayout.schema().fields().stream()
78 | .map(e -> tableLayout.schema().type(e)).map(dataTypeRules::lookup)
79 | .collect(Collectors.toList());
80 |
81 | // 2.c Create CalciteTable Object using fieldNames, fieldTypes etc
82 | B_Table calciteTable = new B_Table(tableName, tableLayout.schema().fields(), fieldTypes, tx2,
83 | mdm);
84 |
85 | // 3. Create Schema for the CalciteTable
86 | C_Schema schema = new C_Schema(Collections.singletonMap(tableName, calciteTable));
87 |
88 | // 4. Add schema to the SQL root schema
89 |
90 | // 4.b Unwrap and add proxy
91 | CalciteConnection calciteConnection = connection.unwrap(CalciteConnection.class);
92 | SchemaPlus rootSchema = calciteConnection.getRootSchema();
93 | rootSchema.add(schemaName, schema);
94 |
95 | // 5. Execute JDBC Query
96 | Statement statement = calciteConnection.createStatement();
97 | ResultSet rs = statement.executeQuery(sql);
98 |
99 | List columnNames = tableLayout.schema().fields();
100 | List> rows = new ArrayList<>();
101 | while (rs.next()) {
102 | List row = new ArrayList<>();
103 | for (String field : columnNames) {
104 | row.add(rs.getString(field));
105 | }
106 | rows.add(row);
107 | }
108 |
109 | rs.close();
110 | statement.close();
111 | tx2.commit();
112 |
113 | return new TableDto(columnNames, rows);
114 | }
115 |
116 | @Override
117 | public TableDto doUpdate(String sql) {
118 | return null;
119 | }
120 |
121 | @SneakyThrows
122 | @Override
123 | public void close() {
124 | connection.close();
125 | }
126 |
127 | private Transaction newTx() {
128 | return new Transaction(fm);
129 | }
130 |
131 | }
132 |
--------------------------------------------------------------------------------
/src/main/java/com/arjunsk/tiny_db/server/b_query_engine/impl/calcite/core/A_Enumerator.java:
--------------------------------------------------------------------------------
1 | package com.arjunsk.tiny_db.server.b_query_engine.impl.calcite.core;
2 |
3 | import com.arjunsk.tiny_db.server.b_query_engine.common.catalog.MetadataMgr;
4 | import com.arjunsk.tiny_db.server.b_query_engine.common.catalog.table.TablePhysicalLayout;
5 | import com.arjunsk.tiny_db.server.d_storage_engine.RWRecordScan;
6 | import com.arjunsk.tiny_db.server.d_storage_engine.common.transaction.Transaction;
7 | import com.arjunsk.tiny_db.server.d_storage_engine.impl.data.heap.HeapRWRecordScan;
8 | import org.apache.calcite.linq4j.Enumerator;
9 |
10 | /**
11 | * Enumerator connects with Catalog and StorageEngine ReadWrite Iterator, to create a calcite
12 | * readable iterator
13 | *
14 | * @author Arjun Sunil Kumar
15 | */
16 | class A_Enumerator implements Enumerator