web-dev-qa-db-ja.com

PostgreSQL:ユーザー定義の計算をトリガーで実行可能な計算に変換する

ユーザー定義の機械可読文字列式を一連のクエリと計算に変換しようとしています。その結果は、別の非正規テーブルに保存されます。計算は、トリガーと、特定のテーブル(以下の簡単な例ではbbg_pulls)が更新または挿入されたときに実行される一般化/動的/柔軟な計算関数を介して実行されます。

たとえば、計算関数に渡された文字列が次の場合:

_'[bp2][-1]/[bp5]'
_

ここで、[bp#]はテーブル(例:bp = bbg_pulls)を示し、idと[+ /-#]は、すぐ左側のIDのnow()に対する期間ラグ(私の例では日ラグ)を示します。それの。

その場合、クエリは次のようになります。

_select val1/val2 as fin_calc
from 
    (select val from bbg_pulls 
    where 
      id = 2
      and val_date = (select (CURRENT_TIMESTAMP - INTERVAL '1 day')::date)) as val1
    ,(select val from bbg_pulls 
    where 
      id = 5
      and val_date = (select CURRENT_TIMESTAMP::date)) as val2
_

(上記のすべてが構成されており、クエリをテストする方法がないため、構文的にオフになっている可能性があることに注意してください。ただし、私のポイントを理解していただければ幸いです。)

上記の例には、同じテーブル内の2つの項目の除算のみが含まれていますが、他の文字列ははるかに複雑になる可能性があり、パーセンタイルランク、基本的な数学演算、絶対値などを組み込む必要があります。

PostgreSQL9.3.5を使用しています。上記のクエリは、わかりやすくするために大幅に簡略化されています。

ここでの正しいアプローチは何ですか?ウェアハウス/ MDX /キューブソリューション?それとも、すでにこのようなものがありますか?

私の現在のアプローチ/考え方は、使用するさまざまな計算をすべて実行し、それぞれのpsqlで個別のクエリなどを定義し、必要なクエリ/関数のタイプを見つけるためのロジックを作成し、IDをパラメータとして渡すことです。識別された特定のクエリ/関数。つまり、任意の文字列計算を実行できる一般化された計算生成関数ではなく、事前定義された関数とクエリを設定します。これらはすべて個別に定義し、渡される文字列式で識別する必要があります。計算、そして私たちはたくさんあります。

この質問に答えられない場合は、お知らせください。削除させていただきます。

3
mountainclimber

基本的に、独自の非仕様クエリ文字列'[bp2][-1]/[bp5]'に基づいて動的SQLを生成する [〜#〜] dsl [〜#〜] を実装する方法を尋ねています。それは大規模なタスクです。私はこの媒体でこの質問に答えることができないでしょう、それはQ/Aからほど遠いです:「それは私がこの仕事をする方法のようです」。そうは言っても、これはそれがどのように見えるかです。

  1. '[bp2][-1]/[bp5]''([bp1]/[wc66])*[wc100]'、および質問で示した多数の その他の例を使用して、サポートする予定の機能の仕様を作成します。
  2. パーサーを作成します。これはそれ自体がartです。正規表現、ツリーパーサー、サックスパーサーを使用しますか?仕様を満たすために正確に何が必要ですか?
  3. 解析された構造をSQLに変換できる既成のソリューションを使用します。ほとんどの言語には、 SQL :: Abstract のように、これを実行できるものがあります。そうでない場合は、作成する必要があります。
1
Evan Carroll