1use crate::error::Result;
2
3#[derive(Clone, Debug)]
4pub struct TableRef {
5 pub schema: Option<String>,
6 pub name: String,
7}
8
9#[derive(Clone, PartialEq, Eq, Debug)]
10pub enum LogicalType {
11 Int,
12 Decimal { scale: u8 },
13 Timestamp { precision: u8 },
14 String,
15 Boolean,
16 Binary,
17}
18
19#[derive(Clone, Debug)]
20pub struct ColumnSchema {
21 pub name: String,
22 pub ty: LogicalType,
23 pub nullable: bool,
24 pub default_value: Option<String>,
25 pub primary_key: bool,
26}
27
28#[derive(Debug)]
29pub struct TableSchema {
30 pub columns: Vec<ColumnSchema>,
31}
32
33#[derive(Clone, Debug)]
34pub struct ComparePlan {
35 pub key: ColumnSchema,
36 pub columns: Vec<ColumnSchema>,
37} #[derive(Debug)]
40pub enum KeyValue {
41 Int(i128),
42 Bytes(Vec<u8>),
43} #[allow(dead_code)]
49pub struct Segment {
50 lo: KeyValue,
51 hi: KeyValue,
52} #[allow(dead_code)]
55pub struct Checksum {
56 half1: u64,
57 half2: u64,
58 count: u64,
59} #[derive(Debug)]
62pub enum DiffOp {
63 Left,
64 Right,
65 Differ,
66} #[allow(dead_code)]
69pub struct DiffRow {
70 op: DiffOp,
71 key: KeyValue,
72 columns: Vec<Option<String>>,
73}
74
75#[derive(Debug)]
76pub struct JoinDiffQuery {
77 pub left_only: String,
78 pub right_only: String,
79 pub differing: String,
80}
81
82pub trait Engine {
83 fn name(&self) -> &str;
84 fn introspect(&self, table: &TableRef) -> Result<TableSchema>;
85 fn dialect(&self) -> &dyn Dialect;
86 fn execute(&self, sql: &str) -> Result<Vec<Vec<String>>>;
87}
88
89pub trait Dialect {
90 fn whole_table_checksum_sql(&self, table: &TableRef, plan: &ComparePlan) -> Result<String>;
92
93 fn joindiff_sql(&self, a: &TableRef, b: &TableRef, plan: &ComparePlan) -> Result<JoinDiffQuery>;
95
96 fn materialize_sql(
100 &self,
101 a: &TableRef,
102 b: &TableRef,
103 plan: &ComparePlan,
104 target: &TableRef,
105 ) -> Result<String>;
106
107 fn normalize_column(&self, col: &ColumnSchema) -> Result<String>;
109
110 fn digest_expr(&self, canon_cols: &[String]) -> Result<String>;
112
113 fn keyspace_bounds_sql(&self, table: &TableRef, key: &ColumnSchema) -> Result<String>;
115
116 fn segment_checksum_sql(
118 &self,
119 table: &TableRef,
120 plan: &ComparePlan,
121 segment: &Segment,
122 ) -> Result<String>;
123
124 fn segment_rows_sql(&self, table: &TableRef, plan: &ComparePlan) -> Result<String>;
126}