打开官网一个大大的醒目标题The foundation for your next high-performance database.很有意思 翻译为 你的下一个高性能数据库的基石。
那让我们来看看为什么这么说吧。

背景

apache-calcite是一个动态数据管理框架。它有许多典型数据库管理系统的部分,但是没有数据存储、处理数据的算法和元数据存储的存储库。
apache-calcite不参数数据的存储和处理,它相当于应用程序、数据存储位置、数据处理引擎之间的一个中介。
我们来看下一个简单的例子:

public static class HrSchema {
  public final Employee[] emps = 0;
  public final Department[] depts = 0;
}
Class.forName("org.apache.calcite.jdbc.Driver");
Properties info = new Properties();
info.setProperty("lex", "JAVA");
Connection connection =
    DriverManager.getConnection("jdbc:calcite:", info);
CalciteConnection calciteConnection =
    connection.unwrap(CalciteConnection.class);
SchemaPlus rootSchema = calciteConnection.getRootSchema();
Schema schema = ReflectiveSchema.create(calciteConnection,
    rootSchema, "hr", new HrSchema());
rootSchema.add("hr", schema);
Statement statement = calciteConnection.createStatement();
ResultSet resultSet = statement.executeQuery(
    "select d.deptno, min(e.empid)\n"
    + "from hr.emps as e\n"
    + "join hr.depts as d\n"
    + "  on e.deptno = d.deptno\n"
    + "group by d.deptno\n"
    + "having count(*) > 1");
print(resultSet);
resultSet.close();
statement.close();
connection.close();

数据库在哪里?对不起,没有数据库。在ReflectiveSchema.create注册一个java对象 并将empsdepts成员变量注册成表之前,连接一直是空的。

calcite不想存储数据,甚至更不喜欢定义数据格式。上面的例子中使用内存存储数据,并使用linq4j库的group byjoin等操作符处理它们。但是方解石也可以处理其他数据格式的数据,比如JDBC。在第一个示例中,将

Schema schema = ReflectiveSchema.create(calciteConnection,
    rootSchema, "hr", new HrSchema());

替换成

Class.forName("com.mysql.jdbc.Driver");
BasicDataSource dataSource = new BasicDataSource();
dataSource.setUrl("jdbc:mysql://localhost");
dataSource.setUsername("username");
dataSource.setPassword("password");
Schema schema = JdbcSchema.create(rootSchema, "hr", dataSource,
    null, "name");

同样calcite在JDBC上也可以执行相同的查询。对于应用程序来说,数据和API是相同的,但是在幕后实现却不相同。
Calcite使用优化器规则将JOIN和GROUP BY操作推送到源数据库。
内存和JDBC只是两个常见的例子。calcite可以处理任何数据源和数据格式。要添加数据源,您需要编写一个适配器,该适配器告诉Calcite在数据源中有哪些table。
对于更高级的集成,可以编写优化器规则。优化器规则允许calcite访问新格式的数据,允许您注册新的操作符(例如更好的join算法),并允许calcite优化将查询转换为操作符的方式。calcite将结合您的规则和操作符与内置的规则和操作符,应用基于成本的优化,并生成一个有效的计划。

编写一个适配器

example/csv下的子项目提供了一个csv适配器,它在应用程序中具有完全的功能,但是如果您正在编写自己的适配器,它也足够简单,可以作为一个很好的模板。

calcite完成以下功能

  • Query parser, validator and optimizer(查询解析器、验证器和优化器)
  • Support for reading models in JSON format(支持以JSON格式读取模型)
  • Many standard functions and aggregate functions(许多标准函数和聚合函数)
  • JDBC queries against Linq4j and JDBC back-ends(针对Linq4j和JDBC后端的JDBC查询)
  • Linq4j front-end
  • SQL特性:SELECT, FROM(包括JOIN语法),WHERE, GROUP BY(包括分组集),aggregate functions(包括COUNT(DISTINCT…)和FILTER), have, ORDER BY(包括null FIRST/LAST), set operations (UNION, INTERSECT, MINUS),子查询(包括相关子查询),windowed aggregate, LIMIT(语法为Postgres);更多细节见SQL引用
  • 本地和远程JDBC驱动程序;看到Avatica
  • 几个适配器