方言変換のためのApache Calciteコード

方言変換のためのApache Calciteコード

意味

Calcite は、Sql を SqlNode に解析し、次に SqlNode を特定のデータベースの方言に変換することで、Sql を統一できます。

成し遂げる

Calcite で方言変換を実装するための主なクラスは SqlDialect 基本クラスであり、その特定の変数の意味は次のとおりです。

パブリッククラスSqlDialect {

BUILT_IN_OPERATORS_LIST: サポートされている組み込み関数または演算子 (例: abs など)

// 識別子をリストします。 文字列 identifierQuoteString: 識別子の開始記号 文字列 identifierEndQuoteString: 識別子の終了記号 文字列 identifierEscapedQuote: (これが何をしているのかまだわかりません。文字列内のエスケープ文字のようなものでしょうか?)

// 定数識別子 文字列 literalQuoteString: 定数開始記号 文字列 literalEndQuoteString: 定数終了記号 文字列 literalEscapedQuote: (これが何をしているのかまだわかりません。文字列内のエスケープ文字のようなものでしょうか?)

DatabaseProduct databaseProduct: 所属するデータベース製品NullCollat​​ion nullCollat​​ion: ソートクエリを実行したときに null 値が返される順序RelDataTypeSystem dataTypeSystem: データ型 // 解析に関連Casing unquotedCasing: 大文字と小文字の変換Casing quotedCasing: 大文字と小文字の変換boolean caseSensitive: 大文字と小文字を区別するかどうか (列名が関数名を示す、など)
}
// メソッド領域 (異なるデータ ソースは、異なる詳細に基づいてカスタム レプリケーション メソッドを実装します)
許可する
パーサーを構成する
パーサーを構成する
非ASCII文字を含む
作成する
デフォルトNull方向
空のコンテキスト
クロスジョインの結合タイプをエミュレートする
NullDirectionをエミュレートする
エミュレートNullDirectionWithIsNull
カレンダーポリシーを取得する
キャストスペックを取得する
適合性を取得する
データベース製品を取得する
getNullCollat​​ion
製品を取得
引用符付き大文字小文字の取得
引用を取得
単一行テーブル名の取得
取得タイプシステム
引用符なし大文字小文字の取得
暗黙のテーブルエイリアスを持つ
識別子引用が必要
大文字と小文字を区別する
引用識別子
引用識別子
引用識別子
引用文字列リテラル
引用文字列リテラル
引用文字列リテラルUnicode
引用タイムスタンプリテラル
アイテムからのエイリアスが必要
単一値表現の書き換え
集計関数をサポート
エイリアス値をサポート
CharSet をサポート
データ型をサポート
サポート機能
GroupByWithCube をサポート
GroupByWithRollup をサポート
暗黙の型変換をサポート
ネストされた集約をサポート
OffsetFetch をサポート
ウィンドウ関数をサポート
パース解除呼び出し
日付時刻リテラルの解析
非解析フェッチAnsi
解析解除FetchUsingLimit
解析制限を解除
非解析オフセット
非解析オフセットフェッチ
unparseSqlDatetimeArithmetic
非解析SQL間隔リテラル
非解析SQL間隔修飾子
上位Nを解析解除
引用文字列リテラル

使用方法デモ

/** 「cast(column as type)」の型のSqlNodeを返します。
  * 型名、精度などによりデータベースによって異なります。
  *
  * <p>このメソッドがnullを返す場合、キャストは省略されます。デフォルトでは
  * 実装では、これはNULL型の場合であり、したがって
  * {@code CAST(NULL AS <nulltype>)} は {@code NULL} としてレンダリングされます。 */
  パブリック SqlNode getCastSpec(RelDataType タイプ)

  このメソッドは、特定のデータ ソースのデータ型に応じてデータを変換するために使用できます。次に例を示します。

  @Override パブリック SqlNode getCastSpec(RelDataType タイプ) {
    スイッチ (type.getSqlTypeName()) {
    VARCHARの場合:
      // MySQL には VARCHAR 型はなく、CHAR 型のみです。
      int vcMaxPrecision = this.getTypeSystem().getMaxPrecision(SqlTypeName.CHAR);
      int 精度 = type.getPrecision();
      (vcMaxPrecision > 0 && 精度 > vcMaxPrecision) の場合 {
        精度 = vcMaxPrecision;
      }
      新しいSqlDataTypeSpecを返します(
          新しい SqlBasicTypeNameSpec(SqlTypeName.CHAR、精度、SqlParserPos.ZERO)、
          SqlParserPos.ZERO);
    }
    super.getCastSpec(type) を返します。
  }

  SQL の Cast ステートメントを使用して、特定の型にキャストできます。

  最終的な文字列クエリ = "select cast(\"product_id\" as varchar(50)), \"product_id\" "
       + "\"製品\"から";
   最終的な文字列は "SELECT CAST(`product_id` AS CHAR(50)), `product_id`\n" です
       + "`foodmart`.`product` から";
// 解析された SqlNode
sqlNode.toSqlString(CalciteSqlDialect.DEFAULT).getSql();

Apache Calcite で方言変換を実装するためのコードに関するこの記事はこれで終わりです。Apache Calcite の方言変換の詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Vertica 統合 Apache Hudi 大量使用ガイド
  • Alibaba Cloud Server 上での Php+Apache オペレーティング環境のセットアップの詳細な手順
  • Apache Pulsar クラスタの構築と展開の詳細なプロセス
  • SQL 解析用の Apache Calcite (Java コード例)
  • Apache log4j2-RCE 脆弱性の再現と修復の提案 (CVE-2021-44228)
  • Apache Log4j2 が核レベルの脆弱性と迅速な修正を報告
  • Apache Hudi の柔軟なペイロード メカニズムの徹底分析

<<:  モバイル端末の適応により、px は自動的に rem に変換されます。

>>:  js での typeof の使い方を理解するための記事

推薦する

ローカルサーバーを構築するためのwebpack-dev-serverの実装

目次序文webpack-deb サーバーwebpack-dev-server 起動エラー解決策1解決...

JavaScript の条件付きアクセス属性と矢印関数の紹介

目次1. 条件付きアクセス属性2. アロー関数の紹介1. 条件付きアクセス属性?. は ES2020...

CentOS 7にChromeブラウザをインストールする方法

この記事では、CentOS 7 に Chrome ブラウザをインストールする方法を紹介します。詳細は...

複数の .sql ファイルを MySQL に効率的にインポートする方法の詳細な説明

MySQL には、複数の .sql ファイル (SQL ステートメントを含む) をインポートする方法...

MacOS に MySQL 8.0 をインストールして MySQL にログインする方法

公式チュートリアルに従って、インストール パッケージをダウンロードし、[インストール] をクリックし...

JavaScript を使用してセカンダリ メニューを作成する

この記事では、セカンダリメニュー効果を実現するためのJavaScriptの具体的なコードを参考までに...

Vue+Websocketはチャット機能を実装するだけです

この記事では、チャット機能を簡単に実装するためのVue+Websocketの具体的なコードを参考まで...

ユーザーのニーズがマーケティング指向のデザインにつながる

<br />それぞれのトピックについて、チーム内でメールで議論します。議論が白熱するにつ...

JavaScript のスプレッド演算子とレスト演算子の違いの詳細な説明

目次レスト演算子とは何ですか? JavaScript 関数では REST 演算子はどのように機能しま...

js でオブジェクトを作成するさまざまな方法とその長所と短所のまとめ

目次初期作成方法ファクトリーパターンコンストラクターパターンコンストラクタパターンの最適化プロトタイ...

Vue+Element UIはドロップダウンメニューのカプセル化を実現します

この記事の例では、ドロップダウンメニューのカプセル化を実装するためのVue + Element UI...

CSS3 カウントダウン効果

成果を達成する実装コードhtml <div クラス = 'ラッパー'> ...

MySQL トランザクション分離レベルとロックメカニズムの問題に関する深い理解

概要データベースは通常、複数のトランザクションを同時に実行します。複数のトランザクションが、同じデー...

WeChatミニプログラムのすべてのページがログインされていることを確認する方法

目次現状解決さらなる解決策やっと現状WeChat ミニプログラムには、ホームページ、個人ページ、いく...

見栄えの良い CSS カスタム スタイル (タイトル h1 h2 h3)

レンダリングBlog Gardenでよく使われるスタイル /*タイトル h1 h2 h3 スタイル*...