DocumentDB SQL - Fungsi yang Ditentukan Pengguna
DocumentDB SQL menyediakan dukungan untuk User-Defined Functions (UDFs). UDF hanyalah jenis fungsi JavaScript lain yang dapat Anda tulis dan berfungsi seperti yang Anda harapkan. Anda bisa membuat UDF untuk memperluas bahasa kueri dengan logika bisnis kustom yang bisa Anda referensikan dalam kueri Anda.
Sintaks SQL DocumentDB diperluas untuk mendukung logika aplikasi kustom menggunakan UDF ini. UDF dapat didaftarkan dengan DocumentDB dan kemudian direferensikan sebagai bagian dari kueri SQL.
Mari pertimbangkan tiga dokumen berikut untuk contoh ini.
AndersenFamily dokumen adalah sebagai berikut.
{
"id": "AndersenFamily",
"lastName": "Andersen",
"parents": [
{ "firstName": "Thomas", "relationship": "father" },
{ "firstName": "Mary Kay", "relationship": "mother" }
],
"children": [
{
"firstName": "Henriette Thaulow",
"gender": "female",
"grade": 5,
"pets": [ { "givenName": "Fluffy", "type": "Rabbit" } ]
}
],
"location": { "state": "WA", "county": "King", "city": "Seattle" },
"isRegistered": true
}
SmithFamily dokumen adalah sebagai berikut.
{
"id": "SmithFamily",
"parents": [
{ "familyName": "Smith", "givenName": "James" },
{ "familyName": "Curtis", "givenName": "Helen" }
],
"children": [
{
"givenName": "Michelle",
"gender": "female",
"grade": 1
},
{
"givenName": "John",
"gender": "male",
"grade": 7,
"pets": [
{ "givenName": "Tweetie", "type": "Bird" }
]
}
],
"location": {
"state": "NY",
"county": "Queens",
"city": "Forest Hills"
},
"isRegistered": true
}
WakefieldFamily dokumen adalah sebagai berikut.
{
"id": "WakefieldFamily",
"parents": [
{ "familyName": "Wakefield", "givenName": "Robin" },
{ "familyName": "Miller", "givenName": "Ben" }
],
"children": [
{
"familyName": "Merriam",
"givenName": "Jesse",
"gender": "female",
"grade": 6,
"pets": [
{ "givenName": "Charlie Brown", "type": "Dog" },
{ "givenName": "Tiger", "type": "Cat" },
{ "givenName": "Princess", "type": "Cat" }
]
},
{
"familyName": "Miller",
"givenName": "Lisa",
"gender": "female",
"grade": 3,
"pets": [
{ "givenName": "Jake", "type": "Snake" }
]
}
],
"location": { "state": "NY", "county": "Manhattan", "city": "NY" },
"isRegistered": false
}
Mari kita lihat contoh di mana kita akan membuat beberapa UDF sederhana.
Berikut adalah implementasi dari CreateUserDefinedFunctions.
private async static Task CreateUserDefinedFunctions(DocumentClient client) {
Console.WriteLine();
Console.WriteLine("**** Create User Defined Functions ****");
Console.WriteLine();
await CreateUserDefinedFunction(client, "udfRegEx");
}
Kami memiliki udfRegEx, dan di CreateUserDefinedFunction kami mendapatkan kode JavaScript-nya dari file lokal kami. Kami membuat objek definisi untuk UDF baru, dan memanggil CreateUserDefinedFunctionAsync dengan objek SelfLink dan udfDefinition koleksi seperti yang ditunjukkan pada kode berikut.
private async static Task<UserDefinedFunction>
CreateUserDefinedFunction(DocumentClient client, string udfId) {
var udfBody = File.ReadAllText(@"..\..\Server\" + udfId + ".js");
var udfDefinition = new UserDefinedFunction {
Id = udfId,
Body = udfBody
};
var result = await client
.CreateUserDefinedFunctionAsync(_collection.SelfLink, udfDefinition);
var udf = result.Resource;
Console.WriteLine("Created user defined function {0}; RID: {1}",
udf.Id, udf.ResourceId);
return udf;
}
Kami mendapatkan kembali UDF baru dari properti sumber daya hasil dan mengembalikannya ke pemanggil. Untuk menampilkan UDF yang sudah ada berikut ini adalah implementasi dariViewUserDefinedFunctions. Kami memanggilCreateUserDefinedFunctionQuery dan memutarnya seperti biasa.
private static void ViewUserDefinedFunctions(DocumentClient client) {
Console.WriteLine();
Console.WriteLine("**** View UDFs ****");
Console.WriteLine();
var udfs = client
.CreateUserDefinedFunctionQuery(_collection.UserDefinedFunctionsLink)
.ToList();
foreach (var udf in udfs) {
Console.WriteLine("User defined function {0}; RID: {1}", udf.Id, udf.ResourceId);
}
}
DocumentDB SQL tidak menyediakan fungsi bawaan untuk mencari substring atau ekspresi reguler, oleh karena itu baris satu kecil berikut mengisi celah itu yang merupakan fungsi JavaScript.
function udfRegEx(input, regex) {
return input.match(regex);
}
Dengan mempertimbangkan string input di parameter pertama, gunakan dukungan ekspresi reguler bawaan JavaScript yang meneruskan string pencocokan pola di parameter kedua ke.match. Kita dapat menjalankan kueri substring untuk menemukan semua toko dengan kata Andersen di dalamnyalastName Properti.
private static void Execute_udfRegEx(DocumentClient client) {
var sql = "SELECT c.name FROM c WHERE udf.udfRegEx(c.lastName, 'Andersen') != null";
Console.WriteLine();
Console.WriteLine("Querying for Andersen");
var documents = client.CreateDocumentQuery(_collection.SelfLink, sql).ToList();
Console.WriteLine("Found {0} Andersen:", documents.Count);
foreach (var document in documents) {
Console.WriteLine("Id: {0}, Name: {1}", document.id, document.lastName);
}
}
Perhatikan bahwa kita harus memenuhi syarat setiap referensi UDF dengan awalan udf. Kami baru saja meneruskan SQL keCreateDocumentQueryseperti pertanyaan biasa. Akhirnya, mari kita panggil kueri di atas dariCreateDocumentClient tugas
private static async Task CreateDocumentClient() {
// Create a new instance of the DocumentClient
using (var client = new DocumentClient(new Uri(EndpointUrl), AuthorizationKey)){
database = client.CreateDatabaseQuery("SELECT * FROM c WHERE
c.id = 'myfirstdb'").AsEnumerable().First();
collection = client.CreateDocumentCollectionQuery(database.CollectionsLink,
"SELECT * FROM c WHERE c.id = 'Families'").AsEnumerable().First();
await CreateUserDefinedFunctions(client);
ViewUserDefinedFunctions(client);
Execute_udfRegEx(client);
}
}
Ketika kode di atas dijalankan, ini menghasilkan keluaran sebagai berikut.
**** Create User Defined Functions ****
Created user defined function udfRegEx; RID: kV5oANVXnwAlAAAAAAAAYA==
**** View UDFs ****
User defined function udfRegEx; RID: kV5oANVXnwAlAAAAAAAAYA==
Querying for Andersen
Found 1 Andersen:
Id: AndersenFamily, Name: Andersen