Artículo anterior "¿Por qué no 1C?" salió hace más de un año y despertó un gran interés (solo un poco menos de 100 mil visitas y 2 mil comentarios). Sin embargo, como era de esperar, surgieron muchas preguntas razonables: "Si no es él, ¿quién?". Por supuesto, como muchos han entendido, ese artículo no fue escrito así, sino para lanzar otro después, donde se le diga cómo se pueden y se deben resolver los problemas descritos en el primer artículo. Sin embargo, por varias razones, la publicación de este artículo de "respuesta" se retrasó durante mucho tiempo. Pero como dicen, más vale tarde que nunca.
, ( ) lsFusion. , : (function-level, functional), , -, (constraint) . , buzzwords, , , .
« 1?» ( ):
1 , lsFusion.
: , ..
lsFusion , ( lsFusion — ). ( ). , , — , « ». , , :
Dado que lsFusion intenta aprovechar al máximo el servidor SQL y no el servidor de aplicaciones para ejecutar la lógica de cálculo (y lo hace agrupando las consultas tanto como sea posible para ejecutarlas lo menos posible), la operación de leer un El objeto en lsFusion no existe en principio. Como consecuencia, tanto el problema N + 1 como el problema de sobrelectura en lsFusion son extremadamente raros. Por ejemplo, la siguiente acción:
fillSum(Invoice i) {
|
fillSum(Invoice i) {
|
Tablas / Vistas: Registros
lsFusion , «» 1, , , , , « » ( , ), . , lsFusion :
, . lsFusion , , . - :
LEDGER Sales GROUP Stock stock, Sku sku SUM NUMERIC quantity, NUMERIC sum;
|
Los registros se admiten en casos muy especiales
Como se mencionó anteriormente, los registros en lsFusion no son una gran combinación, sino varios mecanismos diferentes, cuya clave, quizás, es el mecanismo de materialización (registro y actualización automática de datos calculados en tablas).
1, lsFusion , . , lsFusion :
- , , , ( " ").
- / / , .
- , , , “” ( ).
- (), .
lsFusion admite restricciones y eventos en general, incluidos los datos no materializados calculados. Entonces, por ejemplo, para crear una restricción de que el resto (que se puede calcular usando cualquier número de datos / operadores diferentes) debe ser mayor que 0, es suficiente escribir solo una línea:
CONSTRAINT currentBalance(sku, stock) < 0 MESSAGE ' ';
|
Además, de la misma manera, puede crear, por ejemplo, notificaciones sobre cambios de cualquier dato, incluidos los calculados:
WHEN SET(currentBalance(Sku sku, Stock stock) < 0) // 0
|
Solo se pueden usar constantes en los parámetros de la tabla virtual
- lsFusion . , , , , . , , , lsFusion . :
EXPORT FROM price(Sku sku), balance(date(sku), sku) WHERE name(sku) = '';
|
Consultas
, lsFusion SQL ( ), , . , , .
lsFusion, :
- IDE — , , , ..
- IDE ( ), , .
, / (IF, SHOWIF ..), (EVAL), lsFusion.
LsFusion tiene un motor de optimización de consultas muy poderoso internamente, en muchos casos realizando optimizaciones que incluso los costosos DBMS comerciales (y mucho menos PostgreSQL) no pueden hacer. Entonces, todos los problemas de rendimiento descritos en el artículo "¿Por qué no SQL?" , LsFusion puede resolverlos de forma independiente sin acciones adicionales por parte del desarrollador, quien, en consecuencia, puede concentrarse en resolver problemas comerciales y no pensar en cómo escribir una consulta correctamente y / o en que tabla temporal poner su resultado.
Entonces, un ejemplo de un artículo sobre 1C en lsFusion se verá así:
.,
.
..
..(,
(
..
= &))
. = .
. = &
(. < .
. NULL)
currentBalance(InvoiceDetail id) = currentBalance(sku(id));
|
SQL
SQL-92, ( SQL — ), lsFusion :
- / ( SQL — )
- ( SQL — CTE)
- ( SQL — )
lsFusion - ( GROUP BY ).
ERP- ORM , , - , ERP- SQL- .
Sin embargo, en el mismo 1C, las consultas son compatibles solo para operaciones de lectura de datos; para escribir, aún debe usar mecanismos ORM, cuyo rendimiento deja mucho que desear. En lsFusion, no existe tal problema, y todas las operaciones, incluida la creación de objetos, se pueden realizar en el servidor de la base de datos y con una sola solicitud. Por ejemplo:
generateCards() {
|
En última instancia, se compilará en una solicitud (o varias, pero su número no dependerá de la cantidad de datos) y se ejecutará muy rápidamente, y todos los eventos / restricciones / agregaciones también serán ejecutados / verificados / recalculados por un limitado número de solicitudes (de nuevo, independientemente de la cantidad de datos).
Lo mismo se aplica al mecanismo para cambiar / eliminar una gran cantidad de datos / objetos:
FOR sum(DiscountCard d) > 10000 DO
|
sum(DiscountCard d) ← TRUE WHERE sum(d) > 10000;
|
( ) 1, . :
- ( MS SQL).
- Repeatable Read Serializable.
- , .
- .
lsFusion. , 1 ( ) lsFusion:
- , ( , ),
- , , « ».
lsFusion — , / .
:
A diferencia de 1C en lsFusion, el flujo de ejecución es el mismo tanto para el servidor como para el cliente. Esta unidad simplifica enormemente la interacción con el dispositivo usuario / cliente en términos del proceso de desarrollo. Entonces, el ejemplo en el artículo sobre 1C está escrito en el lenguaje lsFusion y, en consecuencia, se ve así:
f() <- someData(); // myForm
|
, lsFusion ( /). , lsFusion CLIENT INTERNAL, . Java, - — JavaScript. “ ” , .
- ( ) “” ( , , ). (, ), , , 1 ( , async / await, ).
lsFusion , , , , .
WYSIWYG:
, 1 , ( ), 2 :
- - , / ().
- .
1 . lsFusion , , , «Excel-style» , , , , , . ( lsFusion) « » — / . , .
/
En lsFusion, al configurar propiedades, filtros y otros elementos en un formulario, puede acceder a todos los objetos a la vez, incluso si aparecen en diferentes listas (u otras vistas). Al mismo tiempo, la propia plataforma monitorea los cambios en los objetos (así como los cambios en los datos) y actualiza automáticamente los datos del formulario utilizando estos objetos. Por ejemplo, si crea el siguiente formulario:
FORM balance
|
Niveles redundantes de abstracción
El principio principal al crear lsFusion fue y sigue siendo el principio: la pureza y la integridad de todas las abstracciones creadas. Asi que:
- 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 — , . , , , ( ). - .
:
- ( BI).
- (, )
- .
PS: « » ( ) « 1?» , , , , . , , .
Como se mencionó en la sección anterior, el mapeo de la lógica de datos en lsFusion a una base de datos relacional es transparente y puede ser completamente controlado por el desarrollador. Junto con las materializaciones en general y los índices, un desarrollador (e incluso un administrador) puede lograr casi cualquier rendimiento, incluso con grandes cantidades de datos. Además, dado que la propia plataforma monitorea los cambios en el modelo físico y actualiza la estructura de la base de datos sin migraciones adicionales, el proceso de optimización del rendimiento puede (y debe) realizarse en una base de datos en ejecución cuando se conocen las estadísticas y opciones para usar esta base de datos. Digamos que tenemos un ejemplo simple:
date = DATA DATE (DocumentDetail)
|
- UNIRSE con la tabla de productos, el código de barras en la tabla de SKU coincide con el especificado;
- contando el número de líneas de documento para todas las fechas superiores a la especificada.
En este caso, el servidor SQL tendrá dos opciones: ejecutar por el índice por fechas en la tabla de filas, o por el índice por códigos de barras en la tabla de bienes, buscar bienes y luego ejecutar por el índice por Sku en el tabla de filas. En ambos casos, el rendimiento dejará mucho que desear (si hay muchos movimientos de un producto y muchos productos). En lsFusion, para solucionar este problema, basta con cambiar / agregar las siguientes líneas:
barcode(DocumentDetail dd) = barcode(sku(d)) MATERIALIZED; // ,
|
Licencias y fuentes cerradas
- . Microsoft, , .Net, Linux.
lsFusion LGPL v3 , , ( ), . GitHub. Maven-, Maven: compile, install, package .. , , GitHub Projects. , .
. lsFusion . , ( ), ( ).
( ), , ( ).
lsFusion , tutorial, , .
lsFusion . ( ), . , ( ) .
, , , , , . :
invoice (InvoiceDetail id) = DATA Invoice;
|
, , - , custom-made . , , . , / «», .
lsFusion . :
- ( , — ) — - . , , , , / .
- — . - - (, ).
- — , ( ). , - ( «» / , ).
- , ( ). , this, , lsFusion , - «».
- — , , - ( )
, , , lsFusion ( ), lsFusion / , .
, «» lsFusion — ( ) , , . ( , ), ( ).
, , Everything as code . lsFusion.
, , lsFusion . , , ( ). lsFusion IDEA : , , , .. -, , .
, , , — 1, ERP-. , , , :
- .
- , , , .
lsFusion : - , - . - , .
. “ - ”. Java . , 1, lsFusion . , , , . , . . , .
, lsFusion — lsFusion ANTLR, IDEA Grammar-Kit (), JFlex ().
UI. - Java SE (Swing, Web Start), , . , , -, - .
- lsFusion :
BI — “” lsFusion “ ”. :
- pivot-table, subtotal — BI, ( ),
- plotly — ,
- tableToExcel — Excel ( , collapsible ..).
, ( , ), open-source, - — .
. lsFusion — JasperReports.
. 1 , , , , :
) , , , 4 ;
) “”, pixel-perfect .
lsFusion : ( renderer’, , . .), . BI ( , . .), ( ).
- IDE. IDE, IDEA (Eclipse ), IDEA . , , IDEA , . IDEA ( IntelliJ Platform) IDE, , lsFusion ( , lsFusion ). stub index’, chameleon element' lsFusion (, , ).
- . Everything as code , , , Git. , Subversion (, , ).
/ . 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, .
. JDBC, / . Postgres ( Docker, yum ..)
Java Spring, .
, lsFusion LGPL v3.0, , , , lsFusion . , lsFusion , , . , lsFusion , , , , / , . -? , «-» , , , — , -. , ( , , «as is», «to be»). , , , «», , :
- — , , . «», — .
- — ,
, lsFusion (- / lsFusion, ), (, , ).
. , ( - ), ( / ). ( IT) , , , ( ). MyCompany. , , , , , , .
, , - — . , . , , , :
- - ( ), , / . .
- , , , ( , , ). , , , , . , 30 3000 , - .
, , . , lsFusion , 1 ERP-.
, « 1», — - 1 lsFusion ( , ). , 1- , .