[ 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)