Giter Site home page Giter Site logo

dashjoin / platform Goto Github PK

View Code? Open in Web Editor NEW
84.0 6.0 6.0 6.08 MB

Dashjoin Is an Open Source & Cloud Native Low Code Development and Integration Platform that helps teams deliver applications faster ๐Ÿš€ Uses a data-driven approach inspired by Linked Data to make use of your existing assets

Home Page: https://dashjoin.com

License: GNU Affero General Public License v3.0

Shell 0.10% JavaScript 0.09% TypeScript 19.25% CSS 0.27% HTML 2.28% SCSS 0.06% Java 76.59% Dockerfile 0.20% ANTLR 1.15%
low-code no-code low-code-development-platform low-code-platform lowcode nocode

platform's Introduction

Open Source Low Code & AI Development Platform

Dashjoin Angular and Java build junit-coverage GitHub issues GitHub stars GitHub closed issues GitHub commit activity GitHub license Twitter Follow

For anyone who is planning a development project, faces a tight schedule, needs to present results quickly, or has limited development resources available. Dashjoin taps into and integrates your existing data sources and allows you to intuitively browse, search, edit, and visualize your integrated information. Add AI empowered business logic to enable users and automation to act on the information. Unlike other Low Code Development Platforms, Dashjoin offers a free open source version with a commercial PaaS and bases on a unique, linked-data inspired approach to scalable data integration.

Features

Universal DB Frontend

Connect to any SQL or NoSQL database, browse, search, and edit its contents. Extend the schema on the fly.
Artificial Intelligence

Seamlessly incorporate large language models, image classification, translation, and entity reconciliation services in your App.
Query Catalog & Editor

Automatically collect schema information that powers an intuitive graphical query editor!
Layout Designer

Graphically customize the layout for different types found in the database. Leverage the query editor to include meaningful charts.
Functions and Processes

Seamlessly start and integrate REST services from the application and monitor progress.
Data Integration and Federation

Visually map external data sources to your model. Load the data into a warehouse or federate the source into a virtual linked-data graph.
Rich Support Matrix

Dashjoin supports a wide variety of SQL and NoSQL databases. You can define relationships between databases in order to enable a seamless browsing experience.

Getting Started

Learn

Contribute

We welcome contributions. If you are interested in contributing to Dashjoin, let us know! You'll get to know an open-minded and motivated team working together to build the next generation platform.

platform's People

Contributors

aeberhart avatar peterjohnlawrence avatar uw4 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

platform's Issues

Indication that filter in graphical editor incompletely shows SQL query

I can understand that the filter line in the graphical editor cannot show all SQL clauses completely. In cases where the graphical filter is incomplete, would it be possible to have an asterisk or some other indication to point this out?

In the picture, the SQL is >40000 and <50000 while the graphical editor only shows >40000.

90786493-e8e5c200-e303-11ea-8bd7-a25cc249f019

Need an approach to caching for RestJson

Many APIs have a significant delay and call quotas.
Therefore, we should avoid calling an API with the same parameters over and over.

Possible approaches are:

  1. Specify cache timeout with the function
    maintain an in memory cache: Map<function, Map<parameters, result>>
    pro: fast & simple to implement
    con: might end up with redundant caches on different cluster nodes

  2. allow some form of "download" in order to persist API results in a data lake

Approach 1) is probably better since it should be transparent to the user how caching is done. The cache might actually persist the data in a cluster object store also.
Maybe start with a simple in mem impl. and allow switching to a more powerful caching strategy later

allow configuring some basic UI settings

background color

changed in instance component:

<mat-sidenav-content style="... background-color: #...;">

sidenavOpen condition

changed in appservice:

  sidenavOpen = false;

changing the font

in my-theme.scss

@import '~@angular/material/theming';

@font-face {
    font-family: din;
    src: url(assets/DINRegular.ttf);
}

$custom-typography: mat-typography-config($font-family: 'din');
@include mat-core($custom-typography);

changing theme colors

in my-theme.scss

$candy-app-primary: mat-palette($mat-orange,800);

cookie text and links

cookieconsent.ts

login screen

login.component.html

Allow defining table and column display names

We can use the json schema title attribute for this.
The value can be computed with a heuristic:

  • CamelCase => Camel Case
  • lowercase => Lowercase
  • UPPER => Upper

The user can override this value in the table / column metadata section.

Charts / tables must use the title also.

SQL metadata extraction ignores fks pointing to the same table

The structure
org.dashjoin.service.Metadata.MdTable.fks
maps table to fk and thus ignores columns in the case where multiple columns point to the same table.
An example is a "case" table that defines two fks (creator, responsible) pointing to person(id)

changes to the JSON upload

when uploading a file, the behavior for JSON files should be to contain an array of objects.
As with CSV, the table name is derived from the file name.

For the config DB we should support uploading a model folder containing the config DB.

Also add this to the documentation of the demo application (how to install), and remove some the unused java code

Add log for any changes made on databases through the platform

Such an audit trail would make the query-editor acceptable to companies with strong internal audit departments (such as banks).

Which fields should be included?

  • Operation: create, update, delete, read? (could lead to very excessive logging)
  • User
  • Timestamp
  • Result (success, ACL violation)

Operation: Create, update, delete. I would omit read (would only be useful for extremely sensitive data; but you presumably would protect that differently.

  • User / timestamp / result as listed above.

Yugabyte SQL: GROUP_CONCAT not supported

Function is called string_aggr
https://blog.yugabyte.com/distributed-sql-tips-and-tricks-april-3-2020/

org.dashjoin.service.ExMapper toResponse
INFO: REST exception
org.postgresql.util.PSQLException: ERROR: function group_concat(character varying) does not exist
Hint: No function matches the given name and argument types. You might need to add explicit type casts.
Position: 65
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2533)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2268)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:313)
at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:448)
at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:369)
at org.postgresql.jdbc.PgStatement.executeWithFlags(PgStatement.java:310)
at org.postgresql.jdbc.PgStatement.executeCachedSql(PgStatement.java:296)
at org.postgresql.jdbc.PgStatement.executeWithFlags(PgStatement.java:273)
at org.postgresql.jdbc.PgStatement.executeQuery(PgStatement.java:226)
at org.apache.commons.dbcp2.DelegatingStatement.executeQuery(DelegatingStatement.java:329)
at org.apache.commons.dbcp2.DelegatingStatement.executeQuery(DelegatingStatement.java:329)
at org.dashjoin.service.SQLDatabase.getMetadata(SQLDatabase.java:680)
at org.dashjoin.service.SQLEditor.prettyPrint(SQLEditor.java:600)
at org.dashjoin.service.SQLEditor.setGroupBy(SQLEditor.java:352)
at org.dashjoin.service.QueryEditor$Delegate.setGroupBy(QueryEditor.java:78)

Yugabyte SQL: filtering in query editor UI throws SQL error

Data source: Chinook
Table: Artist

choosing filter "AC/DC" (actually any) leads to:

org.dashjoin.service.ExMapper toResponse INFO: REST exception
org.postgresql.util.PSQLException: ERROR: missing FROM-clause entry for table "artist"
Position: 251
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2533)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2268)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:313)
at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:448)
at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:369)
at org.postgresql.jdbc.PgStatement.executeWithFlags(PgStatement.java:310)
at org.postgresql.jdbc.PgStatement.executeCachedSql(PgStatement.java:296)
at org.postgresql.jdbc.PgStatement.executeWithFlags(PgStatement.java:273)
at org.postgresql.jdbc.PgStatement.executeQuery(PgStatement.java:226)
at org.apache.commons.dbcp2.DelegatingStatement.executeQuery(DelegatingStatement.java:329)
at org.apache.commons.dbcp2.DelegatingStatement.executeQuery(DelegatingStatement.java:329)
at org.dashjoin.service.SQLDatabase.getMetadata(SQLDatabase.java:680)
at org.dashjoin.service.SQLEditor.prettyPrint(SQLEditor.java:600)
at org.dashjoin.service.SQLEditor.setWhere(SQLEditor.java:263)

Stale DB metadata causes several issues

Consider the following scenario:

  1. table is create in the DB
  2. user defines metadata like table label / fk relationships
  3. table is deleted

in this case, the table still "exists" but only with partial data. It also is ok not to delete the metadata, in case the table is only temporarily unavailable (e.g. a temporary ACL issue).

The platform should therefore filter this partial table info and ignore it in places where it would lead to errors. We already have some checks in certain places, but this should be centralized since it is not obvious to the developer.

aggregation on SQL server broken

SELECT
COUNT("ProductCategory"."ProductCategoryID"), COUNT("ProductCategory"."ParentProductCategoryID"), COUNT("ProductCategory"."ModifiedDate"), "ProductCategory"."Name"
FROM
SalesLT."ProductCategory"
GROUP BY
"ProductCategory"."Name"

ERROR Error: Could not find column with id "".
at getTableUnknownColumnError (table.js:1277)
at table.js:2436
at Function.from ()

most likely the column metadata is broken

editing page root throws JS error and open a dyfunctional dialog

core.js:6210 ERROR TypeError: Cannot read property 'icon' of undefined
at WidgetListComponent_Template (widgetlist.component.html:5)

dialog shows only an empty select panel with ok / cancel

by design, the page widget shows toolbar and sidenav and does not allow editing them

better example for demo app

include a second database with IOT like data that maps to customers
add a real email example
add an aggregation firebase query

npe during ETL

2021-06-21 13:28:34,714 INFO [org.das.ser.ExMapper] (executor-thread-99) REST exception: java.lang.NullPointerException
at org.dashjoin.mapping.AbstractSource.runInternal(AbstractSource.java:153)
at org.dashjoin.mapping.AbstractSource.run(AbstractSource.java:85)
at org.dashjoin.mapping.AbstractSource.run(AbstractSource.java:29)
at org.dashjoin.function.FunctionService.callInternal(FunctionService.java:70)
at org.dashjoin.function.FunctionService.callInternal(FunctionService.java:57)
at org.dashjoin.expression.ExpressionService$Call.invoke(ExpressionService.java:495)
at com.api.jsonata4java.expressions.ExpressionsVisitor.visitFunction_call(ExpressionsVisitor.java:1754)

most likely caused by partial table metadata

Avoid infinite trigger recursion

It is quite easy to get into an endless recursion on $update triggers if the update trigger calls $update.
This is not unusual, if we want to write some additional fields.

better support JSON types in the DB

current version supports basic functionality

missing still:

schema definition so we can use the CRUD editor
support in DBs other than postgres

Handling of DB schema for sybase and oracle

SQL Server:

reproduced with the adventureworks sample DB

Catalog = AdventureWorksLT2019 (can be specified via the JDBC URL: jdbc:jtds:sqlserver://localhost:1433/AdventureWorksLT2019)
Schema = SalesLT

The schema cannot be specified. In "org.dashjoin.service.Metadata.getSchema(Connection, String)" we have a default of schema=dbo for SQL server, however this code is never reached since the DB connection pool swallows the AbstractMethodError thrown in net.sourceforge.jtds.jdbc.JtdsConnection.getSchema()

If we want to specify tables from another schema for instance in an SQL statement, we need to write:
select * from schema.table

RestJson function needs to support caching

add a cache timeout value in the function definition.
depending on the type of service, the timeout could be vastly different:
stock market values might need a short timeout where things like geolocations might have almost indefinite timeouts

Strange behavior when session storage is full

ERROR DOMException: Failed to set a named property on 'Storage': Setting the value of 'context' exceeded the quota.
at SafeSubscriber._next (http://localhost:4200/main.js:10799:56)
at SafeSubscriber.__tryOrUnsub (http://localhost:4200/vendor.js:50169:16)
at SafeSubscriber.next (http://localhost:4200/vendor.js:50108:22)
at Subscriber._next (http://localhost:4200/vendor.js:50058:26)

Dev mode showed this trace:

       this.root = true;
            this.init();
            if (this.table) {
                this.http.get(this.url).subscribe(res => {
                    // value loaded
                    if (this.database === 'config' && this.table === 'Table') {
                        // we are on a table page
                        const tmp = _util__WEBPACK_IMPORTED_MODULE_20__["Util"].parseTableID(this.pk1);
                        this.app.getSchema(tmp[1], tmp[2]).subscribe(mycache => {
                            // read myself since there might be unsaved layout edits in the app.cache
                            if (mycache.tableLayout) {
                                this.setLayout(mycache.tableLayout, 'table', null);
                                this.value = res;
                                this.doLayout();
                                this.label().subscribe(l => this.titleService.setTitle(l));
                            }
                            else {
                                // use the default table layout
                                this.app.getSchema('config', 'Table').subscribe(table => {
                                    this.setLayout(table.instanceLayout, 'defaulttable', null);
                                    this.value = res;
                                    this.doLayout();
                                    this.label().subscribe(l => this.titleService.setTitle(l));
                                });
                            }
                            const contextAndValue = this.context();
                            contextAndValue.value = this.value;
                            sessionStorage.context = JSON.stringify(contextAndValue);

<<<
});
}

Improve timestamp display (e.g. on the Functions page)

currently shows this format:
2021-06-11T16:52:33.633+00:00
in both table and the display widget.

Problems with this are:

  • too long, timezone and milliseconds are irrelevant
  • the time must be adapted to the browser's time zone

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.