[
https://issues.apache.org/jira/browse/IGNITE-20018?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17760845#comment-17760845
]
Evgeny Stanilovsky commented on IGNITE-20018:
---------------------------------------------
[~mzhuravkov] thanks ! merged into main.
> Introduce system view definition API
> ------------------------------------
>
> Key: IGNITE-20018
> URL: https://issues.apache.org/jira/browse/IGNITE-20018
> Project: Ignite
> Issue Type: Improvement
> Components: sql
> Reporter: Konstantin Orlov
> Assignee: Maksim Zhuravkov
> Priority: Major
> Labels: ignite-3
> Fix For: 3.0.0-beta2
>
> Time Spent: 3.5h
> Remaining Estimate: 0h
>
> Let's introduce API to define a system view. Below is a few examples of how
> it may look like:
> {code:java}
> SystemView.<Table>clusterViewBuilder()
> .name("USERS")
> .addColumn("ID", Integer.class, Table::id)
> .addColumn("SCHEMA_ID", Integer.class, Table::schemaId)
> .addColumn("NAME", String.class, Table::name)
> .addColumn("COLUMN_NAMES", String.class, Table::columnNames)
> .dataProvider(() -> toAsyncCursor(tableManager.allTables()))
> .build();
> SystemView.<Connection>nodeViewBuilder()
> .name("CONNECTIONS")
> .addColumn("USER", String.class, Connection::user)
> .addColumn("ADDRESS", String.class, Connection::address)
> .addColumn("ATTRS", String.class, Connection::attrs)
> .localNodeColumnAlias("NODE_ID")
> .dataProvider(() -> toAsyncCursor(connManager.connections()))
> .build();
> {code}
> Explanation of the code snippet above:
> * We need to distinguish between views exposing data with cluster-wide
> semantic and views exposing data with node-specific semantic. Such
> segregation is required to properly map queries' fragments to nodes owning
> data.
> * *name* attribute – is a name of the view under which it will be available
> in sql
> * *addColumn* attribute – appends a column to the view definition. View
> definition should have columns in the order of invocation of addColumn
> method. This method accepts three parameters: name, column type represented
> by class, and property reader. Name is a name of the column, under which the
> column under which it will be available in sql. Class is required to properly
> build the view's description. Property reader is a function which accepts
> objects of type specified in generic of builder, and returns value for the
> column of interest.
> * *dataProvider* attribute – provides an access to data this view is supposed
> to expose. Data provider accepts the supplier of AsyncCursor (see
> org.apache.ignite.internal.sql.engine.AsyncCursor; should be moved to core).
> AsyncCursor is required, because some of the data may be not stored locally,
> thus remote call will be required. To avoid blocking of query engine threads,
> it's better to integrate with async primitives, rather than force every
> module to store required state in local collections.
> * *localNodeColumnAlias* attribute – alias for the column exposing node id.
> This attribute is available only for nodeView’s, since node id will be
> injected automatically only for this type of view.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)