カスタム クエリ
カスタム クエリは、特定の要件に従ってデータベース内のデータを取得または操作するために特別に作成された命令です。 データベース管理システムの事前定義クエリとは異なり、カスタム クエリは、独自のまたは複雑なデータの取 得と操作のニーズを満たすように調整されています。
カスタム クエリは、次のデータ ソースでサポートされています。
- Amazon Athena
- Amazon Redshift
- Microsoft Azure SQL Database
- Microsoft Azure Synapse Analytics
- Microsoft SQL Server
- MySQL
- Oracle
- PostgreSQL
- Snowflake
手順 1 - クライアント上のデータ ソース項目を定義します。
RevealView.onDataSourcesRequested
イベントのイベント ハンドラーを追加します。この手順では、カスタム クエリでオーバーライドするデータ ソースを作成します。
この例では、RVSqlServerDataSource
を使用して SQL Server に接続しています。
revealView.onDataSourcesRequested = (callback) => {
const sqlServerDataSource = new $.ig.RVSqlServerDataSource();
sqlServerDataSource.id = "MySqlServerDataSource";
sqlServerDataSource.title = "My SQL Server";
const sqlServerDataSourceItem = new $.ig.RVSqlServerDataSourceItem(sqlServerDataSource);
sqlServerDataSourceItem.id = "MySqlServerDataSourceItem";
sqlServerDataSourceItem.title = "John Orders";
callback(new $.ig.RevealDataSources([sqlServerDataSource], [sqlServerDataSourceItem], true));
};
手順 2 - サーバー上のデータ ソース項目をオーバーライドします。
if (sqlDataSourceItem.Id == "MySqlServerDataSourceItem")
{
//get the sales-person-id from the userContext
var salesPersonId = userContext.Properties["sales-person-id"];
//parametrize your custom query with the property obtained before
sqlDataSourceItem.CustomQuery =
$"SELECT * FROM [Sales].[SalesOrderHeader] WHERE [SalesPersonId] = {salesPersonId}";
}
例 - クライアントが提供する値を使用したカスタム クエリの作成
1 - クライアント上のデータ ソース項目を定義します。
$.ig.RevealSdkSettings.setBaseUrl("http://localhost:5111/");
var revealView = new $.ig.RevealView("#revealView");
revealView.startInEditMode = true;
revealView.onDataSourcesRequested = (callback) => {
const sqlServerDataSource = new $.ig.RVSqlServerDataSource();
sqlServerDataSource.id = "MySqlServerDataSource";
sqlServerDataSource.title = "My SQL Server";
const sqlServerDataSourceItem = new $.ig.RVSqlServerDataSourceItem(sqlServerDataSource);
sqlServerDataSourceItem.id = "MySqlServerDataSourceItem";
sqlServerDataSourceItem.title = "John Orders";
callback(new $.ig.RevealDataSources([sqlServerDataSource], [sqlServerDataSourceItem], true));
};
2 - クライアントでは、$.ig.RevealSdkSettings.setAdditionalHeadersProvider()
メソッドを使用して、サーバーに送信する追加ヘッダーを設定します。この例では、x-sales-person-id
という名前のヘッダーを使用しています。
$.ig.RevealSdkSettings.setBaseUrl("http://localhost:5111/");
$.ig.RevealSdkSettings.setAdditionalHeadersProvider(function (url) {
const headers = {};
//set the x-sales-person-id header that identifies the sales person
headers["x-sales-person-id"] = "279";
return headers;
});
var revealView = new $.ig.RevealView("#revealView");
revealView.startInEditMode = true;
revealView.onDataSourcesRequested = (callback) => {
const sqlServerDataSource = new $.ig.RVSqlServerDataSource();
sqlServerDataSource.id = "MySqlServerDataSource";
sqlServerDataSource.title = "My SQL Server";
const sqlServerDataSourceItem = new $.ig.RVSqlServerDataSourceItem(sqlServerDataSource);
sqlServerDataSourceItem.id = "MySqlServerDataSourceItem";
sqlServerDataSourceItem.title = "John Orders";
callback(new $.ig.RevealDataSources([sqlServerDataSource], [sqlServerDataSourceItem], true));
};
3 - サーバー上のヘッダーを処理するための RVUserContextProvider
を定義して登録します。ヘッダーを抽出し、適切なプロパティを登録する必要があります。
public class UserContextProvider : IRVUserContextProvider
{
public IRVUserContext GetUserContext(HttpContext httpContext)
{
//when using standard auth mechanisms, the userId can be obtained using aspnetContext.User.Identity.Name.
var userIdentityName = httpContext.User.Identity?.Name;
var userId = userIdentityName ?? "guest";
//get the sales-person-id header set on the client
var salesPersonId = httpContext.Request.Headers["x-sales-person-id"];
//add the sales-person-id property
var props = new Dictionary<string, object> { { "sales-person-id", salesPersonId } };
return new RVUserContext(userId, props);
}
}
4 - データ ソース プロバイダーで、データ ソース項目をオーバーライドしてカスタム クエリを定義します。
public class DataSourceProvider : IRVDataSourceProvider
{
public Task<RVDataSourceItem> ChangeDataSourceItemAsync(IRVUserContext userContext, string dashboardId,
RVDataSourceItem dataSourceItem)
{
if (dataSourceItem is RVSqlServerDataSourceItem sqlDataSourceItem)
{
//update underlying data source
ChangeDataSourceAsync(userContext, sqlDataSourceItem.DataSource);
if (sqlDataSourceItem.Id == "MySqlServerDataSourceItem")
{
//get the sales-person-id from the userContext
var salesPersonId = userContext.Properties["sales-person-id"];
//parametrize your custom query with the property obtained before
sqlDataSourceItem.CustomQuery =
$"SELECT * FROM [Sales].[SalesOrderHeader] WHERE [SalesPersonId] = {salesPersonId}";
}
}
return Task.FromResult(dataSourceItem);
}
public Task<RVDashboardDataSource> ChangeDataSourceAsync(IRVUserContext userContext,
RVDashboardDataSource dataSource)
{
if (dataSource is RVSqlServerDataSource sqlDataSource)
{
sqlDataSource.Host = "your-host";
sqlDataSource.Database = "your-database";
}
return Task.FromResult(dataSource);
}
}
Java で MySqlDataSourceItem
を使用する場合は、必ずテーブルの完全修飾名を使用し てください。そうしないと機能しません。完全修飾テーブル名は、データベース識別子とテーブル識別子で構成されます (例: database.table
)。クエリにこの構造が反映されていることを確認してください (SELECT * FROM database.table
など)。
このサンプルのソース コードは GitHub にあります。