| // Licensed to the Apache Software Foundation (ASF) under one | |
| // or more contributor license agreements. See the NOTICE file | |
| // distributed with this work for additional information | |
| // regarding copyright ownership. The ASF licenses this file | |
| // to you under the Apache License, Version 2.0 (the | |
| // "License"); you may not use this file except in compliance | |
| // with the License. You may obtain a copy of the License at | |
| // | |
| // http://www.apache.org/licenses/LICENSE-2.0 | |
| // | |
| // Unless required by applicable law or agreed to in writing, | |
| // software distributed under the License is distributed on an | |
| // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |
| // KIND, either express or implied. See the License for the | |
| // specific language governing permissions and limitations | |
| // under the License. | |
| use crate::{TableDef, primary_key}; | |
| use arrow::datatypes::{DataType, Field, Schema}; | |
| use datafusion_common::Constraints; | |
| /// Schemas for the TPCH tables | |
| pub fn tpch_schemas() -> Vec<TableDef> { | |
| let lineitem_schema = Schema::new(vec![ | |
| Field::new("l_orderkey", DataType::Int64, false), | |
| Field::new("l_partkey", DataType::Int64, false), | |
| Field::new("l_suppkey", DataType::Int64, false), | |
| Field::new("l_linenumber", DataType::Int32, false), | |
| Field::new("l_quantity", DataType::Decimal128(15, 2), false), | |
| Field::new("l_extendedprice", DataType::Decimal128(15, 2), false), | |
| Field::new("l_discount", DataType::Decimal128(15, 2), false), | |
| Field::new("l_tax", DataType::Decimal128(15, 2), false), | |
| Field::new("l_returnflag", DataType::Utf8, false), | |
| Field::new("l_linestatus", DataType::Utf8, false), | |
| Field::new("l_shipdate", DataType::Date32, false), | |
| Field::new("l_commitdate", DataType::Date32, false), | |
| Field::new("l_receiptdate", DataType::Date32, false), | |
| Field::new("l_shipinstruct", DataType::Utf8, false), | |
| Field::new("l_shipmode", DataType::Utf8, false), | |
| Field::new("l_comment", DataType::Utf8, false), | |
| ]); | |
| let orders_schema = Schema::new(vec![ | |
| Field::new("o_orderkey", DataType::Int64, false), | |
| Field::new("o_custkey", DataType::Int64, false), | |
| Field::new("o_orderstatus", DataType::Utf8, false), | |
| Field::new("o_totalprice", DataType::Decimal128(15, 2), false), | |
| Field::new("o_orderdate", DataType::Date32, false), | |
| Field::new("o_orderpriority", DataType::Utf8, false), | |
| Field::new("o_clerk", DataType::Utf8, false), | |
| Field::new("o_shippriority", DataType::Int32, false), | |
| Field::new("o_comment", DataType::Utf8, false), | |
| ]); | |
| let part_schema = Schema::new(vec![ | |
| Field::new("p_partkey", DataType::Int64, false), | |
| Field::new("p_name", DataType::Utf8, false), | |
| Field::new("p_mfgr", DataType::Utf8, false), | |
| Field::new("p_brand", DataType::Utf8, false), | |
| Field::new("p_type", DataType::Utf8, false), | |
| Field::new("p_size", DataType::Int32, false), | |
| Field::new("p_container", DataType::Utf8, false), | |
| Field::new("p_retailprice", DataType::Decimal128(15, 2), false), | |
| Field::new("p_comment", DataType::Utf8, false), | |
| ]); | |
| let supplier_schema = Schema::new(vec![ | |
| Field::new("s_suppkey", DataType::Int64, false), | |
| Field::new("s_name", DataType::Utf8, false), | |
| Field::new("s_address", DataType::Utf8, false), | |
| Field::new("s_nationkey", DataType::Int64, false), | |
| Field::new("s_phone", DataType::Utf8, false), | |
| Field::new("s_acctbal", DataType::Decimal128(15, 2), false), | |
| Field::new("s_comment", DataType::Utf8, false), | |
| ]); | |
| let partsupp_schema = Schema::new(vec![ | |
| Field::new("ps_partkey", DataType::Int64, false), | |
| Field::new("ps_suppkey", DataType::Int64, false), | |
| Field::new("ps_availqty", DataType::Int32, false), | |
| Field::new("ps_supplycost", DataType::Decimal128(15, 2), false), | |
| Field::new("ps_comment", DataType::Utf8, false), | |
| ]); | |
| let customer_schema = Schema::new(vec![ | |
| Field::new("c_custkey", DataType::Int64, false), | |
| Field::new("c_name", DataType::Utf8, false), | |
| Field::new("c_address", DataType::Utf8, false), | |
| Field::new("c_nationkey", DataType::Int64, false), | |
| Field::new("c_phone", DataType::Utf8, false), | |
| Field::new("c_acctbal", DataType::Decimal128(15, 2), false), | |
| Field::new("c_mktsegment", DataType::Utf8, false), | |
| Field::new("c_comment", DataType::Utf8, false), | |
| ]); | |
| let nation_schema = Schema::new(vec![ | |
| Field::new("n_nationkey", DataType::Int64, false), | |
| Field::new("n_name", DataType::Utf8, false), | |
| Field::new("n_regionkey", DataType::Int64, false), | |
| Field::new("n_comment", DataType::Utf8, false), | |
| ]); | |
| let region_schema = Schema::new(vec![ | |
| Field::new("r_regionkey", DataType::Int64, false), | |
| Field::new("r_name", DataType::Utf8, false), | |
| Field::new("r_comment", DataType::Utf8, false), | |
| ]); | |
| let def = |name, schema: Schema| { | |
| let constraints = tpch_constraints(name, &schema); | |
| TableDef::new(name, schema).with_constraints(constraints) | |
| }; | |
| vec![ | |
| def("lineitem", lineitem_schema), | |
| def("orders", orders_schema), | |
| def("part", part_schema), | |
| def("supplier", supplier_schema), | |
| def("partsupp", partsupp_schema), | |
| def("customer", customer_schema), | |
| def("nation", nation_schema), | |
| def("region", region_schema), | |
| ] | |
| } | |
| /// Primary-key columns for each TPC-H table. | |
| static TPCH_PRIMARY_KEYS: &[(&str, &[&str])] = &[ | |
| ("region", &["r_regionkey"]), | |
| ("nation", &["n_nationkey"]), | |
| ("part", &["p_partkey"]), | |
| ("supplier", &["s_suppkey"]), | |
| ("partsupp", &["ps_partkey", "ps_suppkey"]), | |
| ("customer", &["c_custkey"]), | |
| ("orders", &["o_orderkey"]), | |
| ("lineitem", &["l_orderkey", "l_linenumber"]), | |
| ]; | |
| fn tpch_constraints(table: &str, schema: &Schema) -> Constraints { | |
| let columns = TPCH_PRIMARY_KEYS | |
| .iter() | |
| .find(|(name, _)| *name == table) | |
| .map(|(_, columns)| *columns) | |
| .unwrap_or_else(|| unimplemented!("unknown TPC-H table: {table}")); | |
| Constraints::new_unverified(vec![primary_key(schema, columns)]) | |
| } |