DocumentDB SQL - Kullanıcı Tanımlı İşlevler
DocumentDB SQL, Kullanıcı Tanımlı İşlevler (UDF'ler) için destek sağlar. UDF'ler, yazabileceğiniz başka bir tür JavaScript işlevidir ve bunlar, beklediğiniz gibi çalışır. Sorgu dilini, sorgularınızda başvurabileceğiniz özel iş mantığı ile genişletmek için UDF'ler oluşturabilirsiniz.
DocumentDB SQL sözdizimi, bu UDF'leri kullanarak özel uygulama mantığını desteklemek için genişletilmiştir. UDF'ler DocumentDB ile kaydedilebilir ve ardından bir SQL sorgusunun parçası olarak referans gösterilebilir.
Bu örnek için aşağıdaki üç belgeyi ele alalım.
AndersenFamily belge aşağıdaki gibidir.
{
"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 belge aşağıdaki gibidir.
{
"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 belge aşağıdaki gibidir.
{
"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
}
Bazı basit UDF'ler oluşturacağımız bir örneğe bakalım.
Aşağıdaki uygulamasıdır CreateUserDefinedFunctions.
private async static Task CreateUserDefinedFunctions(DocumentClient client) {
Console.WriteLine();
Console.WriteLine("**** Create User Defined Functions ****");
Console.WriteLine();
await CreateUserDefinedFunction(client, "udfRegEx");
}
Bir udfRegEx'imiz var ve CreateUserDefinedFunction'da JavaScript kodunu yerel dosyamızdan alıyoruz. Yeni UDF için tanım nesnesini oluşturuyoruz ve aşağıdaki kodda gösterildiği gibi koleksiyonun SelfLink ve udfDefinition nesnesiyle CreateUserDefinedFunctionAsync çağırıyoruz.
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;
}
Yeni UDF'yi sonucun resource özelliğinden geri alıyoruz ve çağırana geri döndürüyoruz. Mevcut UDF'yi görüntülemek için, aşağıdakilerin uygulanması şöyledir:ViewUserDefinedFunctions. Biz ararızCreateUserDefinedFunctionQuery ve her zamanki gibi bunların üzerinden geçin.
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 alt dizeleri veya normal ifadeleri aramak için yerleşik işlevler sağlamaz, bu nedenle aşağıdaki küçük tek satırlık bir JavaScript işlevi olan bu boşluğu doldurur.
function udfRegEx(input, regex) {
return input.match(regex);
}
İlk parametrede girdi dizesi verildiğinde, JavaScript'in yerleşik normal ifade desteğini ikinci parametrede kalıp eşleştirme dizesini içine geçirmeyi kullanın.match. İçinde Andersen yazan tüm mağazaları bulmak için bir alt dize sorgusu çalıştırabiliriz.lastName Emlak.
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);
}
}
Her UDF referansını önek ile nitelendirmemiz gerektiğini unutmayın udf. SQL'i şimdi geçtikCreateDocumentQuerysıradan bir sorgu gibi. Son olarak, yukarıdaki sorgularıCreateDocumentClient görev
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);
}
}
Yukarıdaki kod çalıştırıldığında, aşağıdaki çıktıyı üretir.
**** 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