又談SQL-to-SQL翻譯器
這次從一張圖說起,就是下面這幅圖,當(dāng)我畫完他的時(shí)候,我就感覺無比的舒爽。讓整個(gè)執(zhí)行流程,可控,并且可擴(kuò)展。還記得當(dāng)初上學(xué)的時(shí)候,數(shù)學(xué)建模課上,老師為了“求證一張四條腿的椅子,四條腿處在一個(gè)平面上的概率”,寫了滿滿四黑板板書,然后心滿意足的,跟一臉蒙的我們說,“看,多美啊!”。我現(xiàn)在有點(diǎn)理解他當(dāng)時(shí)的狀態(tài)了。
有眼尖的同學(xué),可能已經(jīng)發(fā)現(xiàn)了,沒錯(cuò),這里借鑒了Flink的流程設(shè)計(jì)。
簡單的說,輸入-> 轉(zhuǎn)換 -> 輸出 經(jīng)典的三段論式構(gòu)造。
這里我們把輸入 SourceFunction 和 輸出 SinkFunction 進(jìn)行了抽象,但是并沒有像Flink那樣,輸入輸出集成相同的接口,可以自由轉(zhuǎn)換,從需求上來看,是沒有必要Sql -to- Sql -to- Sql 的必要的。
在轉(zhuǎn)換過程中,我們引用了DSL,來承接前面的SQL解析,以及后續(xù)的SQL生成,于是,自然的將轉(zhuǎn)換分成了2段,即輸入轉(zhuǎn)換(SourceMapper) 和 輸出轉(zhuǎn)換(SinkMapper)
而定義轉(zhuǎn)換與否,以及轉(zhuǎn)換動如何完成,我們可以輕松的通過java自帶的 Function 接口來實(shí)現(xiàn)。
一個(gè)輸入是可以接對接N條輸出的,輸出的方向也完全由實(shí)現(xiàn) SinkFunction 的對象來自實(shí)現(xiàn)。
如果后續(xù),把任務(wù)并行化,Pipline 對外提供高階函數(shù)的話, 畫美不看...
DEMO:
- public static void main(String[] args) throws IOException {
- //輸入
- FileSourceFunction fileSourceFunction = new FileSourceFunction();
- fileSourceFunction.init(new File("fff.txt"));
- //輸出
- PrintlnSinkFunction<PrintStream> printSinkFunction = new PrintlnSinkFunction();
- ListSinkFunction listSinkFunction = new ListSinkFunction();
- ansformPepline tp = new TransformPepline();
- //添加輸入輸出
- .addSource(fileSourceFunction)
- .addSink(printSinkFunction)
- .addSink(listSinkFunction);
- //定制轉(zhuǎn)換動作
- tp.addSourceMapFunction(new Function<String, String>() {
- SqlTransExecManager sqlTransExecManager = new SqlTransExecManager().build();
- @Override
- public String apply(String s) {
- return sqlTransExecManager.doParseAndTransform(s).getTargetSql();
- }
- });
- //執(zhí)行
- tp.execute();
- System.out.println(listSinkFunction.getLists());
- }
本文轉(zhuǎn)載自微信公眾號「麒思妙想」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系麒思妙想公眾號。