【解決手段】ソフトウェアをアセンブルする方法は、ユーザが、計算関数(CF)をコード化できるようにするS101と、ユーザがCFをコード化し終えたかどうかを判断するS102と、ユーザが、利用可能なCFの1つまたは複数を使用して部分関数(PF)をコード化できるようにするS103と、ユーザが全てのPFを作成し終えた時を判断するS104と、ユーザが、利用可能なPFの1つまたは複数を使用してソフトウェアを作成できるようにするS105と、を含む。
前記VMSSは前記キーペアのサブセットを含むVMSを含み、前記サブセットの前記キーペアの中の第1のキーペアは、前記CFの入力引数にマッピングする第1のキー、および、前記I/Oキー値ペアの中の入力キー/値ペアにマッピングする第2のキーを含む、請求項1に記載の方法。
前記サブセットの前記キーペアの中の第2のキーペアは、前記CFの出力引数にマッピングする第3のキー、および、前記I/Oキー値ペアの中の出力キー/値ペアにマッピングする第4のキーを含む、請求項2に記載の方法。
サービスを行うように構成されるコンピュータプログラムを実行する方法であって、前記コンピュータプログラムは、入力引数として複数の入力/出力(I/O)キー/値ペアを含むデータメッセージを受信するように構成される部分関数(PF)を含み、前記方法は、
前記データメッセージの名前を使用して複数の要素を含むデータ構造を検索することであって、それぞれの要素は名前および可変マッチング構造(VMS)を含む、検索することと、
検索された前記データ構造におけるそれぞれの要素について、
前記要素の前記名前を使用して計算関数(CF)を検索し、かつ
前記要素の前記VMSおよび前記データメッセージを使用して検索された前記CFを呼び出すことと、を含む、方法。
前記呼び出すことは、前記データメッセージから入力データを判断することと、前記VMSから前記入力データのデータ部分に前記CFの引数をマッピングすることと、前記マッピングに従って前記データ部分によって前記CFを呼び出すことと、を含む、請求項6に記載の方法。
前記呼び出すことは、第2のPFを起動するために複数の入力/出力(I/O)キー/値ペアを含む第2のデータメッセージによって前記検索されたCFを呼び出す、請求項6に記載の方法。
サービスを行うためにコンピュータプログラムをアセンブルするためのコンピュータプログラム製品であって、プログラム命令が具現化されるコンピュータ可読記憶媒体を備え、前記プログラム命令は、
前記サービスの入力/出力(I/O)要件を複数のI/Oキー/値ペアを含む対応するデータメッセージに変換することと、
入力引数として前記データメッセージを受信するように前記プログラムの部分関数(PF)を構成することと、
計算関数(CF)の引数に、かつ前記I/Oキー/値ペアにマッピングするキーペアを含む可変マッチング構造(VMS)セット(VMSS)を生成することと、
前記VMSSを使用して前記計算関数(CF)を呼び出すように前記PFを構成することであって、前記CFは前記サービスに関連している演算を行うように構成される、構成することと、を含む方法を行うようにコンピュータによって実行可能である、コンピュータプログラム製品。
前記VMSSは前記キーペアのサブセットを含むVMSを含み、前記サブセットの前記キーペアの中の第1のキーペアは、前記CFの入力引数にマッピングする第1のキー、および、前記I/Oキー値ペアの中の入力キー/値ペアにマッピングする第2のキーを含む、請求項11に記載のコンピュータプログラム製品。
前記サブセットの前記キーペアの中の第2のキーペアは、前記CFの出力引数にマッピングする第3のキー、および、前記I/Oキー値ペアの中の出力キー/値ペアにマッピングする第4のキーを含む、請求項12に記載のコンピュータプログラム製品。
前記データメッセージはJavaScript Object Notation(JSON)フォーマットを有する、請求項11に記載のコンピュータプログラム製品。
サービスを行うように構成されるコンピュータプログラムを実行するコンピュータプログラム製品であって、前記コンピュータプログラムは、入力引数として複数の入力/出力(I/O)キー/値ペアを含むデータメッセージを受信するように構成される部分関数(PF)を含み、前記コンピュータプログラム製品は、プログラム命令が具現化されるコンピュータ可読記憶媒体を備え、前記プログラム命令は、
前記データメッセージの名前を使用して複数の要素を含むデータ構造を検索することであって、それぞれの要素は名前および可変マッチング構造(VMS)を含む、検索することと、
検索された前記データ構造におけるそれぞれの要素について、
前記要素の名前を使用して計算関数(CF)を検索し、かつ
前記要素の前記VMSおよび前記データメッセージを使用して検索された前記CFを呼び出すことと、を含む方法を行うようにコンピュータによって実行可能である、コンピュータプログラム製品。
前記呼び出すことは、前記データメッセージから入力データを判断することと、前記VMSから前記入力データのデータ部分に前記CFの引数をマッピングすることと、前記マッピングに従って前記データ部分によって前記CFを呼び出すことと、を含む、請求項16に記載のコンピュータプログラム製品。
前記呼び出すことは、前記検索されたCFの以前の呼び出しの結果を含む前記PFの内部データ構造に記憶されるデータをさらに使用する、請求項16に記載のコンピュータプログラム製品。
前記データメッセージはJavaScript Object Notation(JSON)フォーマットを有する、請求項16に記載のコンピュータプログラム製品。
前記呼び出すことは、第2のPFを起動するために複数の入力/出力(I/O)キー/値ペアを含む第2のデータメッセージによって前記検索されたCFを呼び出す、請求項16に記載のコンピュータプログラム製品。
【発明を実施するための形態】
【0012】
本発明概念は、本開示の例示の実施形態が示されている添付の図面を参照して、より詳細に説明される。図面全体を通して、同じまたは同様の参照番号は、同じまたは同様のコンポーネントを表すために使用される。しかしながら、本発明概念は、さまざまなやり方で実装可能であるため、本明細書に開示される実施形態に限定されると理解されるべきではない。むしろ、それらの実施形態は、当業者に本開示の範囲を伝えるために、本開示を徹底的かつ完全に理解するように提供される。
【0013】
コンポーネントベースのソフトウェアシステムおよび開発方法について本明細書に説明する。下記の説明では、本発明をより徹底的に理解してもらうために、多数の具体的な詳細が示される。しかしながら、本発明が、これらの具体的な詳細なしで実践可能であることは、当業者には明らかとなろう。他の例では、本発明を不明瞭にすることを回避するために、周知の特徴は詳細には説明されていない。
【0014】
本明細書において言及されるコンピュータコードデバイス(例えば、方法、クラス、ライブラリ)は、データ記憶媒体に記憶されてよい。本明細書において使用されるような「データ記憶媒体」と言う用語は、コンパクトディスク、ハードディスク、フロッピーディスク、テープ、光磁気ディスク、PROM(EPROM、EEPROM、フラッシュEPROMなど)、DRAM、およびSRAMなどの全てのコンピュータ可読媒体を示す。
【0015】
図1は、本発明概念の例示の実施形態に従ってソフトウェアをアセンブルする方法を示すハイレベル図である。
【0016】
方法は、ユーザが、計算関数(CF)をコード化できるようにする(S101)ことを含む。例えば、テキストフィールドを含むCFグラフィカルユーザインターフェース(例えば、CF−GUI)は、ユーザがCFのコードを入れることができるようにするコンピュータプログラムによって提供可能である。例えば、CF−GUIは、ユーザによって選択される時、ユーザが現在のCFのコード化を完了したことをプログラムに通知する第1のボタンを含むことができる。例として、CFは、計算を行う、データベースへのクエリを行う、または、ウェブページ上にグラフィックまたはテキストを提示するためにコード化可能である。例えば、クエリによって返された結果に基づいた数学的計算を行うための計算が使用可能である。一実施形態では、それぞれのCFは、ユーザによって一意の名前が与えられ、かつ、1つまたは複数の入力パラメータ(本明細書ではCF入力パラメータと呼ばれる)を受信するために、および、出力パラメータ(本明細書ではCF出力パラメータと呼ばれる)を返すためにコード化される。例えば、CF入力パラメータおよびCF出力パラメータは、整数、浮動小数、文字列、配列、ポインタなどとすることができる。
【0017】
方法は次いで、ユーザがCFをコード化し終えたかどうかを判断する(S102)ことを含む。例えば、第1のボタンの選択は、ユーザが別のCFを作成することを所望していることを指示することができる。例えば、CF−GUIは、ユーザによって選択される時、ユーザがCF50を作成し終えたことをプログラムに通知する第2のボタンを含むことができる。完了したCFはCFデータベース60に記憶可能であるため、他の符号器に利用可能である。
【0018】
方法は次に、ユーザが、利用可能なCFの1つまたは複数を使用して部分関数(PF)をコード化できるようにする(S103)ことを含む。例えば、プログラムは、GUIにおけるCFデータベース60に記憶された利用可能なCFの選択可能なリスト、およびCFが選択されたこと、およびPF内のそれらの実行順序を示すペインと共に、第2のGUI(例えば、PF−GUI)を提示することができる。例えば、ユーザは、対応するCFのインスタンスが対応するPFに必要とされる度に利用可能なCFのうちの1つを選択し、かつ、選択されたインスタンスを、ユーザがCFインスタンスを実行させることを所望する順序でペインに挿入することができる。
【0019】
方法は次に、ユーザが全てのPFを作成し終えた時をプログラムが判断する(S104)ことを含む。例えば、PF−GUIは、ユーザによって選択される時、ユーザが全てのPF70を作成し終えたことを指示するグラフィカルボタンを含むことができる。PF70は、PFデータベース80に記憶可能であるため、他の符号器に利用可能である。
【0020】
方法は次いで、プログラムによって、ユーザが、PFデータベース80に記憶される利用可能なPF70の1つまたは複数を使用してソフトウェアを作成できるようにする(S105)ことを含む。例えば、コンピュータプログラムを使用して、ユーザが接続コードを入れることができるようにするテキストフィールド、および利用可能なPF70の選択可能なリストを提示する第3のGUIをローンチするために使用可能である。例えば、ユーザは、対応するPFを、コンピュータプログラムの接続コードにおけるある特定の場所に挿入するためにPFをリストから選択可能である。一実施形態では、コンピュータプログラムは、インタープリタによって解釈されるフォームであってよい。
【0021】
図2は、
図1の方法を実装するために使用可能である例示のコンピュータシステム1000を示す。
図2を参照すると、コンピュータシステム1000は、例えば、中央処理装置(CPU)1001、ランダムアクセスメモリ(RAM)1004、プリンタインターフェース1010、ディスプレイユニット1011、ローカルエリアネットワーク(LAN)データ伝送コントローラ1005、LANインターフェース1006、ネットワークコントローラ1003、内部バス1002、および例えば、キーボード、マウスといった1つまたは複数の入力デバイス1009などを含むことができる。示されるように、システム1000は、リンク1007を介してデータ記憶デバイス、例えばハードディスク1008に接続されてよい。上述されたGUIはディスプレイユニット1011上に提示可能である。上述されたCF50、PF70、プログラム、およびアセンブルされたソフトウェアは、メモリ1004および/またはハードディスク1008に記憶されてよい。
【0022】
図3は、PFをコード化するために
図1のステップS103を実装するために使用可能である本発明の例示の実施形態による方法を示す。
図3を参照すると、方法は、計算目標データメッセージ(CGDM)の入力を受信するように部分関数を構成する(S301)ことを含む。
【0023】
例示の実施形態では、CGDMは、i)入力部分および出力部分、ii)名前/値フォーム(例えば、全ての値、いずれの後の計算においても変数に割り当てられる値のサブ構造は名前を有するものとする)を有し、iii)その構造はいくつかの横文規則(例えば、HTML、XML、またはJSON)に従う。2つのCGDMは、i)これらの入力部分および出力部分の両方が同じ構造を有し、かつii)該構造における全ての名前が同じである場合、同じである。CGDMはPFの引数として使用される。いずれのPFも1つの引数しか有することができない。PFは1つまたは2つ以上のCGDMを処理できる。それぞれのCGDMは対応するVMSSを有する。VMSSは、CGDMの計算目標をどのように達成するかをPFに命令する。
【0024】
全てのPFは同じインターフェースを有する。例えば、それぞれの部分関数は、部分関数の起動パラメータまたは引数と呼ばれる場合があるCGDMで起動されるように構成される。CGDMは、入力パラメータX(例えば、入力:X)、および出力パラメータY(例えば、出力:Y)を含み、この場合、XおよびYは名前(キー)/値フォームを有する任意のデータ構造とすることができる。X部分において、名前は値を有し、Y部分の値は、部分関数によって埋められるように空白である。2つのCGDMは、これらの入力部分および出力部分の両方が同じ構造を有し、かつ該構造における全ての名前(キー)が同じである場合、同じである。それぞれのCGDMは一意の名前を有する。この入力部分セットの全ての名前(キー)の値を有するCGDMは、CGDMのインスタンスと呼ばれる。PFは、埋められた値を有するCGDMの出力部分と同じデータ構造を返す。PFは引数としてのいずれのCGDMも受け入れる。
【0025】
PFは1つまたは複数の計算関数(CF)を包含する。いずれの関数もCFとすることができる。PFは、PFがCFをどのように実行するかがCGDMだけでなく、可変マッチング構造(VMS)と呼ばれるデータ構造によっても判断されるため、いずれのCGDMも引数として受け入れ可能である。PFはCF呼び出し元を通してCFを実行する。CF呼び出し元は、引数として、CGDM、VMS、およびCFResultsを受け入れる。呼び出すためにPFには一定のインターフェースが与えられる。CF呼び出し元は、i)CGDMおよびVMSに従ってCFおよび呼び出しの引数を準備し、ii)CGDMおよびVMSに従ってCGDMの出力部分を設定し、iii)後のCFの実行による使用を可能にするためにCFResultsに結果を保存する。
【0026】
本発明の一実施形態では、i)完全CFおよびii)部分CFの、2つの型のCF関数が存在してよい。完全CFはPFを呼び出さず、インターフェース要件を完了させている。部分CFはPFを呼び出し、インターフェース要件を部分的に終わらせている。インターフェース要件がどのように行われるかは、どのPFが呼び出されるか、およびPFが何を行うように構成されるかに左右される。
【0027】
CFがPFを呼び出す時、CGDMを準備し、かつ、引数としてのCGDMを呼び出したPFに渡す。CGDMにおける値の命名は、無矛盾の命名規則に従う場合がある。CFが呼び出すPFの名前、およびCFが作成するCGDMの名前は、CFのVMSにおいて指定可能である。
【0028】
VMSSはCFを接続する制御を行い、部分CFはPFを接続する制御を行う。ソフトウェアは所与の設計に従って、PFおよびCFを接続するためにVMSおよびVMSSを操作することによって形成可能である。
【0029】
1つのCGDMについて、CGDMの計算構造のCGDMの計算目標を達成するために(2つ以上のPFを伴う場合がある)全てのPFおよびCFの実行シーケンスを呼び出す。
【0030】
図6Aは、部分関数に引数として渡される可能性があるCGDMの一例である。この例では、CGDMはJavaScript(登録商標である)Object Notation(JSON)フォーマットを有する。CGDMは、1つまたは複数の入力キー/値ペアおよび出力キー/値ペアを含む。CGDMは、入力キー/値ペアおよび出力キー/値ペアを抽出するためにパーサーまたはインタープリタによって使用可能である識別子を含むことができる。
【0031】
図6Aに示される例において、CGDMにおける入力パラメータ識別子は「入力」という名称が付けられ、出力パラメータ識別子は「出力」という名称が付けられる。例えば、CGDMをパースするパーサーが「入力」の識別子を認識後、パーサーは、次の左中括弧「{}と右中括弧「」」との間に位置する次の要素がキー/値入力パラメータペアであると仮定することができる。例えば、CGDMをパースするパーサーが「出力」の識別子を認識後、パーサーは、次の左中括弧「{」と右中括弧「}」との間に位置する次の要素がキー/値出力パラメータペアであると仮定することができる。例えば、キー/値ペアは、セミコロン「;」によって分離可能であり、所与のキー/値ペアのキーおよび値はコロン「:」によって分離可能である。
【0032】
図6Aは、入力パラメータキー/値ペアを示すための「入力」という用語の使用、出力パラメータキー/値ペアを示すための「出力」という用語の使用、キー/値ペアの開始を示すための「{」という用語の使用、キー/値ペアの終わりを示すための「}」という用語の使用、および、パーサーがキーと値とを区別できるようにするための「:」という用語の使用を示すが、本発明はこれらに限定されない。例えば、これらの用語は、実行者によって所望されるように、他の語または記号に変更されてよい。
【0033】
図3に戻って参照すると、方法は、ユーザが計算関数(CF)の新しいインスタンスを呼び出すために部分関数を所望しているかどうかを判断する(S302)ことを含む。新しいインスタンスは、これが、挿入するための特定的なCFがリクエストされた1回目である、または、リクエストされた挿入がCF(例えばCF2)のインスタンスを異なるCF(例えばCF1)の後に挿入させることになることを意味する。説明を簡単にするために、
図6Bに示されるような、第1の計算関数CF1および第2の計算関数CF2のみが利用可能であると仮定する。ユーザがCFの新しいインスタンスをリクエストしている場合、方法は、特定のCFを特定するためにラベルを挿入する(S303)。例えば、ユーザは、第1の計算関数CF1が使用されることをリクエストしているため、方法は、「CF1」などのラベルを可変マッチング構造シーケンス(VMSS)に挿入して、第1の計算関数CF1が呼び出されるように特定する。VMSSは、完了すると、ペアのシーケンスを含むことになり、この場合、それぞれのペアは所与のCF(例えば、CF1)およびVMS(例えば、CFName、VMS)の名前を含む。例えば、完了したVMSSは、{{CF1、VMS1}、…、{CFN、VMSN}}のペアを含むことができ、この場合Nは1またはそれ以上である。VMSSはCGDMに関連付けられ、VMSSにおける全てのVMSはCGDMの全ての名前の(キーの)値を埋める。すなわち、VMSSはCGDMの計算目標を満たす。VMSSは、PFに、CGDNの計算目標をどのように達成するかを命令する。
【0034】
次に、方法は、CFインスタンスの入力パラメータをCGDM内の入力パラメータにマッピングし、かつ、CFインスタンスの出力パラメータをCGDM内の出力パラメータを出力するためにマッピングする可変マッチング構造(VMS)をユーザが構成できるようにする(S304)ことを含む。VMSは、PFに、1つのCFをどのように実行するかを命令する。
【0035】
例えば、
図6Bは、それぞれのキーペアがセミコロン「;」で分離される複数のキーペアを有する第1のCF1 611のために構成される第1のVMS601の例を示す。例えば、第1のVMS601の第1のキーペア「a:x」における第1のキー「a」は、第1のCF1 611の第1の入力パラメータ「a」に対応し、第1のキーペア「a:x」における第2のキー「x」は
図6Aに示されるCGDM600の第2の入力パラメータ「x:2」に対応する。例えば、第1のVMS601の第2のキーペア「b:y」における第1のキー「b」は第1のCF1 611の第2の入力パラメータ「b」に対応し、第2のキーペア「b:y」における第2のキー「y」は
図6Aに示されるCGDM600の第3の入力パラメータ「y:3」に対応する。例えば、第1のVMS601の第3のキーペア「c:z」における第1のキー「c」は第1のCF1 611の出力パラメータ「c」に対応し、第3のキーペア「c:z」における第2のキー「z」は
図6Aに示されるCGDM600の出力パラメータ「z:NULL」に対応する。
図6Cは、CFに対する呼び出しの例を示す。CFの引数が複合型である場合、CGDMの入力部分における同じ複合型にマッピングする場合、引数の名前がCであり、かつ同じ型(CGDMの入力部分のサブ構造)の名前がDであると仮定する場合に、マッピングは「C:D」と指定可能である。CGDMの入力部分における同じ複合型にマッピングせず、そのメンバがCGDMの入力部分において分布した名前にマッピングする場合、複合型のそれぞれのメンバのマッピングは指定される必要がある。複合型がTであり、かつCGDMの入力部分における名前がd1、d2、…であると仮定する場合、マッピングは「C、T(「member1:d1」、「member2:d2」…)」と指定可能である。Cが配列型である場合、マッピングは「C:Array[d1、d2、…]」と指定可能である。
【0036】
次に、方法は、構成されたVMSを、部分関数CFに関連付けられたVMMSに挿入する(S305)。VMSは、特定されたCFに関連付けられていることをパーサーが認識できるように挿入される。例えば、ラべル「CF1」より下の
図6Bに示される第1のVMS601は、PFがVMSSに挿入されておりかつ第1の計算関数CF1に関連付けられているように構成されるVMSの一例である。方法は次いで、ユーザがし終えたかどうかを判断する(S305)ことを含む。例えば、GUIは、計算関数(CF)を選択し、かつ、計算関数(CF)に入れ終わっていることを指示するために、ユーザによって使用可能である。ユーザが別の計算関数(CF)、または、先に選択された計算関数(CF)の別のインスタンスを選択する場合、方法はステップS302に進む。例えば、ユーザが同じCF(例えば、再びCF1)の別のインスタンスに入れかつCGDMの異なるパラメータをCFに送るとしたら、方法はステップS304に進むことになる。例えば、これによって、第1の計算関数CF1を特定する同じラベル(例えばCF1)下の第2のVMS602が挿入されることになる可能性がある。しかしながら、ユーザが新しい計算関数(例えば、CF2 612)を選択する場合、
図6Bに示されるように、第2のラベル(例えばCF2)および第3のVMS603が挿入されることになる可能性がある。
【0037】
CGDMの入力から値を取ること以外に、CFの引数は、また、1つまたは複数の先に実行されたCFの結果から値を取ることができる。例えば、PFが第1のCFを実行する時、CFの実行の結果をPFの内部にあるデータ構造(例えば、CFResults構造)またはリストに記憶でき、それによって、PFが同じ第1のCFまたは第2のCFを再実行する場合、その結果は、対応するCFが必要に応じて該結果に基づいて演算できるように、どちらのCFにも利用可能である。
図7に示されるように、PF701がPF呼び出しを通して呼び出される時、PF701はCFCaller関数を通してCFを実行する。CFCaller関数は、複数の利用可能なCFCaller関数を記憶する外部記憶領域702(例えば、CFCallerストア)からロードされてよい。CFCaller関数は、入力として、CGDM、CFに関連付けられたVMSS703、およびCFResults構造704を取る。VMSS703は、外部記憶領域705(例えば、VMSSストア)からロードされてよい。CFCaller関数は、下記を行う。1)CFの引数を宣言し、かつVMSS703、CGDM、およびCFResults構造704内のCFResultsを使用してそれぞれの引数を初期化し、2)引数によってCFを実行し、3)その結果をCFResults構造704に加えて、VMSS703に従ってCGDMの出力(例えば、CGDM.output)を設定する。一実施形態では、それぞれのCFは、関連のCFCaller関数を有し、それぞれのCFは同じインターフェースを有する。VMSSストアは、PFが呼び出される全てのCGDMに対する全てのVMSSを包含する。CFCallストアは、PFが包含する全てのCFに関連付けられたCFCaller関数を包含する。
【0038】
図4は、本発明の例示の実施形態に従って、受信されたCGDMのPF呼び出しを実行するための方法を示す。方法は、CGResults構造704をクリアする(S401)ことと、CGDMの名前を使用してVMSSストア705から対応するVMSS703を検索する(S402)ことと、VMSS703におけるそれぞれの要素について、要素の名前部分を使用してCFCallerストア702からCFCaller関数を検索し、かつ要素のVMS部分、CGDM、およびCFResults構造704によって、検索されたCFCaller関数を呼び出す(S403)ことと、(この時値が埋められている)CGDMの出力をコピーする(S404)ことと、そのコピーを返す(S405)ことと、を含む。
【0039】
CFは他のPFを呼び出すことができる。これを行うやり方は、CGDMを作成し、かつ、引数として作成されたCGDMをこの呼び出しに渡すことである。CFが、計算するCGDMにおける値を、作成するCGDMに渡す場合、CFは、計算するCGDMにあるのと同じ名前を使用するものとする。CFが、CFResults構造704における値を、作成するCGDMに渡す場合、CFResults構造704にあるのと同じ名前を使用するものとする。これは無矛盾の名前規則と呼ばれる。CFが別のPFを呼び出すためのCGDMを作成する時、無矛盾の名前規則に従うものとする。
【0040】
全てのPFが同じインターフェースを有するため、種々のPFを呼び出す際の違いは名前によるだけである。PF名前引数は、呼び出すPF全てに対するCFに加えられることが可能であり、その後、呼び出すPFはCFのVMSにおいて指定可能である。また、作成するCGDMの名前は、VMSにおいて指定可能である。そのため、CFが呼び出すのはどのPFか、および使用するCGDMの名前が何かについては、CFの開発後に判断可能である。
【0041】
一実施形態において、データ記憶パラメータの全ては、名前(キー)/値フォームである。データ記憶フォーマットは、CGDMと共に種々の横文規則を有することができる。
【0042】
データ記憶域およびCGDMにおける名前は、種々のユーザよっておよび種々の時に作成可能であるため、矛盾する場合がある。名前/値のセットは、セットにおける同じ名前が命名された値に対して同じ意味論的意味を記述し、かつ、セットにおける異なる名前が命名された値に対する異なる意味論的意味を記述する場合、無矛盾と言われる。無矛盾の名前/値のセットは、名前空間(NS)を形成する。PFおよびこのCFは1つのNSにおいて演算する必要がある。CGDMおよびデータ記憶域が1つのNSにおけるものでない場合、それらを1つのNSに変換するための変換が、CGDMに適用可能である。1つのCGDMについて、CGDMの計算目標を達成するために全てのPFおよびCFの実行シーケンスが呼び出される。
【0043】
図5は、本発明の例示の実施形態によるソフトウェア開発プロセスを示す。プロセスは、ソフトウェアの全ての入力要件および出力要件をCGDMフォーマットに変換する(S501)ことと、その変換から生成されたそれぞれのCGDMの計算構造を設計し、マークアップ規則によってCGDMをマーキングし、必要に応じて新しいマークアップ規則を作成し、必要に応じて、プロパティシートを使用して新しいマークアップ規則によってCGDMをマーキングする(S502)ことと、設計された計算構造をサポートするようにデータ記憶域を設計する(S503)ことと、既存のPFおよび/またはCFを選択し、新しいマークアップ規則が加えられる場合、必要に応じて新しいPFおよび/またはCFを開発し、関わるCFに対して新しいCFCallerを開発する(S504)ことと、開発されたおよび/または選択されたPFならびにCFを接続するためにVMSおよびVMSSを作成する(S505)こととを含む。
【0044】
一実施形態では、ステップS505は、入力部分の値、すなわち、CGDMの名前インスタンス(NI)なしでCGDMを呼び出すことによって実施される。NIは、値のない入力部分および出力部分によるCGDMである。一実施形態では、他のPFを呼び出すそれぞれのCFは開発モード(DV)処理を有する。DVにおいて、CGは、計算するCGDMのNIを取り、かつ、計算するCGDMに対して作成する全てのCGDMのNIを、(例えば、ファイルのような)持続的データ記憶域に出力する。出力されたNIは呼び出されたPFのCGDMのコンテンツを指定する。VMSおよびVMSSはそれに応じて作成可能である。
【0045】
図8は、本発明概念の例示の実施形態に従って、利用可能な部分関数(PF)の1つまたは複数を使用してソフトウェアを生成する方法を示す。方法は、利用可能なPFからPFを選択するためにユーザにクエリを行う(S801)ことと、入力名前(キー)/値ペアおよび出力キー/値ペアを入れるためにユーザにクエリを行う(S802)ことと、入れられたデータに基づいてCGDMをフォーマットする(S803)ことと、入力引数としてフォーマットされたCGDMによってPF呼び出しを挿入する(S804)ことと、ユーザがPF呼び出しをし終えたかどうかを判断する(S805)こととを含む。ユーザがし終えてない場合、方法は、新しいPFを選択するためにユーザにクエリを行うようにステップS801に進む。ユーザがし終えている場合、方法は終了する。
【0046】
図9は、本発明の例示の実施形態に従って、PF呼び出しを含むソフトウェアを解釈する方法を示す。方法は引数としてPF呼び出しに渡された所与のPFおよびCGDMを特定するためにPF呼び出しをパースする(S901)ことを含む。方法は次いで、特定されたPFに関連付けられたVMSSをロードし、かつ、特定されたCGDM内の入力キー/値ペアおよび出力キー/値ペアを特定する(S902)ことを含む。方法は、次いで、ロードされたVMSSの次の行をパースする(S903)ことを含む。方法は次いで、パースされた行がCFラベルを含むかどうかを判断する(S904)。例えば、次の行が
図6Bに示されるVMSSの第1の行である場合、方法は、CF1のCFラベルを特定したと結論付けることになる。CFラベルが特定されたと判断される場合、方法は、判断されたCFラベルから呼び出すための特定のCFを特定し、かつ、VMSSの次の行をパースする。その後、方法が、次の行がCFラベルでない(すなわち、次の行がVMSに対応する)と判断する場合、方法は、VMSの現在のキーペアの第1のキーを特定されたCFの選択されたI/Oパラメータにマッチさせ、かつ、現在のキーペアの第2のキーを特定されたCGDMの選択されたI/Oキーにマッチさせる(S906)。例えば、VMS601がパースされ、かつ、パースされた現在のキーペアが「a:x」であり、特定されたCFがCF1 611である場合、方法は、現在のキーペア「a:x」の第1のキー「a」をCF1 611の入力パラメータにマッチさせ、かつ、現在のキーペアの第2のキー「x」をCGDM600の入力パラメータx:2の入力キー「x」にマッチさせる。次いで、方法は、CFの選択されたI/Oパラメータが選択されたI/Oキーの値を渡されるように、特定されたCFへの呼び出しをフォーマットする(S907)ことを含む。例えば、CFL1 611の入力パラメータ「a」は値「2」が渡されるが、これは、第1のキー「a」が「x」にマッチさせられ、xは2に設定される(例えば、「x:2」)からである。方法は次いで、VMSのあらゆるキーペアに対するこれらのマッチングステップを繰り返す。方法は、し終えたかどうかを判断するために、VMSの最後のキーペアがパースされたかどうかを判断する(S908)。方法が終えられていない場合、ステップS906に進むことによって、VMSの次のキーペアに進行する。方法が終えられている場合、ステップS902に進んで、VMSSの次の行をパースして、先に特定されたCFラベル下で新しいCFラベルまたは別のVMSのどちらかを見つける。
【0047】
図6AはCGDMのJSONフォーマットの使用を示すが、本発明はこれに限定されない。例えば、JSONフォーマットは、ハイパーテキストマークアップ言語(HTML)フォーマットまたは拡張マークアップ言語(XML)フォーマットと置き換え可能である。マークアップ規則は、アルゴリズムの任意の入力インスタンスについて、それに対応する拡張コンテンツがあるように、かつ、入力インスタンスおよびこの全データ特徴が拡張コンテンツから演繹できるように、CGDMの横文規則を使用してCGDMのコンテンツを拡張する規則として定義される。マークアップ規則はアルゴリズムに関連付けられる。
【0048】
本発明の一実施形態では、ソフトウェアへの入力データメッセージはHTMLフォーマットであり、CGDMはJSONフォーマットであり、データ記憶域はリレーショナルデータベースであり、これによってウェブ開発環境が可能になる。入力をハンドリングする部分関数はウェブブラウザにおいて作動し、フロントエンド部分関数と呼ばれる場合がある。サーバ側を作動させる部分関数はバックエンド部分関数と呼ばれる場合がある。バックエンド部分関数はデータベースに接続可能である。
【0049】
HTML入力を処理する1つのPFは、線形カスケード入力をハンドリングするものとすることができる。線形カスケード入力の例には、州を選択後、国を選択し、次いで市を選択する入力がある。この入力は、<select>のリストおよび現在の選択であり、出力は次のオプション型配列である。マークアップ規則は、リストを表現する任意の規則とすることができる。マークアップ規則の例には、第1のリストを<select Cascade=“cs1”cs1=”1”mName=”name1”…>とマーキングする、第2のリストを<select Cascade=”cs1”cs1=”2”mName =”name2”…>とマーキングする、第3のリストを<select Cascade=”cs1”cs1=”3”mName =”name3”…>とマーキングする、などがある。カスケードは計算名であり、Cascade=”cs1”はcs1=’n’であるインスタンスcs1を宣言し、その後、リストにおける位置を宣言する。PFは<select>要素のonSelectイベントによってトリガされる。同じonSelectイベントハンドラのcascadeHndlerは全ての<select>に対して設定される。cascadeHndlerはこの型の入力要件および出力要件をハンドリングする部分関数である。ハンドラのアルゴリズムは以下になる。
Get instance name from Cascade=”instance_i”;
Get position number from instance_i=”n”;
Get selected value v and name n1 of the current <select>
Get name n2 of the next <select>
Send a data message of the form
{{ “input”:
{“n1” : v}
},
{ “output”: {
[{“n2”:0}]}
}}
to a backend component
Set return result to the next <select>
【0050】
1つのHTMLデータメッセージにおける任意の長さの任意の数のカスケード入力は、この部分関数によってハンドリングされることが可能である。
【0051】
入力の別のケースは、スターカスケード入力と呼ばれ、この場合、いくつかの<select>のオプションは、利用可能なサイズおよび色のオプションが、どのクロスが選定されたかに基づいて決定される場合のように、1つの<select>によって決定される。中央マークについて、<select star=”star1”star1=”name list of all end select node”>である。エンドノード<select>がマーキングされる必要はない。中央の<select>の選択がし終わると、以下のフォームのデータメッセージがバックエンドに送られる。
{
{“input”:
{“centerName” : “v”}
},
{ “output”: {
[{“n1”, “”}],
[{“n2”, “”}],
…
}}
}
この場合、n1およびn2はエンドノードの名前である。返された値が配列ではなく単一値であり、かつエンドノードがテキストまたは数入力である時、これは、カスタマの名前が選定されるようにオートフィルとなり、このアドレスはオートフィルされる。
【0052】
入力候補ハンドリングは、オートフィルの逆算である。部署および位置の入力が被雇用者の名前入力候補の入力を制限するように、現在の入力値およびいくつかの他の入力値以外は現在の入力のオプションを制限することができる。現在の入力値がテキストである時、提案された値に関して、2つ以上の解釈がある場合があり、例えば、提案された値がこのテキストで開始するまたはテキストを包含すること意味する場合がある。そのため、さらなる情報が以下のような値に対して提供される必要がある。
{
{“input”: {
{“otherValues1”: “v1”},
{“otherValues2”: “v2”},
{“currentValue”: {
{“value”: “v3”},
{“type”: “LIKE”}
}
}
…
},
{ “output”: {
[{“n1”, “”}]
}
}
}
ここで、n1は現在の入力要素の名前である。
【0053】
第1の要素<input rangeInput=”ri1”ri1=”1”…>、第2の要素<input rangeInput=“ri1”ri1=”2”…>、または、選択入力について、第1の要素<select rangeInput=”ri1”ri1=”1”…>、第2の要素<select rangeInput=”ri1”ri1=”2”…>といったマックアップ規則を有する範囲入力がまた、実装可能である。アルゴリズムは、他の入力によって制約集合を満足させるかどうか、または1つの入力が他の入力のオプションを制限するかどうかの、現在の入力チェックを受け入れる前のものである。入力フォーマット選定に起因して、日にち範囲入力、選択範囲入力、数値範囲入力のような数個の異なる型の範囲入力が存在する場合がある。
【0054】
フォームは、ある数の異なる型の入力要素(テキスト、数値、リストオプション、範囲入力、カスケード入力…)を包含する。フォーム送信のアクションは、全ての要素に対する(名前、値)ペアを収集することである。フォーム送信のマークアップ規則は、入力要素のそれぞれの型に対して型記号を定義している。異なる型は、名前値へのアクセスが種々のやり方を使用する必要があることを意味する。それぞれの入力要素をその適正な型に対してマーキングする。フォーム送信に対するアルゴリズムは以下になる。
For each type {
Get all input element for the type
For each input element of the type {
Get the name and value, pack the name value into JSON format.
}
}
mark the data message as ADD or MODIFY
send the JSON data message to a backend address
【0055】
フォーム送信は、新しいデータのADDまたは古いデータのMODIFYのどちらかとすることができる。修正について、データは最初に、いくつかの余分なデータ、キー、または参照番号と共に、バックエンドからロードされる。次いで、データは修正され、バックエンドに送られる。余分なキーデータはクッキーなどの同様の機構によってハンドリング可能である。クッキーの1つの実装形態は、特殊なタグを有するHTMLのいくつかの隠された要素を使用することである。新しいデータを加えるために、この余分なキーデータは使用されない。そのため、フォーム送信に対するPFは、修正と追加とを区別することができる。PFのフォームは、定義された型の任意の数の入力要素と共に任意のフォームのフォーム送信をハンドリング可能である。
【0056】
サーチページは、サーチ条件としての1つまたは複数のデータ入力要素、および、サーチ結果を表示するための2次元データグリッドを包含する。データグリッドのそれぞれの列は命名可能である。データサーチの送信について、バックエンドに送られるJSONデータメッセージは、2つの部分、つまり、以下に示されるような空の2次元配列部分のサーチ条件部分およびデータグリッド部分を有する。
{
{“input”:{
{“name1”: “value1”},
{“name2”: {
{“Max”: {“value”: “v2”, “EQUAL”: “true”}},
{“Min”: {“value”: “v3”, “EQUAL”: “false”}}
} },
…
},
{“output”: {
[[{name4:0}, {name5:0},…]]
}}
}
ここで、name2は範囲値入力を指定し、EQUALは、trueが<=pr>=を意味し、falseが<or>を意味する。
【0057】
サーチ条件部分は、命名されかつマーキングされた型とすることができ、ADDのフォームと同じようにパッケージングされる。
【0058】
バックエンドの1つの実施形態は、データ記憶域としてリレーショナルデータベースを選定することであり、データメッセージの間で送受信されるデータメッセージはJSONフォーマットである。リレーショナルデータベースと相互作用する必要があるPFについて、データベーススキーマ名が使用される必要がある。データベーススキーマ名に対応するデータメッセージにおける名前を機能させるために、これらの名前はデータベーススキーマ名に変換される。テーブルの列名はtableName.columnNameのフォームである。単一のテーブルにおける挿入をハンドリングするPFは、以下のようにCGDMによって実装可能である。
{“input”: {
{“column1”: “table1.column1”},
{“column2”: “table1.Column2” },
{“column3”, “table1.Column3” },
…
} }
【0059】
1つのテーブルに挿入するために、それぞれの列はSQL挿入ステートメントによって同じように扱われるため、1つの型のデータがある。かかる挿入をハンドリングするCGDMは以下になる。
{ input: {
{“table1.column1”, “”},
{ “table1.Column2”, “” },
{ “table1.Column3”, “” },
…
}}
【0060】
マスター/詳細テーブルに挿入するために、CGDMは以下になる。
{“input”: {
{“Master”: {
{ “table1.column1”: “”},
{ “table1.Column2”:“”},
{ “table1.Column3”: “”}
…
}}
{ “Detail”: {
[{“table2.column1”: “”},
{ “table2.Column2”: “” },
{ “table2.Column3”: “” },…] }}
}}
ここで、CGDMは、マスターテーブルのデータ、および、詳細テーブルのデータの配列を含む。
【0061】
1つのテーブルへの更新をハンドリングするPFは以下のようにCGDMを有する。
{“input”: {
“primarykey”: {
{ “table1.column1”: “”},
{ “table1.Column2”: “”},
…
}
},
{“values”: {
{ “table1.Column3”: “” },
{ “table1.Column4”: “”},
…
}}
}
【0062】
マスター/詳細テーブルへの更新をハンドリングするPFは以下のようにCGDMを有する。
{“input”:{{“m_Primarykey”: {
{ “table1.column1”: “”},
{ “table1.Column2”: “”},
…
}
},
{“m_values”: {
{ “table1.Column3”: “”},
{ “table1.Column4”: “”},
…
}
},
{“d_Primarykey”: {
{ “table2.column1”: “”},
{ “table2.Column2”: “”}
…
}
},
{“d_values”: {
{ “table2.column3”: “”},
{ “table2.Column4”: “”}
…
}
},
{“d_data”: {
[{“table2.column1”: “”},{ “table2.Column2”: “”},…,
{ “table2.Column3”: “”},{ “table2.Column3”: “”}…]
}
}}
}
【0063】
以下の例について、SQL選択ステートメントが、[F:順序セクション]による[E:アグリゲーション条件]順序を有する[D:アグリゲーションセクション]によって[C:条件セクション]がグループ分けする場合の[B:テーブルセクション]からの[A:出力セクション]の選択などのフォームを取ると仮定する。この入力および出力に対するデータは6つのセクションに分割される。セクションAが、セクションBに現れるテーブルの列またはセクションBに現れるテーブルの列に対するSQL関数を包含し、セクションBがテーブルおよび結合関係を包含し、セクションCが、同じ関係における、column=value or column>(=)value or column<(=)value、column LIKE value SQLFunction(column)のフォームの条件を包含し、セクションEがSQLAggregateFunction(column)=or<(=)or>(=)valuesを包含し、セクションFが列を包含すると仮定する。
【0064】
セクションBにおいて必要とされるテーブルおよびそれらの結合関係情報は、データベースのスキーマから取得可能であるが、結合型情報はアプリケーションから生じるものとする。この選択ステートメントを実装するPFのCGDMにおける2つのテーブルの間の関係を表すための配列構造が選定できる。この選択ステートメントのCGDMは以下になる。
{{“input”:
{{“requirement”: {
[{ “tableA.column8”: “tableA.column8”},
{ “total1”: { “tableB.column4”:
{
“FUNC”: “SUM”
}}
},
…]}
},
{“table”: {
{[ “tableA”, “tableB”, “joinType”, “tableA.column1= tableB.column2”, “tableA.column3= tableB.column4”, …],
[ “tableC”, “tableD”, “joinType”, “tableC.column1= tableD.column2”, “tableC.column3= tableD.column4”, …],
…}}
},
{“condition”: {
{ “tableA.column5”: “v1”}, //default to tableA.column5=v1
{ “tableB.column1”: {
“value”: “v2”, //default to SUM(tableB.column1)=v2
“FUNC”: “SUM”
}
},
…}
},
{“groupby”: [
“tableA.column6”,
{ “tableB.column2”: {
“FUNC”: “DATE”
}
},
…]
},
{“having”: {
{ “tableB.column3”: {
“value”: “v3”,
“FUNC”: “MAX”
}
},
…}
},
{“orderby”: [
“tableA.column7”,
…]
}
}},
{“output”:
{“results”:
[{ “tableA.column8”: ‘’},
{ “total1”: ‘’},
…]}
}}
【0065】
入力要件は、SQL選択のセクションAに対応しており、かつ、SQL選択の出力を指定する。該要件は、配列フォーマットを指定する。{“tableA.column8”:“tableA.column8”}は、tableA.column8の値を得ること、および「tableA.column8」という名前に設定することを意味する。ペアの、
{ “total1”: { “tableB.column4”:
{
“FUNC”: “SUM”
}}
}
は、SUM関数列、tableB.column4を適用し、かつ、値を「total1」という名前に適用することを意味する。
【0066】
2つ以上のPFを使用してバックエンド計算タスクを達成する実装について、
図10に示されるように、販売注文の出荷を演算する場合を検討する。販売注文は、(部分払いまたは在庫品の制約のため)一部出荷可能であると仮定すると、販売注文は2回以上出荷される必要がある場合がある。着信するCGDMは以下になる。
{ “Order_Shipment_Data” :
{“input”: {
{“orderID”, “value1”}
}},
{“output”: {
{“order_info”: {
{“orderCode”:””}
{“salesmanName”:””},
{“customerName”:””}
}},
{“order_prod_info”: {
[[{“productName”:””}, {“productionDate”:””},
{“Quantity”:””},{“shippedQuantity”:””},{“quantityLeft”:””}]]
}}
}}
}
【0067】
入力は注文idであり、必要とされる出力は、いくつかの注文情報、注文コード、販売員名およびカスタマ名、ならびに、製品情報、製品名、製造日、注文量、出荷量、および出荷される残りの量のリストを含む。
【0068】
図10では、CGDMは、DataExpander PF10によって受信される。DataExpander PF10は、リレーショナルデータセット12に接続する。CGDMのためにWNSM100をマッピングする、機能させる名前空間は、以下になる。
{
{“orderID”, “order.id”};
{ “orderCode”, “order.code”}
{ “salesmanName”, “employee.name” }
{“customerName”, “customer.name”}
{“productName”, “product.name”}
{“productionDate”, “product.productionDate”}
{ “Quantity”, “order.Quantity” }
}
【0069】
マッピング後、CGDMは以下のようになる。
{ “Order_Shipment_Data” :
{“input”:
{“order.id”, “value1”}
},
{“output”: {
{“order_info”: {
{“order.code”: “”}
{“employee.name”: “”},
{“customer.name”: “”}
}},
{“order_prod_info”: {
[[{“product.name”: “”}, {“product.productionDate”: “”},
{“order.Quantity”: “”},{“shippedQuantity”: “”},{“quantityLeft”: “”}]]
}}
}}
}
【0070】
PF10は、SelectおよびPackerという2つのCFを有する。Select CFは、3つのインスタンス、102、104、および106を作動させる。Packer CFは1つのインスタンス108を作動させる。Selectは、リレーショナルデータベースに対して上の例の型SQL選択を行い、Packer CFは、この入力全てを、データメッセージ(例えば、CGDM)の対応する入力部分および出力部分にパッケージングし、データメッセージをLoopPF14に送る。PF14は、入力として配列AおよびBを取る1つのインスタンスを作動させる、KeyMatchLoopと呼ばれる1つのCFを有し、配列Cを出力する。A、B、およびCにおけるそれぞれの要素は、キー部分および値部分を有する。要素のキーは、名前/値のシーケンスである。2つのキーは、2つのキーの名前値シーケンスの長さが同じである場合同じ型であり、シーケンスのそれぞれの位置の2つの名前/値ペアについて、名前は同じである。2つのキーは、同じ型を有しかつ対応する名前の値が等しい場合、等しい。AおよびBは同じ型のキーを有する。KeyMatchLoopのアルゴリズムは以下になる。
For each element a of A
Create an element c with key part same as a
if there is an element b of B with a.key==b.key {
value part of c is computed from value parts of a
and b by computation rule1.
}
else {
value part of c is computed from value parts of a
and b by computation rule2.
}
add c to
【0071】
計算規則1および計算規則2は、Calculator PF16によって行われる。PF16は、3つの計算、Equal、Zero、およびMinusを有する。PF10に対するOrder_Shipment_DataのCGDMは以下になる。
{“Order_Shipment”:
{“Select.order”:
{
{ “input”: {
{ “requirement”: {
{“order.code”: “order.code”}
{“salesman.name”: “salesman.name”},
{“customer.name”: “customer.name”}
}},
{ “condition” : {
{“order.id”, “Order_Shipment_Data.input.‘order.id’” }
}},
{ “table” : {
{[“order”, “salesman”, “inner join”, “order.salesmanID=salesman.id”],
[“order”, “customer”, “inner join”, “order.customerID=customer.id”]}
}}
}},
{ “output”:
{ “result”: “Order_Shipment_Data.output.order_info”}
}}
}},
{“Select.orderProduct”:
{
{ “input”: {
{ “requirement”: {
[{“product.name”: “product.name”},
{“production.date”: “production.date”},
{“order_product.quantity”: “order_product.quantity”}]
}},
{ “condition” : {
{“order_product.orderId”,
“Order_Shipment_Data.input.‘order.id’” }
}},
{ “table” : {
[“order_product”, “product”, “inner join”,
“order_product.productId=production.id”]
}}
}},
{ “output”: {
“result”: “”}
}}
}}
{“Select.shipped”:
{
{ “input”: {
{ “requirement”: {
{“product.name”: “product.name”},
{“production.date”:“production.date”},
{“shippedQuantity”: {“shipment.Quantity”:
{
“FUNC”: “SUM”
}}
}
}},
{ “condition” : {
{“shipment.orderid”,“Order_Shipment_Data.input.‘order.id’” }
}},
{ “table” : {
[“shipment”, “product”, “inner join”, “shipment.productID=product.id”]
}}
{ “aggregate” : {
[“product.name”, “product.productiondate”]
}}
}},
{ “output”:
{ “result”: “”}
}
}}
{“packer”: {
{“input”: {
{“In”:
{
{“A”: “Select.orderProduct.output.Result”},
{“B”: “Select.shipped.output.Result”}
}},
{“Out”: {{“C”: “Order_Shipment_Data.output.order_prod_info”}}}
}},
{“output”: {
{“result” : “Order_Shipment_Data.output.order_prod_info”}
}}
}}
}
【0072】
データメッセージ、Order_Shipment_Dataの出力部分のorder_prod_infoは、PF10がPF14に送るデータメッセージの出力部分を生成するための入力として使用される。PF10は、データメッセージ、Order_Shipment_Data_FullをPF14に送る。
{“Order_Shipment_Data_Full”: {
{“input”: {
{“A”: [[{“product.name”: “v1”}, {“product.productionDate”: “v2”},
{“order_product.quantity”: “v3”}]]},
{“B”: [[{“product.Name”: “v4”}, {“product.productionDate”: “v5”},
{“shippedQuantity”: “v6”}]]}
}},
{“output”: {
{“C”: [[{“product.Name”: “”}, {“product.productionDate”: “”},
{“order.Quantity”: “”},{“shippedQuantity”: “”},{“quantityLeft”: “”}]]}
}}
}
}
【0073】
PF14に対するデータメッセージ、Order_Shipment_Data_FullのCGDMは以下になる。
{“Loop”:{
{“input”: {
{“A”:
[“Order_Shipment_Data_full.Input.A”,
{“key”:[“product.name”, “product.productionDate”]},
{“value”:{{“shippedQuantity” } }]
},
{“B”:
[“Order_Shipment_Data_full.Input.B”,
{“key”:[“product.name”, “product.productionDate”]},
{“value”:{{“order_product.quantity”} }]
},
{ “C”:
[“Order_Shipment_Data_full.output.C”,
{“key”:[“product.name”, “product.productionDate”]},
{“value”:{{“order_product.quantity”},{“shippedQuantity”},{“quantityLeft”}}]
}
}},
{“output”:
{ “result”: “Order_Shipment_Data_full.output.C”}
}
}
}
【0074】
PF14はPF16に2つのデータメッセージを送る。
{“Order_data”: {
{“input”: {
{“A”:{“order_product.quantity”: “v1”}}
}},
{“output”: {
{“C”:{{“order_product.Quantity”: “”},{“shippedQuantity”: “”},{“quantityLeft”: “”}}}
}}
}
}
{“Order_Ship_data”: {
{“input”: {
{“A”: {“order_product.quantity”: “v1”}},
{“B”: {“shippedQuantity”: “v2”}}
}
{“output”: {
{“C”: {{“order_product.quantity”: “”},{“shippedQuantity”: “”},{“quantityLeft”: “”}}}
}}
}
}
【0075】
Order_Ship_dataについてのCGDMは以下になる。
{“Order_Ship_Data”: {
{“Equal.quantity”: {
{“input”: {
“X”:“A.order_product.quantity”
}},
{“output”: {
“Y”: “C.order_product.quantity” //Y=X
}}
}
},
{“Equal.quantityLeft”: {
{“input”: {
“X”:“A.order_product.quantity”
}},
{“output”: {
“Y”:“C.quantityLeft”
}}
}
}
{“Zero”: {
{“output”: {
“X”:“C.shippedQuantity” //X=0
}}
}
}
}}
【0076】
Order_dataについてのCGDMは以下になる。
{“Order_Data”: {
{“Equal.quantity”: {
{“input”: {
“X”:“A.order_product.quantity”
}},
{“output”: {
“Y”: “C.order_product.quantity”
}}
}
},
{“Equal.shippedQuantity”: {
{“input”: {
“X”:“B.shippedQuantity”
}},
{“output”: {
“Y”:“C.shippedQuantity”
}}
}
},
{“Minus”: {
{“input”: {
{“X”:“A.order_product.quantity”},
{“Y”:“B.shippedQuantity”}
}},
{“output”: {
“Z”:“C.quantityLeft” //Z=X-Y
}}
}
}
}}
【0077】
データメッセージ、Order_Shipment_Dataの出力部分は、CFインスタンス106およびCFインスタンス108の出力部分によって形成される。そして、着信するデータメッセージ、Order_Shipment_Dataの機能させる名前空間に逆にマッピングでき、Order_Shipment_Dataの送信者に送ることができる。
【0078】
本発明の例示の実施形態は、CGDMのマークアップおよびプロパティシートを利用する。この実施形態は線形カスケードに関して以下に論じられるが、本発明はデータのいずれの特定の編成にも限定されない。線形カスケードは<select>要素のリストであり、これは、第1の要素から始まって最終の要素を除いたものであり、1つの<select>要素の選択された値が該リストにおける次の<select>のオプションを判断する。
【0079】
線形カスケード入力の1つの例はCountry−State−City入力であり、これによって、ユーザはCountryのオプションから国を選択でき、Stateのオプションを判断し、ユーザはStateのオプションから州を選択でき、Cityのオプションを判断する。ブラウザの実装形態において、County、State、およびCityはそれぞれ、<select>要素によって表される。Countryに対するイベントハンドラはCounty<select>要素にアタッチされ、Stateに対するイベントハンドラはState<select>要素にアタッチされる。例えば、「米国」などの国が選択される時、Countryのイベントハンドラは呼び出され、このイベントハンドラは「米国」の値を得て、{Country=“USA”、State[]}のメッセージを作成し、このメッセージをバックエンドプロセスに送って「米国」の全ての州を得て、State[]における値を記憶する。State[]の値は次いで、Stateを表す<select>に設定される。StateおよびCityに対するイベントハンドラは同様である。
【0080】
本発明の一実施形態では、カスケードはリストとしてデータ構造によって表され、この場合、リストのそれぞれの要素は5つのメンバ、すなわち、ID、Next、SelectedValue、eventHandler、およびOptionsを有する。IDは要素の名前を保持し、Nextはリストの次の要素のNameの値を有し、SelectedValueは選択された値を保持し、eventHandlerは要素のイベントハンドラ関数を保持し、Optionsは値のセットを保持する。Optionsから値を選択し、かつSelectedValueを設定するアクションは、リストの要素に対して行われ得る。アクションを終えると、eventHandlerにおける関数は引数として要素を渡すことによって呼び出される。
【0081】
IDは任意の名前を取ることができるため、アルゴリズムは抽象的である。これらは、Country、State、City、またはCompany、Department、Employee Name、またはCategory、Type、Product Nameとすることができる。アルゴリズムは、任意の数の要素が可能とされるため、一般化される。
【0082】
次に、リスト構造はHTML上でマーキングされる。IDおよびNextを除いて、<select>要素は他全てを有する。ここでのCGDMの定義において、それぞれの値は名前を有するものとするため、CGDM上では、Nextのみが必要とされる。値の名前が、IDプロパティをHTMLタグの全ての要素に加えることによって実装されると仮定する。
【0083】
カスケードのマークアップ規則は、それぞれの<select>要素に対してNextプロパティを加えるためのものであり、この値はカスケードにおける次の<select>のIDの値である。1つのHTMLページにおける2つ以上のカスケードが可能である。
【0084】
一般に、マークアップ規則は、アルゴリズムの任意の入力インスタンスに対して、これに対応する拡張コンテンツがあり、かつ、入力インスタンスおよびこの全データ特徴が拡張コンテンツから演繹できるように、CGDMの横文規則を使用してCGDMのコンテンツを拡張するための規則として定義される。マークアップ規則はアルゴリズムに関連付けられる。
【0085】
PF関数は、異なるカスケードにおいてさえも、全ての<select>要素に対する選択イベントのイベントハンドラであってよい。この例では、PFにはcascadePFという名前が与えられる。cascadePFの入力は、選択された値、およびイベントを生成する<select>要素である。HTML全体のドキュメントオブジェクトモデル(DOM)構造はまた、cascadePFにアクセス可能である。PFのCGDMは、CGDM={{the selected <select> element}、DOM}と見なすことができ、入力部分は、{{the selected <select> element}、{All <select> element of the cascade}}であり、出力部分は、{{the next element of the selected <select> element}}である。
【0086】
全てのカスケードは、種々のHTMLページにおいてさえも、同じcascadePFを使用し、また、同じCGDM名を使用できるため、cascadePFのVMSSストアはいずれのルックアップに対しても1つのVMSSを返すように構成可能である。cascadePFの例示のCF関数は、initRestElement(CurrentElementName名)であり、これは、ID=nameの現在の要素について、次の要素から最後の要素まで全てに対するオプションを再設定し、Results r=getValuesFromBackend(Condition condition、Results r、BackendProc p、CGDMNamepCGDMName)、これは、CGDMをパッケージングし、バックエンドプロセスpを呼び出し、pCGDMNameという名前のCGDMを渡し、setOption(Results r)とする、つまり、ID=r.nameの<select>のオプションを設定する。CGDMは次のフォーマットを有する。
{pCGDMName: {
{Input: {Condition:{name:value}}}, {Output:{Results:{r:NULL}}
}
【0087】
cascadePFは<select>要素全てに対して使用できるため、PFが受信する、選択された<select>要素は、異なる<select>要素に対して選択が行われる時、異なる。そのため、直接可変マッピング(VM)は不可能である。しかしながら、CFの引数はマークアップおよびCGDMから演繹可能である。これを規則ベースのVM(RBVM)と呼ぶ。
【0088】
バックエンドにおいて、handleDBSeletionと呼ばれるPFを有することができ、これは、設定されたSQL選択実装形態を包含する。通常、<select>に対するオプションの値は、SQL選択を作動させることによって取得可能である。cascadeOptionsCGDMをCGDMの名前として割り当て、getValuesFromBackendはhandleDBSelectionに渡される。
【0089】
RBVMを使用して、PFに対するVMSSは以下になる。
{initRestElement: RBVM}
{getValuesFromBackend: {{condition: RBVM }, {r : RBVM }, {p: handleDBSelection },{pCGDMName: cascadeOptionsCGDM }}}
{ setOptions: { {r: getValuesFromBackend.r}}
【0090】
CFの呼び出し元は以下になる。
initRestElementCaller(RBVM, CGDM, CFResults)
{
name = get the ID’s value of the selected <select> element
initRestElement(name);
}
getValuesFromBackendCaller(RBVM, CGDM, CFResults)
{
(name, value) = get the ID’s value and the selected value of the selected
<select> element
name = get the ID’s value of the next element of the selected <select> element
r = getValuesFromBackend(value, name, handleDBSelection, cascadeOptionsCGDM);
add r to CFResults.
}
setOptionsCaller(RBVM, CGDM, CFResults)
{
r = get getValuesFromBackend.r from CFResults
setOptions(r);
}
【0091】
RBVMの利点は、新しいカスケードが加えられる時、またはカスケードの長さが延長される時、コードの規則処理部分が変更されないことである。選定したアルゴリズムが抽象的でありかつ一般化されるため、全てのカスケードは同じコードを使用できる。
【0092】
CFCallersの実装形態は、マークアップ規則による影響を受ける。CFの新しいCFCallerはマークアップ規則に対して開発される必要がある。マークアップ規則に起因して、CFは2つ以上のCFCallerを有することができる。
【0093】
マークアップは、相互参照としてCGDMの値の名前を使用して、等しいまたはより表現的な横文規則を有する別個のメッセージに対して行われ得る。別個のマークアップメッセージを、CGDMのプロパティシート(PS)と呼ぶ。いずれのCGDMもこれにアタッチするPSを有することができる。開発時間において、CGDMの名前インスタンス(NI)が既知であるため、PSは開発時間にCGDMにアタッチできる。
【0094】
本発明の例示の実施形態を説明したが、本発明は、開示された実施形態に限定されず、本開示の趣旨および範囲内に含まれるさまざまな修正および等価の配置構成に及ぶことが意図されることは、理解されたい。
【発明を実施するための形態】
【0012】
本発明概念は、本開示の例示
的な実施形態が示されている添付の図面を参照して、より詳細に説明される。図面全体を通して、同じまたは同様の参照番号は、同じまたは同様のコンポーネントを表すために使用される。しかしながら、本発明概念は、さまざまなやり方で実装可能であるため、本明細書に開示される実施形態に限定されると理解されるべきではない。むしろ、
これらの実施形態は、当業者に本開示の範囲を伝えるために、本開示を
完全かつ完璧な理解
のために提供される。
【0013】
本明細書は、コンポーネントベースのソフトウェアシステムおよび開発方法につい
て説明する。下記の説明では、本発明をより
完全に理解してもらうために、多数の具体的な詳細が示される。しかしながら、本発明が、これらの具体的な詳細
を用いずに実施可能であることは、当業者には明らか
であろう。他の例では、本発明を不明瞭にすることを回避するために、周知の特徴は詳細
に説明されていない。
【0014】
本明細書において
参照されるコンピュータコードデバイス(例えば、
メソッド、クラス、ライブラリ)は、データ記憶媒体に記憶
することができる。本明細書において使用され
る「データ記憶媒体」と言う用語は、コンパクトディスク、ハードディスク、フロッピーディスク、テープ、光磁気ディスク、PROM(EPROM、EEPROM、フラッシュEPROMなど)、DRAM、およびSRAMなどの全てのコンピュータ可読媒体を
意味する。
【0015】
図1は、本発明概念の例示
的な実施形態に
よるソフトウェアを
組み立てる方法を示す高レベルダイアグラムである。
【0016】
この方法は、ユーザが、計算関数(CF)をコード化できるようにする
ステップ(S101)を含む。例えば、テキストフィールドを含むCFグラフィカルユーザインターフェース(例えば、CF−GUI)は、ユーザがCFのコードを
入力できるようにするコンピュータプログラムによって提供可能である。例えば、CF−GUIは、ユーザによって選択される
と、ユーザが現在のCFのコード化を完了したことをプログラムに通知する第1のボタンを含む。例として、CFは、計算を
実行する、データベースへのクエリを行う、または、ウェブページ上にグラフィックまたはテキストを表示する、
ようにコード化
される。例えば、計算の実行は、クエリによって返された結果に
対して数学的計算を実行することができ
る。一実施形態では、それぞれのCFは、ユーザによって一意の名前が与えられ、かつ、1つまたは複数の入力パラメータ(本明細書ではCF入力パラメータと呼ばれる)を
受け取り、出力パラメータ(本明細書ではCF出力パラメータと呼ばれる)を返す
ようにコード化される。例えば、CF入力パラメータおよびCF出力パラメータは、整数、浮動小数、文字列、配列、ポインタなど
である。
【0017】
この方法は、次いで、ユーザがCFをコード化し終えたかどうかを判断する
ステップ(S102)を含む。例えば、第1のボタン
を選択
すると、ユーザ
は別のCFを作成することを所望していることを
示すことができる。例えば、CF−GUIは、ユーザによって選択
されると、ユーザがCF50を作成し終えたことをプログラムに通知する第2のボタンを含む。
完成したCFは
、他のコーダーによって利用できるように、CFデータベース60に記憶
される。
【0018】
この方法は、次に、ユーザが、利用可能なCFの1つまたは複数を使用して部分関数(PF)をコード化できるようにする
ステップ(S103)
を含む。例えば、プログラムは、
第2のGUI(例えば、PF−GUI)を表示することにより、GUI
内のCFデータベース60に記憶された利用可能なCFの選択可能なリスト
を表示するとともに、選択されたCF
と、PF内のそれらの実行順序
とを示すペイン
を表示する。例えば、ユーザは、対応する
PFに対応するCFのインスタンス
が必要になる度に、利用可能なCFのうちの1つを選択し
、選択
したインスタンスを、ユーザがCFインスタンス
の実行を望む順序でペインに挿入する
ことができる。
【0019】
この方法は
、次に、ユーザが全てのPFを作成し終えた
時点をプログラムが判断する
ステップ(S104
)を含む。例えば、PF−GUIは、ユーザによって選択され
ると、ユーザが全てのPF70を作成し終えたことを
示すグラフィカルボタンを含
む。PF70は、他の
コーダーが利用できるように、PFデータベース80に記憶
される。
【0020】
この方法は
、次いで
、PFデータベース80に記憶される利用可能なPF70の1つまたは複数を使用して
ユーザがソフトウェアを作成できるようにする
ステップ(S105)
のためのプログラムを含む。例えば、コンピュータプログラムを使用して、ユーザが接続コード
および利用可能なPF70の選択可能なリストを
入力できるようにするテキストフィールド
を表示する第3のGUIを
起動する。例えば、ユーザは、対応するPFを、コンピュータプログラムの接続コード
の特定の場所に挿入するために
、PFをリストから選択
する。一実施形態では、コンピュータプログラムは、インタープリタによって解釈されるフォームであってよい。
【0021】
図2は、
図1の方法を
実行するために使用可能
な例示
的なコンピュータシステム1000を示す。
図2を参照すると、コンピュータシステム1000は、例えば、中央処理装置(CPU)1001、ランダムアクセスメモリ(RAM)1004、プリンタインターフェース1010、ディスプレイユニット1011、ローカルエリアネットワーク(LAN)データ伝送コントローラ1005、LANインターフェース1006、ネットワークコントローラ1003、内部バス1002、および
、例えばキーボード、マウス等の1つまたは複数の入力デバイス1009
を含む
。図示されるように、システム1000
には、リンク1007を介してデータ記憶デバイス、例えばハードディスク1008
を接続
してもよい。上述されたGUIは
、ディスプレイユニット1011上に
表示可能である。上述されたCF50、PF70、プログラム、および
、組み立てられたソフトウェアは、メモリ1004および/またはハードディスク1008に記憶
される。
【0022】
図3は、PFをコード化す
る図1のステップS103を
実行する本発明の例示
的な実施形態による方法を示す。
図3を参照すると、
この方法は、計算目標データメッセージ(CGDM)の入力を受信するように部分関数を構成する
ステップ(S301
)を含む。
【0023】
例示
的な実施形態では、CGDMは、i)入
力および出力部分、ii)名前
と値
のフォーム(例えば、全ての値
、および、後の計算において変数に割り当てられる値のサブ構造は、名前を有す
る)、
および、iii)いくつかの
構文規則(例えば、HTML、XML、またはJSON)に従った構造
、を有する。2つのCGDMは、i)
それらの入力および出力部分の両方が同じ構造を有し、かつii)該構造
内の全ての名前が同じである場合、同じである。CGDMは、PFの引数として使用される。いずれのPFも
引数
を一つだけ持つことができる。PFは、1つまたは2つ以上のCGDMを処理できる。それぞれのCGDMは対応するVMSSを有する。VMSSは、CGDMの計算目標をどのように達成するかをPFに命令する。
【0024】
全てのPFは同じインターフェースを有する。例えば、それぞれの部分関数は
、CGDMで起動されるように構成される。
CGDMは、部分関数の起動パラメータまたは引数と呼ばれる。CGDMは、入力パラメータX(例えば、入力:X)、および出力パラメータY(例えば、出力:Y)を含
む。この場合、XおよびYは名前(キー)
と値
のフォームを有する任意のデータ構造
である。X部分において、名前は
、値を有し、Y部分の値は、部分関数によって埋められるように空白
になっている。2つのCGDMは、入力部分および出力部分の両方が同じ構造を
持ち、かつ
、該構造における全ての名前(キー)が同じである場合、同じである。それぞれのCGDMは、一意の名前を有する。この入力部分セットの全ての名前(キー)の値を有するCGDMは、CGDMのインスタンスと呼ばれる。PFは、
値が埋められたCGDMの出力部分と同じデータ構造を返す。PFは
、任意のCGDM
を引数として受け入れる。
【0025】
PFは1つまたは複数の計算関数(CF)を包含する。
任意の関数
をCFとすることができる。PFがCF
を実行する
方法は、CGDMだけでなく、可変マッチング構造(VMS)と呼ばれるデータ構造によっても
決定されるため、
PFは、いずれのCGDMも引数として受け入れ可能である。PFはCF呼び出し元を通してCFを実行する。CF呼び出し元は、引数として、CGDM、VMS、およびCFResults
構造体を受け入れる。
PFが呼び出すために、
統一されたインターフェースが与えられる。CF呼び出し元は、i)CGDMおよびVMSに従ってCFおよび呼び出しの引数を準備し、ii)CGDMおよびVMSに従ってCGDMの出力部分を設定し、iii)後のCFの実行による使用を可能にするために、結果をCFResultsに保存する。
【0026】
本発明の一実施形態では、2つの型のCF関数が存在してもよい、i)完全CFと、ii)部分CFである。完全CFは、PFを呼び出さず、インターフェース要件
は完全に完了している。部分CFは
、PFを呼び出し、インターフェース要件は、部分的に終
わっている。インターフェース要件がどのように
実行されるかは、どのPFが呼び出されるか、およびPFが何を行うように構成されているかに
依る。
【0027】
CFがPFを呼び出す時、CGDMを準備し、かつ、引数としてのCGDMを呼び出したPFに渡す。CGDMにおける値の命名は、
一貫した命名規則に従
う。CFが呼び出すPFの名前、およびCFが作成するCGDMの名前は、CFのVMSにおいて指定可能である。
【0028】
VMSSは
、CFを接続する制御を行い、部分CFは
、PFを接続する制御を行う。ソフトウェアは、
特定の設計に従って、PFおよびCFを接続するためにVMSおよびVMSSを操作することによって形成可能である。
【0029】
1つのCGDMについ
て、全てのPF(2つ以上のPFを伴う場合がある
)およびCFの実行シーケンスを呼び出して、
CGDMの計算構造の計算目標を達成する。
【0030】
図6Aは、部分関数に引数として渡され
るCGDMの一例である。この例では、CGDMは、JavaScript(登録商標である)Object Notation(JSON)フォーマットを有する。CGDMは、1つまたは複数の入力キー
と値
のペアおよび出力キー
と値
のペアを含む。CGDM
には、入力キ
ーおよび出力キー
と値
のペアを抽出するためにパーサーまたはインタープリタ
が使用
できる識別子を含
まれている場合がある。
【0031】
図6Aに示される例において、CGDMにおける入力パラメータ識別子は「Input:」という名称が付けられ、出力パラメータ識別子は「Output:」という名称が付けられる。例えば、CGDMを
構文解析するパーサーが「Input:」の識別子を認識後、パーサーは、次の左中括弧「{}と右中括弧「」」との間に位置する次の要素がキー
と値の入力パラメータのペアであると
みなすことができる。例えば、CGDMを
構文解析するパーサーが「Output:」の識別子を認識後、パーサーは、次の左中括弧「{」と右中括弧「}」との間に位置する次の要素がキー
と値
の出力パラメータ
のペアであると
みなすすることができる。例えば、キー
と値
のペアは、セミコロン「;」によって
区切ることができ、
特定のキー
と値
のペアのキーおよび値はコロン「:」によって
区切ることができる。
【0032】
図6Aは、入力パラメータ
のキー
と値
のペアを示すための「Input:」という用語の使用、出力パラメータ
のキー
と値
のペアを示すための「Output:」という用語の使用、キー
と値
のペアの開始を示すための「{」という用語の使用、キー
と値
のペアの終わりを示すための「}」という用語の使用、および、パーサーがキーと値とを区別できるようにするための「:」という用語の使用を示すが、本発明はこれらに限定されない。例えば、これらの用語は、
作成者によって所望されるように、他の語または記号に変更されてよい。
【0033】
図3に戻って参照すると、
この方法は、ユーザが計算関数(CF)の新しいインスタンスを呼び出す
ことを部分関数
に所望しているかどうかを判断する
ステップ(S302
)を含む。新しいインスタンス
とは
、特定
のCF
の挿入が初めてリクエストされた
こと、または、リクエストされた挿入がCF(例えばCF2)のインスタンスを異なるCF(例えばCF1)の後に挿入させる
こと、を意味する。説明を簡単にするために、
図6Bに示されるような、第1の計算関数CF1および第2の計算関数CF2のみが利用可能であると仮定する。ユーザがCFの新しいインスタンスをリクエストしている場合、
この方法は、特定のCFを
識別するためにラベルを挿入する(S303)。例えば、ユーザ
が、第1の計算関数CF1が使用されることをリクエストしているため、
この方法は、「CF1」などのラベルを可変マッチング構造シーケンス(VMSS)に挿入して、第1の計算関数CF1が呼び出されるように
識別する。VMSSは、
完成すると、ペアのシーケンスを含むことになり、この場合、それぞれのペアは所与のCF(例えば、CF1)およびVMS(例えば、CFName、VMS)の名前を含む。例えば、
完成したVMSSは、{{CF1、VMS1}、…、{CFN、VMSN}}のペアを含むことができ、この場合Nは1またはそれ以上である。VMSSはCGDMに関連付けられ、VMSSにおける全てのVMSはCGDMの全ての名前
(キー
)の値を
完全に埋める。すなわち、VMSSはCGDMの計算目標を満たす。
つまり、VMSSは、PFに、CGDNの計算目標をどのように達成するかを命令する。
【0034】
次に、
この方法は、CFインスタンスの入力パラメータをCGDM内の入力パラメータにマッピングし、かつ、CFインスタンスの出力パラメータをCGDM内の出力パラメータ
にマッピングする可変マッチング構造(VMS)を、ユーザが構成できるようにする
ステップ(S304)
を含む。VMSは、PFに、1つのCFをどのように実行するかを命令する。
【0035】
例えば、
図6Bは、それぞれのキーペアがセミコロン「;」で分離される複数のキーペアを有する第1のCF1 611のために構成される第1のVMS601の例を示す。例えば、第1のVMS601の第1のキーペア「a:x」における第1のキー「a」は、第1のCF1 611の第1の入力パラメータ「a」に対応し、第1のキーペア「a:x」における第2のキー「x」は
図6Aに示されるCGDM600の第2の入力パラメータ「x:2」に対応する。例えば、第1のVMS601の第2のキーペア「b:y」における第1のキー「b」は第1のCF1 611の第2の入力パラメータ「b」に対応し、第2のキーペア「b:y」における第2のキー「y」は
図6Aに示されるCGDM600の第3の入力パラメータ「y:3」に対応する。例えば、第1のVMS601の第3のキーペア「c:z」における第1のキー「c」は第1のCF1 611の出力パラメータ「c」に対応し、第3のキーペア「c:z」における第2のキー「z」は
図6Aに示されるCGDM600の出力パラメータ「z:NULL」に対応する。
図6Cは、CFに対する呼び出しの例を示す。CFの引数が複合型である場合、CGDMの入力部分に
おいて同じ複合型にマッピング
されると、引数の名前がCであり、かつ同じ型(CGDMの入力部分のサブ構造)の名前がDであると仮定する場合に、マッピングは「C:D」と指定可能である。CGDMの入力部分における同じ複合型にマッピング
されず、そのメンバがCGDMの入力部分において
配布された名前にマッピング
される場合、複合型のそれぞれのメンバのマッピング
を指定
する必要がある。複合型がTであり、かつCGDMの入力部分における名前がd1、d2、…であると仮定する場合、マッピングは「C、T(「member1:d1」、「member2:d2」…)」と指定可能である。Cが配列型である場合、マッピングは「C:Array[d1、d2、…]」と指定可能である。
【0036】
次に、
この方法は、構成されたVMSを、部分関数CFに関連付けられたVMMSに挿入する(S305)。VMSは、
識別されたCFに関連付けられていることをパーサーが認識できるように挿入される。例えば、ラべル「CF1」より下の
図6Bに示される第1のVMS601は、PFがVMSSに挿入されておりかつ第1の計算関数CF1に関連付けられているように構成されるVMSの一例である。
この方法は、次いで、ユーザが
完了したかどうかを
判定する
ステップ(S305)を含む。例えば、
ユーザが計算関数(CF)を選択する
ためにGUIを用い、計算関数(CF)に入れ終わっていることを
示すことができる。ユーザが別の計算関数(CF)、または、先に選択された計算関数(CF)の別のインスタンスを選択す
る場合には、
この方法はステップS302に進む。例えば、ユーザが同じCF(例えば、再びCF1)の別のインスタンス
を入力し、CGDMの異なるパラメータをCFに送る
場合、
この方法はステップS304に進むことになる。例えば、これによって、第1の計算関数CF1を
識別する同じラベル(例えばCF1)の下
に第2のVMS602が挿入されることになる可能性がある。しかしながら、ユーザが新しい計算関数(例えば、CF2 612)を選択する場合、
図6Bに示されるように、第2のラベル(例えばCF2)および第3のVMS603が挿入されることになる可能性がある。
【0037】
CGDMの入力から値を取ること以外に、CFの引数は、また、1つまたは複数の先に実行されたCFの結果から値を取ることができる。例えば、PFが第1のCFを実行する時、CFの実行の結果をPFの内部にあるデータ構造(例えば、CFResults構造)またはリストに記憶でき、それによって、PFが同じ第1のCFまたは第2のCFを再実行する場合、その結果は、対応するCFが必要に応じて該結果に基づいて演算できるように、どちらのCFにも利用可能である。
図7に示されるように、PF701がPF呼び出しを通して呼び出される時、PF701はCFCaller関数を通してCFを実行する。CFCaller関数は、複数の利用可能なCFCaller関数を記憶する外部記憶領域702(例えば、CFCallerストア)からロードされてもよい。CFCaller関数は、入力として、CGDM、CFに関連付けられたVMSS703、およびCFResults構造704を
受け取る。VMSS703は、外部記憶領域705(例えば、VMSSストア)からロードされてよい。CFCaller関数は、下記を行う。1)CFの引数を宣言し、かつVMSS703、CGDM、およびCFResults構造704内のCFResultsを使用してそれぞれの引数を初期化し、2)引数によってCFを実行し、3)その結果をCFResults構造704に加えて、VMSS703に従ってCGDMの出力(例えば、CGDM.output)を設定する。一実施形態では、それぞれのCFは、関連のCFCaller関数を有し、それぞれのCFは同じインターフェースを有する。VMSSストアは、PFが呼び出される全てのCGDMに対する全てのVMSSを包含する。CFCallストアは、PFが包含する全てのCFに関連付けられたCFCaller関数を包含する。
【0038】
図4は、本発明の例示
的な実施形態に従って、受信されたCGDMのPF呼び出しを実行するための方法を示す。
この方法は、CGResults構造704をクリアする
ステップ(S401)
と、CGDMの名前を使用してVMSSストア705から対応するVMSS703を検索する
ステップ(S402)
と、VMSS703におけるそれぞれの要素について、要素の名前部分を使用してCFCallerストア702からCFCaller関数を検索し、かつ要素のVMS部分、CGDM、およびCFResults構造704によって、検索されたCFCaller関数を呼び出す
ステップ(S403)
と、(この時値が埋められている)CGDMの出力をコピーする
ステップ(S404)
と、そのコピーを返す
ステップ(S405)と、を含む。
【0039】
CFは他のPFを呼び出すことができる。これを行う
方法は、CGDMを作成し、かつ、引数として作成されたCGDMをこの呼び出しに渡す
方法である。CFが、計算するCGDMにおける値を、作成するCGDMに渡す場合、CFは、計算するCGDMにあるのと同じ名前を使用す
る。CFが、CFResults構造704における値を、作成するCGDMに渡す場合、CFResults構造704にあるのと同じ名前を使用す
る。これは名前
整合性規則と呼ばれる。CFが別のPFを呼び出すためのCGDMを作成する時、名前
整合性規則に従うものとする。
【0040】
全てのPFが同じインターフェースを有するため、
異なるPFを呼び出す際の違いは名前
だけである。PF名前引数は、呼び出すPF全てに対するCFに加え
ることが可能であり、その後、呼び出すPFはCFのVMSにおいて指定可能である。また、作成するCGDMの名前は、VMSにおいて指定可能である。そのため、CFが呼び出すのはどのPFか、および使用するCGDMの名前が何かについては、CFの開発後に
決定可能である。
【0041】
一実施形態において、データ記憶パラメータの全ては、名前(キー)
と値
のフォームである。データ記憶フォーマットは、CGDMと共に種々の
構文規則を有することができる。
【0042】
データ記憶域およびCGDM
内の名前は、
異なるユーザよって
異なる時間に作成
される可能
性があるため、矛盾する場合がある。名前
と値のセットは、セットにおける同じ名前が命名された値に対して同じ意味論的意味を記述し、かつ、セットにおける異なる名前が命名された値に対する異なる意味論的意味を記述する場合、
整合性があると言われる。
整合性のある名前
と値のセットは、名前空間(NS)を形成する。PFおよびこのCFは1つのNSにおいて演算する必要がある。CGDMおよびデータ記憶域が1つのNS
にない場合、
変換をCGDMに適用して、それらを1つのNSに変換
できる。1つのCGDMについて、CGDMの計算目標を達成するために
、全てのPFおよびCFの実行シーケンスが呼び出される。
【0043】
図5は、本発明の例示
的な実施形態によるソフトウェア開発プロセスを示す。
このプロセスは、ソフトウェアの全ての入力要件および出力要件をCGDMフォーマットに変換する
ステップ(S501)
と、その変換から生成されたそれぞれのCGDMの計算構造を設計し、マークアップ規則によってCGDMをマーキングし、必要に応じて新しいマークアップ規則を作成し、必要に応じて、プロパティシートを使用して新しいマークアップ規則によってCGDMをマーキングする
ステップ(S502)
と、設計された計算構造をサポートするようにデータ記憶域を設計する
ステップ(S503)
と、既存のPFおよび/またはCFを選択し、新しいマークアップ規則が加えられる場合、必要に応じて新しいPFおよび/またはCFを開発し、関わるCFに対して新しいCFCallerを開発する
ステップ(S504)
と、開発されたおよび/または選択されたPFならびにCFを接続するためにVMSおよびVMSSを作成する
ステップ(S505)
とを含む。
【0044】
一実施形態では、ステップS505は、入力部分の値、すなわち、CGDMの名前インスタンス(NI)なしでCGDMを呼び出すことによって実施される。NIは、
入力部分および出力部分の両方に値のな
いCGDMである。一実施形態では、他のPFを呼び出すそれぞれのCFは開発モード(DV)処理を有する。DVにおいて、CGは、計算するCGDMのNIを取り、かつ、計算するCGDMに対して作成する全てのCGDMのNIを、(例えば、ファイルのような)持続的データ記憶域に出力する。出力されたNIは呼び出されたPFのCGDMのコンテンツを指定する。VMSおよびVMSSはそれに応じて作成可能である。
【0045】
図8は、本発明概念の例示の実施形態に従って、利用可能な部分関数(PF)の1つまたは複数を使用してソフトウェアを生成する方法を示す。この方法は、利用可能なPFからPFを選択する
ようにユーザにクエリを行う
ステップ(S801)と、入力名前(キー)
と値
のペアおよび出力キー
と値
のペアを入力
するようにユーザにクエリを行う
ステップ(S802)
と、
入力されたデータに基づいてCGDMをフォーマットする
ステップ(S803)と、入力引数としてフォーマットされたCGDM
を使用してPF呼び出しを挿入する
ステップ(S804)
と、ユーザがPF呼び出しを
完了したかどうかを
判定するステップ(S805)
とを含む。ユーザが
完了していない場合、
この方法は、
ステップS801に進み、新しいPFを選択する
ようにユーザにクエリを行
う。ユーザが
完了している場合、
この方法は終了する。
【0046】
図9は、本発明の例示
的な実施形態に従って、PF呼び出しを含むソフトウェアを解釈する方法を示す。
この方法は
、特定のPF、および、PF呼び出しに引数として渡され
たCGDMを、
識別するためにPF呼び出しを
構文解析する
ステップ(S901
)を含む。
この方法は次いで、特定されたPFに関連付けられたVMSSをロードし、かつ、特定されたCGDM内の入力キー
と値
のペアおよび出力キー
と値
のペアを
識別する
ステップ(S902)
を含む。
この方法は、次いで、ロードされたVMSSの次の行を
構文解析する
ステップ(S903)
を含む。
この方法は次いで、
構文解析された行がCFラベルを含むかどうかを判断する(S904)。例えば、次の行が
図6Bに示されるVMSSの第1の行である場合、
この方法は、CF1のCFラベルを
識別したと結論付けることになる。CFラベルが
識別されたと判断される場合、
この方法は、判断されたCFラベルから呼び出すための特定のCFを
識別し、かつ、VMSSの次の行をパースする。その後、
この方法が、次の行がCFラベルでない(すなわち、次の行がVMSに対応する)と判断する場合、
この方法は、VMSの現在のキーペアの第1のキーを特定されたCFの選択されたI/Oパラメータにマッチさせ、かつ、現在のキーペアの第2のキーを特定されたCGDMの選択されたI/Oキーにマッチさせる(S906)。例えば、VMS601がパースされ、かつ、パースされた現在のキーペアが「a:x」であり、特定されたCFがCF1 611である場合、方法は、現在のキーペア「a:x」の第1のキー「a」をCF1 611の入力パラメータにマッチさせ、かつ、現在のキーペアの第2のキー「x」をCGDM600の入力パラメータx:2の入力キー「x」にマッチさせる。次いで、
この方法は、CFの選択されたI/Oパラメータが選択されたI/Oキーの値を渡されるように、特定されたCFへの呼び出しをフォーマットする
ステップ(S907)ことを含む。例えば、CFL1 611の入力パラメータ「a」は値「2」が渡されるが、これは、第1のキー「a」が「x」にマッチさせられ、xは2に設定される(例えば、「x:2」)からである。
この方法は次いで、VMSのあらゆるキーペアに対するこれらのマッチングステップを繰り返す。
この方法は、
完了したかどうかを判断するために、VMSの最後のキーペアがパースされたかどうかを判断する(S908)。
この方法が終えられていない場合、ステップS906に進むことによって、VMSの次のキーペアに進行する。
この方法が
完了している場合、ステップS902に進んで、VMSSの次の行を
構文解析して、先に
識別されたCFラベル下で新しいCFラベルまたは別のVMSのどちらかを見つける。
【0047】
図6AはCGDMのJSONフォーマットの使用を示すが、本発明はこれに限定されない。例えば、JSONフォーマットは、ハイパーテキストマークアップ言語(HTML)フォーマットまたは拡張マークアップ言語(XML)フォーマットと置き換え可能である。マークアップ規則
は、CGDMの
構文規則を使用してCGDMのコンテンツを拡張する規則として定義される。これにより、アルゴリズムの任意の入力インスタンス
には、対応する拡張コンテンツが
存在し、入力インスタンスおよび
その全データ
の特徴は、拡張コンテンツから差し引かれる。マークアップ規則は、アルゴリズムに関連付けられる。
【0048】
本発明の一実施形態では、ソフトウェアへの入力データメッセージは、HTMLフォーマットであり、CGDMはJSONフォーマットであり、データ記憶域は、
ウェブ開発環境を可能にするリレーショナルデータベースであ
る。入力を
処理する部分関数はウェブブラウザにおいて
実行され、フロントエンド部分関数と呼ばれる場合がある。サーバ側で
実行させる部分関数はバックエンド部分関数と呼ばれる場合がある。バックエンド部分関数はデータベースに接続可能である。
【0049】
HTML入力を処理する1つのPFは、線形カスケード入力を処理する
ものであってもよい。線形カスケード入力の例には、州を選択後、
郡を選択し、次いで市を選択する入力
である。この入力は、<select>のリストおよび現在の選択のリストであり、出力は次のオプショ
ン配列である。マークアップ規則は、リストを表現する任意の規則とすることができる。マークアップ規則の例には、第1のリストを<select Cascade=“cs1”cs1=”1”mName=”name1”…>とマーキングする、第2のリストを<select Cascade=”cs1”cs1=”2”mName =”name2”…>とマーキングする、第3のリストを<select Cascade=”cs1”cs1=”3”mName =”name3”… >とマーキングする、などがある。カスケードは計算名であり、Cascade=”cs1”はcs1=’n’であるインスタンスcs1を宣言し、その後、リストにおける位置を宣言する。PFは<select>要素のonSelectイベントによってトリガされる。同じonSelectイベントハンドラのcascadeHndlerは全ての<select>に対して設定される。cascadeHndlerはこの型の入力要件および出力要件をハンドリングする部分関数である。ハンドラーのアルゴリズムは以下になる。
Get instance name from Cascade=”instance_i”;
Get position number from instance_i=”n”;
Get selected value v and name n1 of the current <select>
Get name n2 of the next <select>
Send a data message of the form
{{ “input”:
{“n1” : v}
},
{ “output”: {
[{“n2”:0}]}
}}
to a backend component
Set return result to the next <select>
【0050】
1つのHTMLデータメッセージにおける任意の長さの任意の数のカスケード入力は、この部分関数によって
処理することが可能である。
【0051】
入力の別のケースは、スターカスケード入力と呼ばれ、この場合、いくつかの<select>のオプションは、
選択した布に基づいて利用可能なサイズおよび色のオプションが決定される場合のように、1つの<select>によって決定される。中央マークについて、<select star=”star1”star1=”name list of all end select node”>である。エンドノード<select>がマーキングされる必要はない。中央の<select>の選択が
完了すると、以下のフォームのデータメッセージがバックエンドに送られる。
{
{“input”:
{“centerName” : “v”}
},
{ “output”: {
[{“n1”, “”}],
[{“n2”, “”}],
…
}}
}
この場合、n1およびn2はエンドノードの名前である。返された値が配列ではなく単一値であり、かつエンドノードがテキストまたは数入力である時、これはオートフィルになる。カスタマの名前が選定されると、そのアドレスがオートフィルされる。
【0052】
入力候補
処理は、オートフィルの逆
の操作である。
現在の入力値およびいくつかの他の入力値を除いて、部署および
役職の入力が、被雇用者の名前入力の候補
を制限するように、現在の入力のオプションを制限することができる。現在の入力値がテキストである時、
候補値に関して、2つ以上の解釈がある場合がある。例えば、
候補値が、このテキスト
から始まるか、またはテキスト
を含む場合がある。そのため、さらなる情報が以下のような値に対して提供される必要がある。
{
{“input”: {
{“otherValues1”: “v1”},
{“otherValues2”: “v2”},
{“currentValue”: {
{“value”: “v3”},
{“type”: “LIKE”}
}
}
…
},
{ “output”: {
[{“n1”, “”}]
}
}
}
ここで、n1は現在の入力要素の名前である。
【0053】
第1の要素<input rangeInput=”ri1”ri1=”1”…>、第2の要素<input rangeInput=“ri1”ri1=”2”…>、または、選択入力について、第1の要素<select rangeInput=”ri1”ri1=”1”…>、第2の要素<select rangeInput=”ri1”ri1=”2”…>といったマックアップ規則を有する範囲入力を実行可能である。アルゴリズムは、
現在の入力チェックを受け入れる前に、他の入力によって
設定された制約
を満たすか、または
、一方の入力が他
方の入力のオプションを制限するかどうか
を確認する。入力フォーマット選定に起因して、日にち範囲入力、選択範囲入力、数値範囲入力のように
、いくつかの異なる
タイプの範囲入力が存在する場合がある。
【0054】
フォームは、
いくつかの異なる
タイプの入力要素(テキスト、数値、リストオプション、範囲入力、カスケード入力…)を包含する。フォーム送信のアクションは、全ての要素に対する(名前、値)ペアを収集することである。フォーム送信のマークアップ規則は、入力要素の
タイプごとにタイプシンボルを定義
する。
タイプが異なる
ということは、名前
と値へのアクセス
に異なる方法を使用する必要があることを意味する。それぞれの入力要素
に適切なタイプのマークを付ける。フォーム送信
のアルゴリズムは以下になる。
For each type {
Get all input element for the type
For each input element of the type {
Get the name and value, pack the name value into JSON format.
}
}
mark the data message as ADD or MODIFY
send the JSON data message to a backend address
【0055】
フォーム送信は、新しいデータの
追加ADDまたは古いデータの
修正MODIFYのどちらか
である。修正
のために、データは最初に、バックエンドからロードされる。
このとき、いくつかの追加のデータ、キー、または参照番号
もロードされる。次いで、データは修正され、バックエンドに送られる。
追加のキーデータは、クッキーなどの同様の機構によって
処理可能である。クッキーの1つの
実行形態は、HTMLのいくつかの
非表示要素を
特殊なタグとともに使用することである。新しいデータを
追加する場合、この
追加のキーデータは使用されない。そのため、フォーム送信
のPFは、修正と追加とを区別することができる。PFのフォームは、定義された
タイプの任意の数の入力要素
を持つ任意のフォームのフォーム送信を
処理可能である。
【0056】
検索ページは、
検索条件としての1つまたは複数のデータ入力要素、および、
検索結果を表示するための2次元データグリッドを包含する。データグリッドのそれぞれの列には
名前を付けることができる。データ
検索を送信
するために、バックエンドに送られるJSONデータメッセージは、2つの部分、つまり、以下に示されるような
検索条件部分と空の2次元配列部分のデータグリッド部分
を有する。
{
{“input”:{
{“name1”: “value1”},
{“name2”: {
{“Max”: {“value”: “v2”, “EQUAL”: “true”}},
{“Min”: {“value”: “v3”, “EQUAL”: “false”}}
} },
…
},
{“output”: {
[[{name4:0}, {name5:0},…]]
}}
}
ここで、name2は範囲値入力を指定し、EQUALは、trueが<=pr>=を意味し、falseが<or>を意味する。
【0057】
検索条件部分は、
ADDのフォームと同じ方法で、タイプに名前を付け、マークを付け、パックされる。
【0058】
バックエンドの1つの実施形態は、データ記憶域としてリレーショナルデータベースを選定することであり、データメッセージの間で送受信されるデータメッセージはJSONフォーマットである。リレーショナルデータベースと
相互作用する必要があるPF
の場合、データベーススキーマ名が使用される必要がある。データベーススキーマ名に対応するデータメッセージ
内の作業名は、データベーススキーマ名に変換される。テーブルの列名はtableName.columnNameのフォームである。単一のテーブルにおける挿入を
処理するPFは、以下のようにCGDMによって実行される。
{“input”: {
{“column1”: “table1.column1”},
{“column2”: “table1.Column2” },
{“column3”, “table1.Column3” },
…
} }
【0059】
1つのテーブルに挿入するために、それぞれの列はSQL
の挿入ステートメントによって同じように扱われるため、1つの
タイプのデータ
がある。かかる挿入を
実行するCGDMは以下になる。
{ input: {
{“table1.column1”, “”},
{ “table1.Column2”, “” },
{ “table1.Column3”, “” },
…
}}
【0060】
マスター/詳細テーブルに挿入するために、CGDMは以下になる。
{“input”: {
{“Master”: {
{ “table1.column1”: “”},
{ “table1.Column2”:“”},
{ “table1.Column3”: “”}
…
}}
{ “Detail”: {
[{“table2.column1”: “”},
{ “table2.Column2”: “” },
{ “table2.Column3”: “” },…] }}
}}
ここで、CGDMは、マスターテーブルのデータ、および、詳細テーブルのデータの配列を含む。
【0061】
1つのテーブルへの更新を
実行するPFは以下のようにCGDMを有する。
{“input”: {
“primarykey”: {
{ “table1.column1”: “”},
{ “table1.Column2”: “”},
…
}
},
{“values”: {
{ “table1.Column3”: “” },
{ “table1.Column4”: “”},
…
}}
}
【0062】
マスター/詳細テーブルへの更新を
実行するPFは以下のようにCGDMを有する。
{“input”:{{“m_Primarykey”: {
{ “table1.column1”: “”},
{ “table1.Column2”: “”},
…
}
},
{“m_values”: {
{ “table1.Column3”: “”},
{ “table1.Column4”: “”},
…
}
},
{“d_Primarykey”: {
{ “table2.column1”: “”},
{ “table2.Column2”: “”}
…
}
},
{“d_values”: {
{ “table2.column3”: “”},
{ “table2.Column4”: “”}
…
}
},
{“d_data”: {
[{“table2.column1”: “”},{ “table2.Column2”: “”},…,
{ “table2.Column3”: “”},{ “table2.Column3”: “”}…]
}
}}
}
【0063】
以下の例
では、SQL選択ステートメントが
、Select [A: output section] from [B: table section]のような形式であり、ここで、[C: conditions section] は、[F: order section]によって並べ替えられた[E: aggregation condition]を含む[D: aggregation section]により分類することを想定している。この入力および出力のデータは、6つのセクションに分割される。セクションA
は、セクションBに
表示されるテーブルの列、または、セクションBに
表示されるテーブルの列
のSQL関数を
含み、セクションB
は、テーブル
と結合関係
を含み、セクションCは、同じ関係における、column=value または column>(=)value または column<(=)value、column LIKE value SQLFunction(column)のフォームを含む。セクションEは、SQLAggregateFunction(column)=or<(=)or>(=)valuesを含み、セクションFは、列を包含する、と仮定する。
【0064】
セクションBにおいて必要とされるテーブルとそれらの結合関係情報は、データベースのスキーマから取得可能であるが、結合
タイプ情報はアプリケーションから
取得する必要がある。配列構造は、選択ステートメントを実行するPFのCGDM
内の2つのテーブル
間の関係を表すように選択できる。この選択ステートメントのCGDMは以下になる。
{{“input”:
{{“requirement”: {
[{ “tableA.column8”: “tableA.column8”},
{ “total1”: { “tableB.column4”:
{
“FUNC”: “SUM”
}}
},
…]}
},
{“table”: {
{[ “tableA”, “tableB”, “joinType”, “tableA.column1= tableB.column2”, “tableA.column3= tableB.column4”, …],
[ “tableC”, “tableD”, “joinType”, “tableC.column1= tableD.column2”, “tableC.column3= tableD.column4”, …],
…}}
},
{“condition”: {
{ “tableA.column5”: “v1”}, //default to tableA.column5=v1
{ “tableB.column1”: {
“value”: “v2”, //default to SUM(tableB.column1)=v2
“FUNC”: “SUM”
}
},
…}
},
{“groupby”: [
“tableA.column6”,
{ “tableB.column2”: {
“FUNC”: “DATE”
}
},
…]
},
{“having”: {
{ “tableB.column3”: {
“value”: “v3”,
“FUNC”: “MAX”
}
},
…}
},
{“orderby”: [
“tableA.column7”,
…]
}
}},
{“output”:
{“results”:
[{ “tableA.column8”: ‘’},
{ “total1”: ‘’},
…]}
}}
【0065】
入力要件は、SQL選択のセクションAに対応しており、かつ、SQL選択の出力を指定する。該要件は、配列フォーマットを指定する。{“tableA.column8”:“tableA.column8”}は、tableA.column8の値を
取得し、「tableA.column8」という名前に設定することを意味する。ペアの、
{ “total1”: { “tableB.column4”:
{
“FUNC”: “SUM”
}}
}
は、SUM関数列、tableB.column4を適用し、
その値を「total1」という名前に適用することを意味する。
【0066】
バックエンド計算タスクを達成するために2つ以上のPFを使用
する実行について
は、
図10に示されるように、販売注文の出荷
操作の場合を検討する。販売注文は、(部分払いまたは在庫品の制約のため)一部出荷可能であると仮定すると、販売注文は2回以上出荷される必要がある場合がある。着信するCGDMは以下になる。
{ “Order_Shipment_Data” :
{“input”: {
{“orderID”, “value1”}
}},
{“output”: {
{“order_info”: {
{“orderCode”:””}
{“salesmanName”:””},
{“customerName”:””}
}},
{“order_prod_info”: {
[[{“productName”:””}, {“productionDate”:””},
{“Quantity”:””},{“shippedQuantity”:””},{“quantityLeft”:””}]]
}}
}}
}
【0067】
入力は、注文idであり、必要とされる出力は、いくつかの注文情報、注文コード、販売員名およびカスタマ名、ならびに、製品情報、製品名、製造日、注文量、出荷量、および出荷
残り数量のリストを含む。
【0068】
図10では、CGDMは、DataExpander PF10によって受信される。DataExpander PF10は、リレーショナルデータセット12に接続する。CGDMのためにWNSM100をマッピングする、機能させる名前空間は、以下になる。
{
{“orderID”, “order.id”};
{ “orderCode”, “order.code”}
{ “salesmanName”, “employee.name” }
{“customerName”, “customer.name”}
{“productName”, “product.name”}
{“productionDate”, “product.productionDate”}
{ “Quantity”, “order.Quantity” }
}
【0069】
マッピング後、CGDMは以下のようになる。
{ “Order_Shipment_Data” :
{“input”:
{“order.id”, “value1”}
},
{“output”: {
{“order_info”: {
{“order.code”: “”}
{“employee.name”: “”},
{“customer.name”: “”}
}},
{“order_prod_info”: {
[[{“product.name”: “”}, {“product.productionDate”: “”},
{“order.Quantity”: “”},{“shippedQuantity”: “”},{“quantityLeft”: “”}]]
}}
}}
}
【0070】
PF10は、SelectおよびPackerという2つのCFを有する。Select CFは、3つのインスタンス102、104、および106を
実行する。Packer CFは1つのインスタンス108を
実行する。Selectは、リレーショナルデータベースに対して
上記の例のタイプSQL選択を行い、Packer CFは、この入力全てを、データメッセージ(例えば、CGDM)の対応する入力部分および出力部分にパッケージングし、データメッセージをLoopPF14に送る。PF14は、入力として配列AおよびBを受け取り、
配列Cを出力する1つのインスタンスを
実行するKeyMatchLoopと呼ばれる1つのCFを有する。A、B、およびC
のそれぞれの要素は、キー部分および値部分を有する。要素のキーは、名前
と値のシーケンスである。2つのキーは、2つのキーの名前
と値
のシーケンスの長さが同じであ
り、シーケンスのそれぞれの位置の2つの名前と値のペアの名前が同じである場合、同じ
タイプである。AおよびBは同じ
タイプのキーを有する。KeyMatchLoopのアルゴリズムは以下になる。
For each element a of A
Create an element c with key part same as a
if there is an element b of B with a.key==b.key {
value part of c is computed from value parts of a
and b by computation rule1.
}
else {
value part of c is computed from value parts of a
and b by computation rule2.
}
add c to
【0071】
計算規則1および計算規則2は、Calculator PF16によって行われる。PF16は、Equal、Zero、およびMinusの3つの計算を有する。PF10に対するOrder_Shipment_DataのCGDMは以下になる。
{“Order_Shipment”:
{“Select.order”:
{
{ “input”: {
{ “requirement”: {
{“order.code”: “order.code”}
{“salesman.name”: “salesman.name”},
{“customer.name”: “customer.name”}
}},
{ “condition” : {
{“order.id”, “Order_Shipment_Data.input.‘order.id’” }
}},
{ “table” : {
{[“order”, “salesman”, “inner join”, “order.salesmanID=salesman.id”],
[“order”, “customer”, “inner join”, “order.customerID=customer.id”]}
}}
}},
{ “output”:
{ “result”: “Order_Shipment_Data.output.order_info”}
}}
}},
{“Select.orderProduct”:
{
{ “input”: {
{ “requirement”: {
[{“product.name”: “product.name”},
{“production.date”: “production.date”},
{“order_product.quantity”: “order_product.quantity”}]
}},
{ “condition” : {
{“order_product.orderId”,
“Order_Shipment_Data.input.‘order.id’” }
}},
{ “table” : {
[“order_product”, “product”, “inner join”,
“order_product.productId=production.id”]
}}
}},
{ “output”: {
“result”: “”}
}}
}}
{“Select.shipped”:
{
{ “input”: {
{ “requirement”: {
{“product.name”: “product.name”},
{“production.date”:“production.date”},
{“shippedQuantity”: {“shipment.Quantity”:
{
“FUNC”: “SUM”
}}
}
}},
{ “condition” : {
{“shipment.orderid”,“Order_Shipment_Data.input.‘order.id’” }
}},
{ “table” : {
[“shipment”, “product”, “inner join”, “shipment.productID=product.id”]
}}
{ “aggregate” : {
[“product.name”, “product.productiondate”]
}}
}},
{ “output”:
{ “result”: “”}
}
}}
{“packer”: {
{“input”: {
{“In”:
{
{“A”: “Select.orderProduct.output.Result”},
{“B”: “Select.shipped.output.Result”}
}},
{“Out”: {{“C”: “Order_Shipment_Data.output.order_prod_info”}}}
}},
{“output”: {
{“result” : “Order_Shipment_Data.output.order_prod_info”}
}}
}}
}
【0072】
データメッセージOrder_Shipment_Dataの出力部分のorder_prod_infoは、PF10がPF14に送るデータメッセージの出力部分を生成するための入力として使用される。PF10は、データメッセージOrder_Shipment_Data_FullをPF14に送る。
{“Order_Shipment_Data_Full”: {
{“input”: {
{“A”: [[{“product.name”: “v1”}, {“product.productionDate”: “v2”},
{“order_product.quantity”: “v3”}]]},
{“B”: [[{“product.Name”: “v4”}, {“product.productionDate”: “v5”},
{“shippedQuantity”: “v6”}]]}
}},
{“output”: {
{“C”: [[{“product.Name”: “”}, {“product.productionDate”: “”},
{“order.Quantity”: “”},{“shippedQuantity”: “”},{“quantityLeft”: “”}]]}
}}
}
}
【0073】
PF14に対するデータメッセージOrder_Shipment_Data_FullのCGDMは以下になる。
{“Loop”:{
{“input”: {
{“A”:
[“Order_Shipment_Data_full.Input.A”,
{“key”:[“product.name”, “product.productionDate”]},
{“value”:{{“shippedQuantity” } }]
},
{“B”:
[“Order_Shipment_Data_full.Input.B”,
{“key”:[“product.name”, “product.productionDate”]},
{“value”:{{“order_product.quantity”} }]
},
{ “C”:
[“Order_Shipment_Data_full.output.C”,
{“key”:[“product.name”, “product.productionDate”]},
{“value”:{{“order_product.quantity”},{“shippedQuantity”},{“quantityLeft”}}]
}
}},
{“output”:
{ “result”: “Order_Shipment_Data_full.output.C”}
}
}
}
【0074】
PF14はPF16に2つのデータメッセージを送る。
{“Order_data”: {
{“input”: {
{“A”:{“order_product.quantity”: “v1”}}
}},
{“output”: {
{“C”:{{“order_product.Quantity”: “”},{“shippedQuantity”: “”},{“quantityLeft”: “”}}}
}}
}
}
{“Order_Ship_data”: {
{“input”: {
{“A”: {“order_product.quantity”: “v1”}},
{“B”: {“shippedQuantity”: “v2”}}
}
{“output”: {
{“C”: {{“order_product.quantity”: “”},{“shippedQuantity”: “”},{“quantityLeft”: “”}}}
}}
}
}
【0075】
Order_Ship_dataについてのCGDMは以下になる。
{“Order_Ship_Data”: {
{“Equal.quantity”: {
{“input”: {
“X”:“A.order_product.quantity”
}},
{“output”: {
“Y”: “C.order_product.quantity” //Y=X
}}
}
},
{“Equal.quantityLeft”: {
{“input”: {
“X”:“A.order_product.quantity”
}},
{“output”: {
“Y”:“C.quantityLeft”
}}
}
}
{“Zero”: {
{“output”: {
“X”:“C.shippedQuantity” //X=0
}}
}
}
}}
【0076】
Order_dataについてのCGDMは以下になる。
{“Order_Data”: {
{“Equal.quantity”: {
{“input”: {
“X”:“A.order_product.quantity”
}},
{“output”: {
“Y”: “C.order_product.quantity”
}}
}
},
{“Equal.shippedQuantity”: {
{“input”: {
“X”:“B.shippedQuantity”
}},
{“output”: {
“Y”:“C.shippedQuantity”
}}
}
},
{“Minus”: {
{“input”: {
{“X”:“A.order_product.quantity”},
{“Y”:“B.shippedQuantity”}
}},
{“output”: {
“Z”:“C.quantityLeft” //Z=X-Y
}}
}
}
}}
【0077】
データメッセージOrder_Shipment_Dataの出力部分は、CFインスタンス106およびCFインスタンス108の出力部分によって形成される。そして、着信するデータメッセージOrder_Shipment_Dataの作業名空間に逆マッピングして、Order_Shipment_Dataの送信者に送ることができる。
【0078】
本発明の例示
的な実施形態は、CGDMのマークアップおよびプロパティシートを利用する。この実施形態は
、線形カスケードに関して以下に論じられるが、本発明はデータの
特定の構成に限定されない。線形カスケードは<select>要素のリストであり、これは、第1の要素から始まって最終の要素を除いたものであり、1つの<select>要素の選択された値が該リストにおける次の<select>のオプションを判断する。
【0079】
線形カスケード入力の1つの例は、Country−State−City入力であり、これによって、ユーザはCountryのオプションから国を選択でき、Stateのオプションを
決定し、ユーザはStateのオプションから州を
決定でき、Cityのオプションを
決定する。ブラウザの実装形態において、County、State、およびCityはそれぞれ、<select>要素によって表される。Countryに対するイベントハンドラはCounty<select>要素にアタッチされ、Stateに対するイベントハンドラはState<select>要素にアタッチされる。例えば、「米国」などの国が選択される時、Countryのイベントハンドラは呼び出され、このイベントハンドラは「米国」の値を得て、{Country=“USA”、State[ ]}のメッセージを作成し、このメッセージをバックエンドプロセスに送って「米国」の全ての州を得て、State[ ]における値を記憶する。State[ ]の値は次いで、Stateを表す<select>に設定される。StateおよびCityに対するイベントハンドラ
も同様である。
【0080】
本発明の一実施形態では、カスケードはリス
トデータ構造によって表され、この場合、リストのそれぞれの要素は5つのメンバ、すなわち、ID、Next、SelectedValue、eventHandler、およびOptionsを有する。IDは要素の名前を保持し、Nextはリストの次の要素のNameの値を有し、SelectedValueは選択された値を保持し、eventHandlerは要素のイベントハンドラ関数を保持し、Optionsは値のセットを保持する。Optionsから値を選択し、かつSelectedValueを設定するアクションは、リストの要素に対して行われ得る。アクションを終える
と、引数として要素を渡すことによって、
eventHandlerの関数は呼び出される。
【0081】
IDは任意の名前を取ることができるため、アルゴリズムは抽象的である。
それらは、Country、State、City、またはCompany、Department、Employee Name、またはCategory、Type、Product Nameとすることができる。アルゴリズムは、任意の数の要素が可能とされるため、一般化される。
【0082】
次に、リスト構造はHTML上でマーキングされる。IDおよびNextを除いて、<select>要素は他
の全てを有する。ここでのCGDMの定義において、それぞれの値は名前を有する
必要があるため、CGDM上では、Nextのみが必要とされる。値の名前が、IDプロパティをHTMLタグの全ての要素に加えることによって実装されると仮定する。
【0083】
カスケードのマークアップ規則は、それぞれの<select>要素に対してNextプロパティを加えるためのものであり、この値はカスケードにおける次の<select>のIDの値である。1つのHTMLページにおける2つ以上のカスケードが可能である。
【0084】
一般に、マークアップ規則は、CGDMの
構文規則を使用してCGDMのコンテンツを拡張するための規則として定義され、それにより、アルゴリズムの任意の入力インスタンスに対して、
それに対応する拡張コンテンツが存在する。入力インスタンスおよびその全データの特徴は、拡張コンテンツから差し引かれる。マークアップ規則はアルゴリズムに関連付けられる。
【0085】
PF関数は、異なるカスケードにおいてさえも、全ての<select>要素
の選択イベントのイベントハンドラであってよい。この例では、PFにはcascadePFという名前が与えられる。cascadePFの入力は、選択された値、およびイベントを生成する<select>要素である。HTML全体のドキュメントオブジェクトモデル(DOM)構造はまた、cascadePFにアクセス可能である。PFのCGDMは、CGDM={{the selected <select> element}、DOM}と見なすことができ、入力部分は、{{the selected <select> element}、{All <select> element of the cascade}}であり、出力部分は、{{the next element of the selected <select> element}}である。
【0086】
全てのカスケードは、種々のHTMLページにおいてさえも、同じcascadePFを使用し、また、同じCGDM名を使用できるため、cascadePFのVMSSストアはいずれのルックアップに対しても1つのVMSSを返すように構成可能である。cascadePFの例示のCF関数は、initRestElement(CurrentElementName name)であり、これは、ID=nameの現在の要素について、次の要素から最後の要素まで全てに対するオプションを再設定し、Results r=getValuesFromBackend(Condition condition、Results r、BackendProc p、CGDMNamepCGDMName)、これは、CGDMをパッケージングし、バックエンドプロセスpを呼び出し、pCGDMNameという名前のCGDMを渡し、setOption(Results r)とする、つまり、ID=r.nameの<select>のオプションを設定する。CGDMは次のフォーマットを有する。
{pCGDMName: {
{Input: {Condition:{name:value}}}, {Output:{Results:{r:NULL}}
}
【0087】
cascadePFは<select>要素全てに対して使用できるた
め、異なる<select>要素に対して選択が行われる
時、PFが受信する選択された<select>要素
は異なる。そのため、直接可変マッピング(VM)は不可能である。しかしながら、CFの引数は、マークアップとCGDMから
差し引くことができる。これを規則ベースのVM(RBVM)と呼ぶ。
【0088】
バックエンドに
は、handleDBSeletionと呼ばれるPFを有することができ、これは、設定されたSQL選択実
装を
含む。通常、<select>に対するオプションの値は、SQL選択を
実行することによって取得可能である。cascadeOptionsCGDMをCGDMの名前として割り当て、getValuesFromBackendはhandleDBSelectionに渡される。
【0089】
RBVMを使用して、PFに対するVMSSは以下になる。
{initRestElement: RBVM}
{getValuesFromBackend: {{condition: RBVM }, {r : RBVM }, {p: handleDBSelection },{pCGDMName: cascadeOptionsCGDM }}}
{ setOptions: { {r: getValuesFromBackend.r}}
【0090】
CFの呼び出し元は以下になる。
initRestElementCaller(RBVM, CGDM, CFResults)
{
name = get the ID’s value of the selected <select> element
initRestElement(name);
}
getValuesFromBackendCaller(RBVM, CGDM, CFResults)
{
(name, value) = get the ID’s value and the selected value of the selected
<select> element
name = get the ID’s value of the next element of the selected <select> element
r = getValuesFromBackend(value, name, handleDBSelection, cascadeOptionsCGDM);
add r to CFResults.
}
setOptionsCaller(RBVM, CGDM, CFResults)
{
r = get getValuesFromBackend.r from CFResults
setOptions(r);
}
【0091】
RBVMの利点は、新しいカスケードが
追加された時、またはカスケードの長さが延長され
た時、コードの規則処理部分が変更されないことである。
選択したアルゴリズムが抽象的
で一般化され
ているため、全てのカスケードは同じコードを使用できる。
【0092】
CFCallersの実装
は、マークアップ規則
の影響を受ける。CFの新しいCFCallerは
、マークアップ規則
用に開発される必要がある。マークアップ規則に起因して、CFは2つ以上のCFCallerを有することができる。
【0093】
マークアップは、相互参照としてCGDMの値の名前を使用して、同等
以上の表現
力のある構文規則を有する別個のメッセージに対して行うこと
ができる。
我々は、別個のマークアップメッセージを、CGDMのプロパティシート(PS)と呼ぶ。いずれのCGDMもこれに
接続するPSを有することができる。開発
時において、CGDMの名前インスタンス(NI)が既知であるため、開発
時に
PSをCGDMに
接続できる。
【0094】
本発明の例示の実施形態を説明したが、本発明は、開示された実施形態に限定されず、本開示の趣旨および範囲内に含まれるさまざまな修正および等価の配置構成に及ぶことが意図されることは、理解されたい。
読み取り可能な記憶媒体と連結されてサービスを提供するコンポーネントベースのソフトウェアシステムのコンピュータプログラム(computer program)を組み立てる(assembling)方法であって、
前記方法は、
前記サービスの入力/出力(Input/Output, I/O)要件を、複数のI/Oキーと値のペア(I/O key-value pair)を含むそれぞれのデータメッセージ(data message)に変換(converting)するステップと、
前記データメッセージを入力引数(input argument)として受信するように前記プログラムの部分関数(Part Function, PF)を構成するステップと、
計算関数(Computation Function, CF)の引数にマッピング(mapping)されるとともに、前記I/Oキーと値のペアにマッピングされるキーペア(key-pair)を含む可変マッチング構造(Variable Matching Structure, VMS)セット(set)(Variable Matching Structure set, VMSS)を生成するステップと、
前記VMSSを用いて不完全な前記計算関数(CF)を呼び出す(call)ように、前記PFを構成するステップとを含み、
前記VMSSは、特定の計算関数(CF)のラベル、前記CFによって呼び出される前記PFの名前、前記CFによって呼び出される計算目標データメッセージ(Computation Global Data Message : CGDM)の名前、前記CFのインスタンスの入力パラメータ、および、前記CGDMのインスタンスの入力パラメータ、のうちの少なくとも一つを含み、
前記CFは、前記サービスに関連する動作を実行するように構成される
ことを特徴とするコンピュータプログラムを組み立てる方法。
請求項2記載の方法であって、前記サブセットのキーペアのうちの第2のキーペアは、前記CFの出力引数にマッピングされる第3のキー、および、前記I/Oキーと値のペアのうち出力キーと値のペアにマッピングされる第4のキーを含むことを特徴とするコンピュータプログラムを組み立てる方法。
請求項1記載の方法であって、前記VMSSを前記データメッセージの名前(name)により索引付け可能な(indexable)データ記憶部(data storage)に記憶させるステップをさらに含むことを特徴とするサコンピュータプログラムを組み立てる方法。
サービスを実行するように構成されたコンピュータプログラムを実行する方法であって、前記コンピュータプログラムは、複数の入力/出力(I/O)キーと値のペアを含むデータメッセージを入力引数として受信するように構成された部分関数(PF)を含み、
前記方法は、
複数の要素(element)を含むデータ構造を前記データメッセージの名前を用いて検索(retrieving)するステップと、ここで前記各要素は、名前および可変マッチング構造(VMS)を含み、前記VMSSは、特定の計算関数(CF)のラベル、前記CFによって呼び出される前記PFの名前、前記CFによって呼び出される計算目標データメッセージ(Computation Global Data Message : CGDM)の名前、前記CFのインスタンスの入力パラメータ、および、前記CGDMのインスタンスの入力パラメータのうちの少なくとも1つを含み、
前記検索されたデータ構造内の前記要素毎に、計算関数(CF)を検索するために、前記要素の前記名前を用いるステップと、
前記要素の前記VMS及び前記データメッセージを用いて、前記検索されたCFを呼び出すステップと
を含むことを特徴とするコンピュータプログラムを実行する方法。
コンピュータ可読記憶媒体(computer readable storage medium)に格納された、サービスを実行するプログラムを組み立てるためのコンピュータプログラム(computer program)であって、前記コンピュータ可読記憶媒体は、コンピュータ可読記憶媒体に具体化されるプログラム命令を有し、プログラム命令は、以下の方法を実行するためにコンピュータによって実行可能であり、
前記方法は、
前記サービスの入力/出力(I/O)要件を、複数のI/Oキーと値のペアを含むそれぞれのデータメッセージに変換するステップと、
前記データメッセージを入力引数として受信するように前記プログラムの部分関数(PF)を構成するステップと、
計算関数(CF)の引数にマッピングされるとともに、前記I/Oキーと値のペアにマッピングされるキーペアを含む可変マッチング構造(VMS)セット(VMSS)を生成するステップと、
前記VMSSを用いて前記計算関数(CF)を呼び出すように、前記PFを構成するステップとを含み、
前記VMSSは、特定の計算関数(CF)のラベル、前記CFによって呼び出される前記PFの名前、前記CFによって呼び出される計算目標データメッセージ(Computation Global Data Message : CGDM)の名前、前記CFのインスタンスの入力パラメータ、および、前記CGDMのインスタンスの入力パラメータ、のうちの少なくとも1つを含み、
前記CFは、前記サービスに関連付けられた動作を実行するように構成される
ことを特徴とするコンピュータ可読可能記憶媒体に格納されたコンピュータプログラム。
請求項9記載の方法において、前記VMSSはキーのペアのサブセットを含む音声メッセージシステムを含み、前記部分集合の鍵対のうちの第1の鍵ペアは、前記CFの入力引数にマッピングされる第1キー、そして前記I/Oキー値対の中から入力キー値ペアにマッピングされる第2キーを含むことを特徴とするコンピュータ読み取り可能な記憶媒体に格納されたコンピュータプログラム。
請求項10記載の方法において、前記部分集合の鍵対のうちの第2の鍵ペアは、前記CFの出力引数にマッピングされる第3キー、そして前記I/Oキー値対のうち出力キー値ペアにマッピングされる第4キーを含むことを特徴とするコンピュータ読み取り可能な記憶媒体に格納されたコンピュータプログラム。
請求項9記載の方法において、前記コンピュータプログラムは、上記VMSSを前記データメッセージのネームによって索引付け可能なデータストアに格納することを含むことを特徴とするコンピュータ可読記憶媒体に記憶されたコンピュータプログラム。
コンピュータ可読記憶媒体に格納された、サービスを実行するように構成されたプログラムを実行するためのコンピュータプログラムであって、前記コンピュータプログラムは、複数の入力/出力(I/O)キーと値のペアを含むデータメッセージを入力引数として受信するように構成された部分関数(PF)を含み、前記コンピュータ可読記憶媒体は、コンピュータ可読記憶媒体に具体化されるプログラム命令を有し、プログラム命令は、以下の方法を実行するためにコンピュータによって実行可能であり、
前記方法は、
複数の要素)を含むデータ構造を前記データメッセージの名前を用いて検索するステップと、ここで前記各要素は、名前および可変マッチング構造(VMS)を含み、前記VMSSは、特定の計算関数(CF)のラベル、前記CFによって呼び出される前記PFの名前、前記CFによって呼び出される計算目標データメッセージ(Computation Global Data Message : CGDM)の名前、前記CFのインスタンスの入力パラメータ、および、前記CGDMのインスタンスの入力パラメータのうちの少なくとも1つを含み、
前記検索されたデータ構造内の前記要素毎に、計算関数(CF)を検索するために、前記要素の前記名前を用いるステップと、
前記要素の前記VMS及び前記データメッセージを用いて、前記検索されたCFを呼び出すステップと
を含むことを特徴とするコンピュータ可読記憶媒体に記憶されたコンピュータプログラム。