Alıştırma - Azure Cosmos DB Java SDK’sını kullanarak sorgulama

Tamamlandı

Artık uygulamanızda belgeler oluşturduğunuza göre, bunları uygulamanızdan sorgulayabilirsiniz. Azure Cosmos DB Java SDK'sında SQL sorguları kullanılır. .NET SDK'sında LINQ sorguları için de destek sunulur ancak Java SDK'sında analog desteği yoktur. Bu ünite, portalın aksine uygulamanızdan SQL sorgularının çalıştırılması ile ilgilidir.

Bu sorguları test etmek için çevrimiçi şirket uygulamanız için oluşturduğunuz kullanıcı belgelerini kullanacağız.

SQL sorgusu çalıştırma

  1. Aşağıdaki örnekte, Java kodunuzdan SQL ile nasıl sorgu gerçekleştirilebileceği gösterilmiştir. Kodu kopyalayıp CosmosApp.java dosyasının sonuna ekleyin.

    /**
     * Execute a custom query on the Azure Cosmos DB container.
     * @param query Query String.
     */
    private static void executeSimpleQuery(final String query) {
    
        final int preferredPageSize = 10;
        CosmosQueryRequestOptions queryOptions = new CosmosQueryRequestOptions();
    
        CosmosPagedFlux<User> pagedFluxResponse = container.queryItems(
                query, queryOptions, User.class);
    
        logger.info("Running SQL query...");
    
        pagedFluxResponse.byPage(preferredPageSize).flatMap(fluxResponse -> {
            logger.info("Got a page of query result with " + fluxResponse.getResults().size()
                    + " items(s) and request charge of " + fluxResponse.getRequestCharge());
    
            logger.info("Item Ids " + fluxResponse
                    .getResults()
                    .stream()
                    .map(User::getId)
                    .collect(Collectors.toList()));
    
            return Flux.empty();
        }).blockLast();
    }
    

    Bu kodu incelerseniz yine Project Reactor'ın bildirim temelli veri akışı programlama modelini kullandığımızı görebilirsiniz. Modeli bu kez sorgu yanıtı sayfalarını zaman uyumsuz bir şekilde işlemek için kullanıyoruz. Gerçek kullanım örneğinde bir sorguya yüzlerce veya binlerce yanıt döndürülebileceğinden zaman uyumsuz yaklaşım kullanıyoruz. Sorgu yanıtlarını toplama işlemi, zaman uyumsuz programlama ile sunulan yüksek iş parçacığı verimliliğinden faydalanabilecek yoğun CPU kullanan bir görev olabilir.

    Kısaca ifade etmek gerekirse sorgu yanıtlarını işleme sırasında yüksek aktarım hızı elde etmek veya iş parçacığı başına sayfa/saniye oranını artırmak istiyoruz. queryitems, CosmosPagedFlux örneği olan pagedFluxResponse öğesini döndürür, pagedFluxResponse.byPage(preferredPageSize) ise zaman uyumsuz sayfa olaylarının kaynağı olan Flux öğesini oluşturur. .flatMap( ... ).blockLast(); içindeki operasyon işlem hattı, Flux örneği tarafından yayılan her bir olayla ilişkili sorgu yanıt sayfasında zaman uyumsuz ve paralel bir şekilde çalışır.

  2. Aşağıdaki kodu kopyalayıp basicOperations yönteminize, belge silme kodunun öncesine yapıştırın.

    executeSimpleQuery("SELECT * FROM User WHERE User.lastName = 'Pindakova'");
    
  3. CosmosApp.java uygulamasını IDE'de derleyip çalıştırın veya şu komutu kullanarak programı terminalde çalıştırın:

    mvn clean package
    mvn exec:java -Dexec.mainClass="com.azure.cosmos.examples.mslearnbasicapp.CosmosApp"
    

    Terminalde çıkış şöyle görünmelidir:

    INFO: Database and container validation complete
    INFO: User 1 already exists in the database
    INFO: User 2 already exists in the database
    INFO: Read User 1
    INFO: Replaced last name for Suh
    INFO: Running SQL query...
    INFO: Got a page of query result with 1 items(s) and request charge of 2.83
    INFO: Item Ids [2]
    INFO: Deleted User 1
    

Artık uygulamanızda belgeler oluşturduğunuza göre, bunları uygulamanızdan sorgulayabilirsiniz. Spring Data Azure Cosmos DB, türetilmiş sorgu yöntemlerinin yanı sıra özel sorgu yöntemlerini de kullanıma sunar - bunların ikisi de temel alınan Azure Cosmos DB Java SDK v4’ün SQL dili sorgu özelliklerini genişletir. Bu ünite, portalın aksine uygulamanızdan Spring Data Azure Cosmos DB sorgularının çalıştırılması ile ilgilidir.

Bu sorguları test etmek için çevrimiçi şirket uygulamanız için oluşturduğunuz WebCustomer belgelerini kullanacağız.

Türetilen sorgu yöntemleri oluşturma ve çağırma

Türetilmiş sorgu yöntemleri, uygulama içermeyen Spring Data deposu yöntemleridir; bunun yerine, yöntem adı her yöntem çağrısını ve bağımsız değişkenlerini temel alınan veritabanındaki bir sorguya çevirmek için Spring Data’ya sinyal gönderir. Örneğin, bazı bağımsız değişkenlerle findById çağırdığınızda Spring Data yöntem adını "kimliğe göre bul" olarak okur ve bağımsız değişkenler tarafından belirtilen belgeyi döndüren bir veritabanı sorgusu derler.

Spring Data Azure Cosmos DB, findById dahil çeşitli yerleşik türetilmiş sorgu yöntemleri içerir. Bu bölümde, yeni türetilmiş sorgu yöntemlerinin nasıl uygulanacağını göstereceğiz.

  1. firstName alanı için belirli bir değere sahip tüm belgeleri sorgulayan türetilmiş bir sorgu yöntemi oluşturacağız. ReactiveWebCustomerRepository.java dosyasına gidin. Aşağıdaki yöntem bildirimini görürsünüz:

    Flux<WebCustomer> findByFirstName(String firstName);
    

    Bu depo yöntemi, çağrıldığında firstName öğesinde sorgulama yapan bir yöntemi istediğinizi Spring Data’ya bildirir. WebCustomer sınıfının WebCustomers olarak containerName belirten bir @Container ek açıklaması ile başladığını hatırlayın. findByFirstNameFlux<WebCustomer> döndürdüğünden, Spring Data bu yöntem çağrıldığında WebCustomers öğesini sorgulaması gerektiğini bilir.

  2. Aşağıdaki kodu kopyalayıp run yönteminize, deleteWebCustomerDocument çağrısının öncesine yapıştırın.

    logger.info("Running derived query...");
    Flux<WebCustomer> webCustomers = reactiveWebCustomerRepository.findByFirstName("Max");
    webCustomers.flatMap(webCustomer -> {
        logger.info("- WebCustomer is : {}", webCustomer.getUserId());
        return Mono.empty();
    }).blockLast();
    

    Bu kodu incelerseniz yine Project Reactor'ın bildirim temelli veri akışı programlama modelini kullandığımızı görebilirsiniz. Modeli bu kez sorgu yanıtı sayfalarını zaman uyumsuz bir şekilde işlemek için kullanıyoruz. Gerçek kullanım örneğinde bir sorguya yüzlerce veya binlerce yanıt döndürülebileceğinden zaman uyumsuz yaklaşım kullanıyoruz. Sorgu yanıtlarını toplama işlemi, zaman uyumsuz programlama ile sunulan yüksek iş parçacığı verimliliğinden faydalanabilecek yoğun CPU kullanan bir görev olabilir.

    Kısaca ifade etmek gerekirse sorgu yanıtlarını işleme sırasında yüksek aktarım hızı elde etmek veya iş parçacığı başına yanıt/saniye oranını artırmak istiyoruz. findByFirstName, Flux<WebCustomer> örneğini (webCustomers) döndürür. .flatMap( ... ).blockLast(); içindeki operasyon işlem hattı, Flux<WebCustomer> tarafından yayılan her bir olayla ilişkili sorgu yanıtlarında zaman uyumsuz ve paralel bir şekilde çalışır.

  3. CosmosSample.java uygulamasını IDE'de derleyip çalıştırın veya şu komutu kullanarak programı terminalde çalıştırın:

    mvn clean package
    mvn spring-boot:run
    

    Terminalde çıkış şöyle görünmelidir:

    INFO: - WebCustomer is : maxaxam
    

Özel sorgu yöntemleri oluşturma ve çağırma

Özel sorgu yöntemleri, bir sorgu dizesi belirten @Query ek açıklamasına sahip Spring Data deposu yöntemleridir ve sorgu dizesinde yöntem bağımsız değişkenleri için yer tutucular bulunur. Bu kez, yöntem adının hangi sorgunun gerçekleştirildiği üzerinde hiçbir etkisi yoktur. @Query ek açıklaması, bağımsız değişken yer tutucuları yöntem bağımsız değişkenlerinin değerleriyle doldurduktan sonra, Spring Data’ya temel veritabanına bir SQL dili sorgusu vermesi için sinyal gönderir.

  1. lastName alanı için belirli bir değere sahip tüm belgeleri sorgulayan özel bir sorgu yöntemi oluşturacağız. ReactiveWebCustomerRepository.java dosyasına gidin. Aşağıdaki yöntem bildirimini görürsünüz:

    @Query(value = "SELECT * FROM User WHERE User.lastName = @lastName")
    Flux<WebCustomer> findByLastName(@Param("lastName") String lastName);
    

    Bu depo yöntemi, çağrıldığında lastName öğesinde sorgulama yapan bir yöntemi istediğinizi Spring Data’ya bildirir. lastName bağımsız değişken değeri, @lastName yer tutucusunun yerine kullanılır.

  2. Aşağıdaki kodu kopyalayıp run yönteminize, türetilmiş sorgu kodunun sonrasına yapıştırın.

    logger.info("Running custom query...");
    webCustomers = reactiveWebCustomerRepository.findByLastName("Axam");
    webCustomers.flatMap(webCustomer -> {
        logger.info("- WebCustomer is : {}", webCustomer.getUserId());
        return Mono.empty();
    }).blockLast();
    
  3. CosmosSample.java uygulamasını IDE'de derleyip çalıştırın veya şu komutu kullanarak programı terminalde çalıştırın:

    mvn clean package
    mvn spring-boot:run
    

    Terminalde çıkış şöyle görünmelidir:

    INFO: Running derived query...
    INFO: - WebCustomer is : maxaxam
    INFO: Running custom query...
    INFO: - WebCustomer is : maxaxam    
    

Bu ünitede, türetilmiş ve özel sorgular hakkında bilgi edindiniz. Ardından uygulamanıza kullanıcı kayıtlarını almak için her iki sorgu türünü de eklediniz.