なぜ1CではなくlsFusionなのですか?





前の記事「なぜ1Cではないのですか?」 1年以上前に公開され、非常に強い関心を呼び起こしました(10万回の視聴と2千回のコメントに少し足りません)。しかし、予想通り、多くの合理的な質問が生じました。「彼でなければ、誰ですか?」もちろん、多くの人が理解しているように、その記事はそのように書かれているのではなく、その後に別の記事をリリースするために、最初の記事で説明されている問題をどのように解決できるか、そして解決すべきかが説明されます。しかし、さまざまな理由で、この「応答」記事のリリースは非常に長い間遅れていました。しかし、彼らが言うように、決して遅くなるよりはましです。







, ( ) lsFusion. , : (function-level, functional), , -, (constraint) . , buzzwords, , , .







« 1?» ( ):









1 , lsFusion.







: , ..



lsFusion , ( lsFusion — ). ( ). , , — , « ». , , :







  • , (, - , ), , , - (, / , ). , , «».
  • «» ( lsFusion / ), .




lsFusionは、アプリケーションサーバーではなくSQLサーバーを最大限に活用して計算ロジックを実行しようとするため(クエリの実行をできるだけ少なくするために、クエリをできるだけグループ化することでこれを行います)、全体を読み取る操作lsFusion内のオブジェクトは原則として存在しません。結果として、lsFusionのN +1問題とオーバーリード問題の両方が非常にまれです。たとえば、次のアクション:





fillSum(Invoice i) {

    FOR invoice(InvoiceDetail id) = i DO

        sum(id) <- price(id) * quantity(id);

}





それは1つのステップでコンパイルされます:

fillSum(Invoice i) {

    sum(InvoiceDetail id) <- price(id) * quantity(id) WHERE invoice(id) = i

}





これは、1つのクエリで実行され、使用される行/列のみが読み取り/書き込みされます。



テーブル/ビュー:レジスタ



lsFusion , «» 1, , , , , « » ( , ), . , lsFusion :







  • — , (, )
  • / — , , :
    • — GROUP LAST
    • , — SUM ( lsFusion , lsFusion , )


lsFusion , .







, . lsFusion , , . - :





LEDGER Sales GROUP Stock stock, Sku sku SUM NUMERIC quantity, NUMERIC sum;



//    Sales   :

// stock, sku, quantity, sum = ABSTRACT Stock, Sku, NUMERIC, NUMERIC (Sales); - 

  / 

// quantitySales, sumSales (stock, sku) -   ( =   +  )

// quantitySales, sumSales (stock, sku, DATETIME) -    

// quantitySales, sumSales (stock, sku, DATETIME, DATETIME) -     

//  ..





そして次のバージョンでは、そのような構文糖衣が現れる可能性が最も高いでしょう。もう1つのことは、複雑なプロジェクトでは、レジスタがより複雑な構造を持っていることが最も多いことです(たとえば、レジ​​スタは相互に継承し、複合インデックスのデータ非正規化 し、異なるモジュールで展開します)。そのため、このような砂糖は次の場合にのみ重要になります。 RAD開発(より正確にはプロトタイピング)。これは、現代のITの世界ではもはやあまり関係がありません。



レジスタは非常に特殊な場合にサポートされます



上述したように、lsFusionのレジスタが一つの大きな結合ではなく、いくつかの異なる機構の鍵は、おそらく、ある実体の機構(記録テーブルに計算されたデータの自動更新)。







1, lsFusion , . , lsFusion :







  1. , , , ( " ").
  2. / / , .
  3. , , , “” ( ).
  4. (), .




lsFusionは、計算された非実体化データを含む、一般的な制約とイベントをサポートします。したがって、たとえば、剰余(任意の数の異なるデータ/演算子を使用して計算できます)が0より大きくなければならないという制約を作成するには、次の1行だけを書き込むだけで十分です。





CONSTRAINT currentBalance(sku, stock) < 0 MESSAGE '    ';





したがって、プラットフォーム自体が(増分計算を使用して)可能な限り効率的に、変更(たとえば、レシートの倉庫の変更や消費量の変更)がこの制限に違反しないことを確認します。

また、同じ方法で、たとえば、計算されたデータを含む、任意のデータの変更に関する通知を作成できます。





WHEN SET(currentBalance(Sku sku, Stock stock) < 0//     0

    EMAIL SUBJECT '   ' + address(stock) + '   ' + name(sku) + 

'   0' TO responsibleEmail(group(sku));





仮想テーブルパラメータで使用できるのは定数のみです



- lsFusion . , , , , . , , , lsFusion . :





EXPORT FROM price(Sku sku), balance(date(sku), sku) WHERE name(sku) = '';





プラットフォームは、制約名条件(および剰余が計算される日付の結果として)をサブクエリ(およびこのサブクエリ内のすべてのサブクエリ)に自動的にプッシュし、述語プッシュダウン最適化を実行し ます。さらに、同じSQLとは異なり、プラットフォームは、グループ化だけでなく、パーティション、さらには再帰に対してもこの最適化を実行できます。ただし、これは別の記事のトピックであるため、ここでは詳しく説明しません。



お問い合わせ



, lsFusion SQL ( ), , . , , .









lsFusion, :







  • IDE — , , , ..
  • IDE ( ), , .


, / (IF, SHOWIF ..), (EVAL), lsFusion.









LsFusionには、非常に強力なクエリ最適化エンジンが内部にあり、多くの場合、高価な商用DBMS(PostgreSQLは言うまでもなく)でも実行できない最適化を実行します。したがって、「SQLを使用しない理由」の記事で説明されているすべてのパフォーマンスの問題は、開発者が追加のアクションを実行することなく独立して解決できます。開発者は、ビジネス上の問題の解決に集中でき、その方法を考える必要はありません。クエリを正しく記述し、および/またはその結果を配置する一時テーブルに記述します。







したがって、lsFusionの1Cに関する記事の例は次のようになります。







記事からの例

    .,
    .

    ..  
          ..(,
                               (
                                    
                                    ..
                                     = &))  
         . = .

    . = & 
    (. < . 
        .  NULL)
      
      



currentBalance(InvoiceDetail id) = currentBalance(sku(id));



export(Invoice i) {

    EXPORT FROM sku(InvoiceDetail id), currentBalance(id) WHERE invoice(id) = i AND 

currentBalance(id) < quantity(id) OR NOT currentBalance(id);

}





したがって、lsFusionに「NomenclatureIN(SELECT Nomenclature FROM Document.Invoice.Content WHERE Reference =&Document)」を記述する必要はありません。



SQL



SQL-92, ( SQL — ), lsFusion :







  • / ( SQL — )
  • ( SQL — CTE)
  • ( SQL — )


lsFusion - ( GROUP BY ).









ERP- ORM , , - , ERP- SQL- .







ただし、同じ1Cでは、クエリはデータの読み取り操作でのみサポートされます。書き込みの場合でも、ORMメカニズムを使用する必要があり、そのパフォーマンスには多くの要望があります。lsFusionでは、このような問題はなく、オブジェクトの作成を含むすべての操作をデータベースサーバー上で1回のリクエストで実行できます。例えば:





generateCards() {

    FOR iterate(i,1,10000NEW d = DiscountCard DO

            number(d) ← ‘Card:’+i;

}







最終的には、1つのリクエスト(または複数のリクエストにコンパイルされますが、その数はデータの量に依存しません)で非常に迅速に実行され、すべてのイベント/制約/集計も制限付きで実行/チェック/再計算されますリクエストの数(ここでも、データの量に依存しません)。

同じことが、大量のデータ/オブジェクトを変更/削除するメカニズムにも当てはまります。





FOR sum(DiscountCard d) > 10000 DO

    vip (d) ← TRUE;

FOR sum(DiscountCard d) > 10000 DO

    DELETE d;





コンパイルされます:

sum(DiscountCard d) ← TRUE  WHERE sum(d) > 10000;

DELETE DiscountCard d WHERE sum(d) > 10000;





また、1回のリクエストで実行されます。





( ) 1, . :







  1. ( MS SQL).
  2. Repeatable Read Serializable.
  3. , .
  4. .


lsFusion. , 1 ( ) lsFusion:







  • , ( , ),
  • , , « ».




lsFusion — , / .







:



lsFusionの1Cとは異なり、実行フローはサーバーとクライアントの両方で同じです。この統合により、開発プロセスの観点から、ユーザー/クライアントデバイスとの対話が大幅に簡素化されます。したがって、1Cに関する記事の例は、lsFusion言語で記述されているため、次のようになります。





f() <- someData(); //       myForm

DIALOG myForm OBJECTS a INPUT DO // , 

 - 

     IF isSomething(a) DO //          - 

 

         DIALOG otherForm OBJECTS b = a DO { // ,  

       b

             g(b) <- someInput(b); //    b

             APPLY//    

         }





ある程度、lsFusionは1Cの従来の形式のアプローチを使用しますが、それだけがはるかにスケーラブルで生産性を高めます。実際、非同期の魔法はすべて内部に残っており、開発者はビジネス上の問題の解決に厳密に集中でき、自分が書いたコードをどこでどのように実行するかを考える必要はありません。

, lsFusion ( /). , lsFusion CLIENT INTERNAL, . Java, - — JavaScript. “ ” , .









- ( ) “” ( , , ). (, ), , , 1 ( , async / await, ).







lsFusion , , , , .







WYSIWYG:



, 1 , ( ), 2 :







  • - , / ().
  • .


1 . lsFusion , , , «Excel-style» , , , , , . ( lsFusion) « » — / . , .







/



lsFusionでは、フォームにプロパティ、フィルター、およびその他の要素を設定するときに、それらが異なるリスト(または他のビュー)に表示されている場合でも、すべてのオブジェクトに一度にアクセスできます。同時に、プラットフォーム自体がオブジェクトの変更(およびデータの変更)を監視し、これらのオブジェクトを使用してフォームデータを自動的に更新します。たとえば、次のフォームを作成する場合:





FORM balance

    OBJECTS st = Stock, sk = Sku

    PROPERTIES (st) name

    PROPERTIES name(sk), currentBalance(st, sk)

    FILTERS currentBalance(st, sk)

;





上のリスト(倉庫)の現在のレコードを移動すると、下のリスト(選択した倉庫にある製品)が自動的に更新されます。



冗長なレベルの抽象化



lsFusionを作成する際の主な原則は、作成されたすべての抽象化の純粋さと完全性という原則でした。そう:







  • lsFusion . — . , .
  • ( ) , , , ( ).
    :




, lsFusion 1. 1 lsFusion:







  • /


lsFusion ( ) . , ( , ..) , «» ( ).







  • /


, 1 - lsFusion ( , ).







  • /


lsFusion , . - « » lsFusion . , . - , , ( ). lsFusion .







  • / / (BI)


. , / lsFusion ( ). , ( , ) lsFusion :







  • , JasperReports, Java. pixel-perfect , .
  • , , , .

  • — «» , , « » ( ).
  • , ( ) JSON, XML, XLSX, DBF .


lsFusion — . , , . , , / .









lsFusion , lsFusion , / ( 1). lsFusion — , . , , , ( ). - .







:







  1. ( BI).
  2. (, )
  3. .




PS: « » ( ) « 1?» , , , , . , , .







前のセクションで述べたように、lsFusionのデータロジックのリレーショナルデータベースへのマッピングは透過的であり、開発者が完全に制御できます。一緒にmaterializations一般的とインデックス、開発者(さらには管理者が)も、大量のデータに、ほぼすべての性能を達成することができます。さらに、プラットフォーム自体が物理モデルの変更を監視し、追加の移行なしでデータベース構造を更新するため、このデータベースを使用するための統計とオプションがわかっている場合、実行中のデータベースでパフォーマンス最適化プロセスを実行できます(実行する必要があります)。簡単な例があるとしましょう:





date = DATA DATE (DocumentDetail)

barcode = DATA STRING (Sku);

sku = DATA Sku (DocumentDetail); 



barcode(DocumentDetail dd) = barcode(sku(dd));

count (STRING bc, DATE d) = GROUP SUM 1 IF date(DocumentDetail dd) > d AND barcode(dd) = bc;

FORM x

        OBJECTS bc = STRING PANEL, d = DATE PANEL

        PROPERTIES count(bc, d), VALUE (bc), VALUE(d)

;





このフォームを実行すると、次のようなリクエストが生成されます。

  1. 製品テーブルと結合すると、SKUテーブルのバーコードが指定されたバーコードと一致します。
  2. 指定された日付よりも大きいすべての日付のドキュメント行数をカウントします。


この場合、SQLサーバーには2つのオプションがあります。行のテーブルの日付によるインデックスによって実行されるか、商品のテーブルのバーコードによるインデックスによって実行され、商品を検索してから、Skuによるインデックスによって実行されます。行のテーブル。どちらの場合も、パフォーマンスには多くの要望があります(1つの製品と多くの製品の動きが多い場合)。lsFusionでは、この問題を解決するには、次の行を変更/追加するだけで十分です。





barcode(DocumentDetail dd) = barcode(sku(d)) MATERIALIZED// ,  

   

INDEX barcode(DocumentDetail dd), date(dd);//   





このような最適化の後、SQLサーバーは構築された複合インデックスの使用を開始できるようになり、パフォーマンスが最大になります。



クローズドソースとライセンス



- . Microsoft, , .Net, Linux.







, , — ERP-, , : — . , .







lsFusion LGPL v3 , , ( ), . GitHub. Maven-, Maven: compile, install, package .. , , GitHub Projects. , .









. lsFusion . , ( ), ( ).







( ), , ( ).







lsFusion , tutorial, , .









lsFusion . ( ), . , ( ) .







, , , , , . :





invoice (InvoiceDetail id) = DATA Invoice;

sum = GROUP SUM sum(InvoiceDetail id) BY invoice(id) //  sum   

  Invoice (    invoce,    - Invoice)



FORM myForm

    OBJECTS myObject = MyClass

;

filtered = FILTER myForm.myObject ; //  filtered      

MyClass (    myObject  myForm)









, , - , custom-made . , , . , / «», .







lsFusion . :







  1. ( , — ) — - . , , , , / .
  2. — . - - (, ).
  3. — , ( ). , - ( «» / , ).
  4. , ( ). , this, , lsFusion , - «».
  5. — , , - ( )


, , , lsFusion ( ), lsFusion / , .







, «» lsFusion — ( ) , , . ( , ), ( ).









, , Everything as code . lsFusion.







, , lsFusion . , , ( ). lsFusion IDEA : , , , .. -, , .









, , , — 1, ERP-. , , , :







  1. .
  2. , , , .


lsFusion : - , - . - , .







, lsFusion:
  1. . “ - ”. Java . , 1, lsFusion . , , , . , . . , .







    , lsFusion — lsFusion ANTLR, IDEA Grammar-Kit (), JFlex ().





  2. UI. - Java SE (Swing, Web Start), , . , , -, - .







    - lsFusion :





    • GWT — Java (), . , , , , GWT , . GWT JavaScript, JavaScript







      , GWT , TypeScript . :







      ) - TypeScript - ;







      ) lsFusion GWT , , .







      - TypeScript, , .





    • Full Calendar, Leaflet — “” ( ).
    • Spring Security, MVC, DI — , , (, ).
  3. BI — “” lsFusion “ ”. :





    • pivot-table, subtotal — BI, ( ),
    • plotly — ,
    • tableToExcel — Excel ( , collapsible ..).


    , ( , ), open-source, - — .





  4. . lsFusion — JasperReports.







    . 1 , , , , :







    ) , , , 4 ;







    ) “”, pixel-perfect .







    lsFusion : ( renderer’, , . .), . BI ( , . .), ( ).





  5. IDE. IDE, IDEA (Eclipse ), IDEA . , , IDEA , . IDEA ( IntelliJ Platform) IDE, , lsFusion ( , lsFusion ). stub index’, chameleon element' lsFusion (, , ).
  6. . Everything as code , , , Git. , Subversion (, , ).
  7. / . EaC / Java, Maven ( lsFusion repo.lsfusion.org).







    Maven- pom.xml :







    <repositories>
            <repository>
                <id>lsfusion</id>
                <name>lsFusion Public Repository</name>
                <url>http://repo.lsfusion.org</url>
            </repository>
    </repositories>
    
          
          





    , Maven Java . , , Maven , pom.xml.







    <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-math3</artifactId>
            <version>3.2</version>
    </dependency>
    
          
          





    IDE, .





  8. . JDBC, / . Postgres ( Docker, yum ..)







    Java Spring, .











, lsFusion LGPL v3.0, , , , lsFusion . , lsFusion , , . , lsFusion , , , , / , . -? , «-» , , , — , -. , ( , , «as is», «to be»). , , , «», , :







  • — , , . «», — .
  • ,


, lsFusion (- / lsFusion, ), (, , ).







, , . , , / , , , .







. , ( - ), ( / ). ( IT) , , , ( ). MyCompany. , , , , , , .









, , - — . , . , , , :







  1. - ( ), , / . .
  2. , , , ( , , ). , , , , . , 30 3000 , - .


, , . , lsFusion , 1 ERP-.







, :

«» ( )



( , ) , / .









( ), , , - . . . .







( Google docs)



, ( , , , ).









, ( ). , .









1, , . ( ), , , , , ( ). , :







  1. , .
  2. , , , « » ( , ).


/



:







  • — , drag-drop .
  • — WYSIWYG , - ( ).
  • — > ( -> , ).
  • , — ( )


, ( -).







/



1 :







  • — , (, , Odoo lsFusion)
  • — renderer, / , , , «» js- ( , ).


( )



, :







  • ( )
  • ( / )
  • ..


1 «-» , 1 / , , .









, « 1», — - 1 lsFusion ( , ). , 1- , .










All Articles