共有可能なエンティティ選択という新しいコンセプトに関するこの ブログ記事と、その後のフォーラムでの議論に続き、ORDAがどのように未来にフィットするのかをじっくりと説明したいと思います。
数ヶ月前、私たちはORDAとその新しいコンセプトのすべてを誇らしげに紹介しました。
ORDAでは、あらゆるものがオブジェクトであることを学びました。
- データベース自体がオブジェクト(データストアオブジェクト)である
- 各テーブルはデータクラスオブジェクトです。
- 各レコードはエンティティ・オブジェクトである
- 現在の選択項目は、エンティティ選択オブジェクトになることができます。
この先、1テーブルにつき1つのカレントセレクションに縛られていた時代は終わりを告げました。エンティティセレクションはいくつでも管理できます。また、すべてがオブジェクトなので、より扱いやすいコード、汎用的なコーディング、他のソフトウェアと通信するためのシリアライゼーションが可能になります。
4Dでは、これらのすべてが すぐに使えることをご存知ですか?複雑なフレームワークに悩まされることもありません。
4D v17には、もう1つ非常に重要なオプションが含まれています。 プリエンプティブなプロセス間で様々なデータを共有することが、とても簡単にできるようになったのです。
4Dは自信を持ってマルチスレッドの世界へとあなたを導き、アプリケーションのパフォーマンスを向上させるためにプロセッサの能力を最大限に活用します。
最高のパフォーマンスと最も簡単なコーディングは、この方程式に依存しています:オブジェクトと共有。
そして、共有可能なエンティティセレクションのコンセプトが登場します。
最初のユースケースを勉強してみましょう
プリエンプティブモードでタスクを実行するWORKERの利点は、すでにお分かりかと思います。今までは、共有オブジェクトと共有コレクションを参照として渡すことができるだけでした。
エンティティセレクションを参照として渡すことで、どのような利点が得られるか想像してみてください…他の共有アイテムと同じように。
以下は、適切な使用例です。
1- 支払済み請求書と未払い請求書を識別する。
2- 支払済みの請求書については顧客に確認メールを送り、未払いの請求書についてはリマインダーのメールを送る。このタスクは時間がかかる可能性があるので、非同期モードでWORKERに委譲したいと思います。
コードは次のようになります。
var $paid
。 )
; : . := . . ("status=:1"; "Paid") := . . ("status=:1"; "Unpaid") ("mailing"; "sendMails"; ;$unpaid csInvoicesSelection
//Get entity selections for paid and unpaid invoices
$paiddsInvoicesquery
$unpaiddsInvoicesquery
//Pass entity selections as references to the WORKERCALL WORKER $paid $unpaid
sendMails メソッドは、渡されたエンティティセレクションをリファレンスとしてアクセスします。完全なコードは、このブログ記事で紹介しています。
何かお気づきでしょうか?エンティティ セレクションは「そのまま」ワーカーに渡されます。共有する準備ができたのです。
次のステップ:新しいウェブセッション
次のステップは、スケーラビリティのために設計された強力なセッション管理で、Webアプリケーションを強化することです。
将来のリリースでは、4Dウェブセッションは、同じユーザーエージェントからの複数のプロセス(つまりリクエスト)を同時に処理できるようになる予定です。これにより、パフォーマンスが向上するだけでなく、プロセス間で情報を共有できるという大きな利点が得られます。
それだけではありません。ウェブセッションに情報を割り当てることで、カスタム認証を管理することができるようになります。
ユースケースを説明しよう
グローバル企業(Acme Corp.)が、CRM アプリケーションを通じて、さまざまな顧客(企業、人、学校など)に世界中でコンピュータを販売していると想像してください。
各営業担当者は自分の顧客ポートフォリオを管理しています。彼らは一日中アプリケーションに接続し、自分の顧客ポートフォリオの案件を作成・登録しています。
データベースには、少なくとも2つのリンクされたデータクラスがあると仮定します。CustomersとSalesPersons(営業担当者は複数の顧客を持っています) です。
下の絵で、私たちは見ることができます。
- Acme Corp.の上位 10 社の顧客はストレージに格納され、アプリケーションで実行されているすべてのプロセスで共有されます。
- 各営業担当者は、上位 10 社の顧客が格納された独自のセッションを持っています。
- 営業担当者は、アプリケーションの各ページを移動して、自分の上位 10 社の顧客とAcme社の上位 10 社の顧客を表示させることができます。
これらの「トップ10」は、ストレージまたはユーザーのセッションで共有される顧客 エンティティの選択項目です。
そうすると、次のような方法を簡単に開発できるようになる。
- 営業担当者が優秀かどうかをテストする(例:上位10社の顧客とアクメ社の上位10社の顧客との間に交点があるか?)
- 営業マンのトップ10顧客をリフレッシュする
- などです。
4Dコードでより具体的に
Acme Corp.の 上位10社の顧客は、少なくともデータベース起動時には、Storageに置かれたCustomersエンティティ選択です。
Use ( ) . := . . (). y("totalPurchase desc").(0; 10) Storage
StorageacmeCorpTop10dsCustomersallorderBslice
End use
Web セッションは、Session オブジェクトというオブジェクトに他なりません。このオブジェクトは、セッションによって処理されるすべての要求がデータを共有できるように、共有オブジェクト(storage 属性)を含んでいます。
営業担当者が自分自身を認証するとき、次のようなコードで上位10人の顧客を保存することはとても簡単です。
// $salesID is the salesperson's ID
// Get the salesperson's top 10 customers
$top10:=ds.Customers.query("salesPerson.salesID = :1";$salesID).orderBy("totalPurchase desc").slice
(0; 10)
// Put $top10 in the session
Use (Session.storage)
Session .storage.myTop10:=$userTop10End use
注:上記のコード例は、4D の将来のバージョンのプレビューです。
そして、ユーザーエージェントから来るすべてのプロセス(すなわち、リクエスト)は、これらのトップ10の顧客にアクセスすることができます。
Storage とセッションに「そのまま」エンティティセレクションを置いていることに注意してください。共有可能なものとしてコピーする必要はありません!
これは、エンティティセレクションがデフォルトで共有可能であるためです。
さいごに
私たちは、将来のアプリケーションの主要な問題であるはずのスケーラビリティとパフォーマンスに関連する、将来のすべてのユースケースに利点を与えることを選択しました。エンドユーザーにとって幸せなこととは、正しい結果を最短時間で得られることです。
共有可能なエンティティ選択の目的は、参照として扱われることであることを意識してください。その方がメモリが軽くなります。
さらに、共有可能なエンティティセレクションを使用すると、いくつかの透過的な最適化が4Dによって処理されます。エンティティセレクションのコピー中に、共有可能な結果を要求すると、4Dはエンティティセレクションのコピーを作らず、同じ参照を返します。
これらのおかげで、エンティティセレクションを共有したいときに、その都度共有としてコピーすることを避けることができます。我々は、マルチコアプロセッサの継続的な進歩のおかげで、プリエンプティブモードで実行されるコードにますます向かっていくので、これらの時間はあまりにも豊富であると考えています。