Page tree

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Info

CAST supports Azure Cosmos DB via its NoSQL for Java extension. Details about the support provided for Java source code is explained below.

Supported Client Libraries

Azure Cosmos DB Java with Spring SDK 
LibraryVersionSupported
Azure spring data cosmos

Up to: 3.10.0

      (tick)Image Added


Supported Operations

OperationsMethod Supported
Insert


Expand
titleInsert Operation APIs
  • org.springframework.data.repository.CrudRepository.save
  • org.springframework.data.repository.CrudRepository.saveAll
  • org.springframework.data.repository.reactive.ReactiveCrudRepository.save
  • org.springframework.data.repository.reactive.ReactiveCrudRepository.saveAll
  • com.microsoft.azure.spring.data.cosmosdb.repository.DocumentDbRepository.save
  • com.microsoft.azure.spring.data.cosmosdb.repository.DocumentDbRepository.saveAll
  • com.microsoft.azure.spring.data.cosmosdb.repository.CosmosRepository

org.springframework.data.repository.CrudRepository

(tick)Azure Cosmos DB Async Java with Spring SDK
  • .save
  • com.microsoft.azure.spring.data.cosmosdb.repository.CosmosRepository.saveAll
  • com.microsoft.azure.spring.data.cosmosdb.repository.ReactiveCosmosRepository.save
  • com.microsoft.azure.spring.data.cosmosdb.repository.ReactiveCosmosRepository.saveAll
  • com.azure.spring.data.cosmos.repository.CosmosRepository.save
  • com.azure.spring.data.cosmos.repository.CosmosRepository.saveAll
  • com.azure.spring.data.cosmos.repository.ReactiveCosmosRepository.save
  • com.azure.spring.data.cosmos.repository.ReactiveCosmosRepository.saveAll
  • com.microsoft.azure.spring.data.cosmosdb.core.CosmosTemplate.insert
  • com.microsoft.azure.spring.data.cosmosdb.core.ReactiveCosmosTemplate.insert


Select


Expand
titleSelect Operation APIs
  • org.springframework.data.repository.CrudRepository.existsById
  • org.springframework.data.repository
.ReactiveCosmosRepository
  • .CrudRepository.findAll
  • org.springframework.data.repository.CrudRepository.findById
  • org.springframework.data.repository.PagingAndSortingRepository.findAll
  • org.springframework.data.repository.reactive.ReactiveCrudRepository.existsById
  • org.springframework.data.repository.reactive.ReactiveCrudRepository.findAll
  • org.springframework.data.repository.reactive.ReactiveCrudRepository.findAllById
  • org.springframework.data.repository.reactive.ReactiveCrudRepository
(tick)

Supported Operations

OperationsMethod SupportedInsert
  • save
  • saveAll
Select
  • existsById
  • findById
  • findAll
  • findAllById
  • count
Delete
  • delete
  • deleteAll
  • deleteById
  • deleteAllById
    • .findById
    • org.springframework.data.repository.reactive.ReactiveSortingRepository.findAll
    • com.azure.spring.data.cosmos.repository.CosmosRepository.findById
    • com.azure.spring.data.cosmos.repository.CosmosRepository.findAll
    • com.azure.spring.data.cosmos.repository.CosmosRepository.existsById
    • com.azure.spring.data.cosmos.repository.CosmosRepository.count
    • com.azure.spring.data.cosmos.repository.CosmosRepository.findAllById
    • com.azure.spring.data.cosmos.repository.ReactiveCosmosRepository.findbyId
    • com.azure.spring.data.cosmos.repository.ReactiveCosmosRepository.findAll
    • com.azure.spring.data.cosmos.repository.ReactiveCosmosRepository.existsById
    • com.azure.spring.data.cosmos.repository.ReactiveCosmosRepository.count
    • com.azure.spring.data.cosmos.repository.ReactiveCosmosRepository.findAllById
    • com.microsoft.azure.spring.data.cosmosdb.repository.CosmosRepository.findById
    • com.microsoft.azure.spring.data.cosmosdb.repository.CosmosRepository.findAll
    • com.microsoft.azure.spring.data.cosmosdb.repository.CosmosRepository.existsById
    • com.microsoft.azure.spring.data.cosmosdb.repository.CosmosRepository.findAllById
    • com.microsoft.azure.spring.data.cosmosdb.repository.CosmosRepository.count
    • com.microsoft.azure.spring.data.cosmosdb.repository.DocumentDbRepository.findAll
    • com.microsoft.azure.spring.data.cosmosdb.repository.DocumentDbRepository.existsById
    • com.microsoft.azure.spring.data.cosmosdb.repository.DocumentDbRepository.findAllById
    • com.microsoft.azure.spring.data.cosmosdb.repository.DocumentDbRepository.count
    • com.microsoft.azure.spring.data.cosmosdb.repository.ReactiveSortingRepository.findAll
    • com.microsoft.azure.spring.data.cosmosdb.core.CosmosOperations.findAll
    • com.microsoft.azure.spring.data.cosmosdb.core.CosmosOperations.find
    • com.microsoft.azure.spring.data.cosmosdb.core.CosmosOperations.findByIds
    • com.microsoft.azure.spring.data.cosmosdb.core.CosmosOperations.exists
    • com.microsoft.azure.spring.data.cosmosdb.core.CosmosOperations.count
    • com.microsoft.azure.spring.data.cosmosdb.core.CosmosOperations.findById
    • com.microsoft.azure.spring.data.cosmosdb.core.CosmosTemplate.findById
    • com.microsoft.azure.spring.data.cosmosdb.core.ReactiveCosmosOperations.findAll
    • com.microsoft.azure.spring.data.cosmosdb.core.ReactiveCosmosOperations.find
    • com.microsoft.azure.spring.data.cosmosdb.core.ReactiveCosmosOperations.findByIds
    • com.microsoft.azure.spring.data.cosmosdb.core.ReactiveCosmosOperations.exists
    • com.microsoft.azure.spring.data.cosmosdb.core.ReactiveCosmosOperations.count
    • com.microsoft.azure.spring.data.cosmosdb.core.ReactiveCosmosOperations.findById
    • com.microsoft.azure.spring.data.cosmosdb.core.ReactiveCosmosTemplate.findById
    • com.microsoft.azure.spring.data.cosmosdb.repository.ReactiveCosmosRepository.findById
    • com.microsoft.azure.spring.data.cosmosdb.repository.ReactiveCosmosRepository.findAll
    • com.microsoft.azure.spring.data.cosmosdb.repository.ReactiveCosmosRepository.count
    • com.microsoft.azure.spring.data.cosmosdb.repository.ReactiveCosmosRepository.findAllById
    • com.microsoft.azure.spring.data.cosmosdb.repository.ReactiveCosmosRepository.existsById


    Delete


    Expand
    title Delete Operation APIs
    • org.springframework.data.repository.CrudRepository.delete
    • org.springframework.data.repository.CrudRepository.deleteById
    • org.springframework.data.repository.CrudRepository.deleteAllById
    • org.springframework.data.repository.CrudRepository.deleteAll
    • org.springframework.data.repository.reactive.ReactiveCrudRepository.delete
    • org.springframework.data.repository.reactive.ReactiveCrudRepository.deleteAll
    • org.springframework.data.repository.reactive.ReactiveCrudRepository.deleteAllById
    • org.springframework.data.repository.reactive.ReactiveCrudRepository.deleteById
    • com.azure.spring.data.cosmos.repository.CosmosRepository.deleteById
    • com.azure.spring.data.cosmos.repository.CosmosRepository.delete
    • com.azure.spring.data.cosmos.repository.CosmosRepository.deleteAll
    • com.azure.spring.data.cosmos.repository.ReactiveCosmosRepository.deletebyId
    • com.azure.spring.data.cosmos.repository.ReactiveCosmosRepository.deleteAll
    • com.azure.spring.data.cosmos.repository.ReactiveCosmosRepository.delete
    • com.microsoft.azure.spring.data.cosmosdb.core.CosmosOperations.deleteAll
    • com.microsoft.azure.spring.data.cosmosdb.core.CosmosOperations.delete
    • com.microsoft.azure.spring.data.cosmosdb.core.CosmosOperations.deleteCollection
    • com.microsoft.azure.spring.data.cosmosdb.core.ReactiveCosmosOperations.deleteAll
    • com.microsoft.azure.spring.data.cosmosdb.core.ReactiveCosmosOperations.delete
    • com.microsoft.azure.spring.data.cosmosdb.core.ReactiveCosmosOperations.deleteCollection
    • com.microsoft.azure.spring.data.cosmosdb.repository.ReactiveCosmosRepository.deleteById
    • com.microsoft.azure.spring.data.cosmosdb.repository.ReactiveCosmosRepository.deleteAll
    • com.microsoft.azure.spring.data.cosmosdb.repository.ReactiveCosmosRepository.delete
    • com.microsoft.azure.spring.data.cosmosdb.repository.CosmosRepository.deleteById
    • com.microsoft.azure.spring.data.cosmosdb.repository.DocumentDbRepository.deletebyId
    • com.microsoft.azure.spring.data.cosmosdb.repository.DocumentDbRepository.deleteAll
    • com.microsoft.azure.spring.data.cosmosdb.repository.DocumentDbRepository.delete



    Info

    Above mentioned methods are supported for both Synchronous and Asynchronous clients.

    Objects

    IconDescription

    Image Modified

    Java CosmosDB Database

    Image Modified

    Java CosmosDB Collection

    Image Modified

    Java Unknown CosmosDB Database

    Image Modified

    Java Unknown CosmosDB Collection

    Links

    Links are created for transaction and function point needs:

    Link typeSource and destination of linkMethods Supported
    parentLink

    Between CosmosDB Database object and CosmosDB Collection


    useInsertLink

    Between the caller Java Method objects and CosmosDB Collection

    • save
    • saveAll

    useSelectLink

    • existsById
    • findById
    • findAll
    • findAllById
    • count
    useDeleteLink
    • delete
    • deleteAll
    • deleteById
    • deleteAllById

    What results can you expect?

    Once the analysis/snapshot generation is completed, you can view the results in the normal manner (for example via CAST Enlighten). Some examples are shown below.

    CosmosDB Database Connection from Properties File

    Expand
    titleConnection


    Code Block
    languagetext
    titleapplication.properties
    azure.cosmosdb.uri=https://cosmoswithspring.documents.azure.com:443/
    azure.cosmosdb.key=2VanbwRYNeJKCUjb5StsnBKaatDcKGRUckHnlSUVSJXifWL3exjwjP2o6rJpt8fY24MRmtnctzcE8hWAlBsRZw==
    azure.cosmosdb.database=cosmoswithspring


    Code Block
    languagejava
    titleCosmos DB Client Creation
    @Configuration
    @EnableDocumentDbRepositories
    public class AppConfig extends AbstractDocumentDbConfiguration {
     
        @Value("${azure.documentdb.uri}")
        private String uri;
     
        @Value("${azure.documentdb.key}")
        private String key;
     
        @Value("${azure.documentdb.database}")
        private String dbName;
     
        public DocumentClient documentClient() {
            return new DocumentClient(uri, key, ConnectionPolicy.GetDefault(), ConsistencyLevel.Session);
        }
     
        public String getDatabase() {
            return dbName;
        }
    }
    

    Select Operation

    Expand
    titleSelect


    Code Block
    languagejava
    titleCreateDocument
    	 @Autowired
        private AlertRepository alertRepository;
    
        @GetMapping("/all")
        public Iterable getAllAlerts() {
            if (StreamSupport.stream(alertRepository.findAll().spliterator(), false).count() > 0) {
                return alertRepository.findAll();
            } else {
                throw new ValidationException("No records found.");
            }
        }
    
     @GetMapping("/count")
        public long countAlert() {
            if (StreamSupport.stream(alertRepository.findAll().spliterator(), false).count() > 0) {
                return alertRepository.count();
            } else {
                throw new ValidationException("No records found.");
            }
        }
    
    
    
    

    Insert Operation

    Expand
    titleInsert


    Code Block
    languagejava
    titleQueryDocuments
     @PostMapping("/add")
        public StatusMessage addAlert(@Valid @RequestBody Alert alert) {
            Alert returnedAlert = alertRepository.save(alert);
            if (returnedAlert.getAlertId().isEmpty()) {
                throw new ValidationException("Error accessing Cosmos database.");
            }
            return new StatusMessage("200", "Alert Added");
        }


    Delete Operation

    Expand
    titleDelete


    Code Block
    languagejava
    titleDeleteDocument
    @GetMapping("/deleteall")
        public StatusMessage deleteAllAlert() {
            alertRepository.deleteAll();
            
            return new StatusMessage("200", "Alert Deleted");
        }
    
     @DeleteMapping("/delete/{id}")
        public StatusMessage deleteAlert(@PathVariable String id) throws NotFoundException {
        	//Optional<Alert> returnedAlert = alertRepository.findById(id);
            if (!alertRepository.existsById(id)) {
                throw new NotFoundException("No alert found with id: " + id);
            }
            alertRepository.deleteById(id);
            return new StatusMessage("200", "alert deleted.");
        }
    
    
    

    Query Method Support

    Expand
    titleQuery Methods


    Code Block
    languagejava
    titleRepo with query method
    @Repository
    public interface AlertRepository extends CosmosRepository<Alert, String> {
    // repo for alert
    	List<Alert> findById(String priority);
    }


    Code Block
    languagejava
    titleController
    @GetMapping("find/{id}")
        public Alert findAlert(@PathVariable String id) throws NotFoundException {
            return alertRepository.findById(id).orElseThrow(
                    () -> new NotFoundException("No alert found with id: " + id)
            );
    }


    Query Methods with @Query annotation 

    Expand
    titleQuery Methods


    Code Block
    languagejava
    titleRepository with @query methods
    @Repository
    public interface AddressRepository extends CosmosRepository<Address, String> {
        void deleteByPostalCodeAndCity(String postalCode, String city);
    
        void deleteByCity(String city);
    
        Iterable<Address> findByPostalCodeAndCity(String postalCode, String city);
    
        Iterable<Address> findByCity(String city);
    
        Iterable<Address> findByCityIn(List<String> cities);
    
        Iterable<Address> findByPostalCode(String postalCode);
    
        Iterable<Address> findByPostalCodeInAndCity(List<String> postalCodes, String city);
    
        Iterable<Address> findByStreetOrCity(String street, String city);
    
        @Query("select * from a where a.city = @city")
        List<Address> annotatedFindListByCity(@Param("city") String city);
    
        @Query("select * from a where a.city = @city")
        Page<Address> annotatedFindByCity(@Param("city") String city, Pageable pageable);
    }


    Code Block
    languagejava
    public void testAnnotatedQuery() {
            addressRepository.saveAll(Arrays.asList(Address.TEST_ADDRESS1_PARTITION1, Address.TEST_ADDRESS1_PARTITION2));
    
            final List<Address> result = addressRepository.annotatedFindListByCity(Address.TEST_ADDRESS1_PARTITION1.getCity());
            assertThat(result).isNotNull();
            assertThat(result.size()).isEqualTo(1);
            assertThat(result.get(0)).isEqualTo(Address.TEST_ADDRESS1_PARTITION1);
        }


    Image Added

    Asynchronous API

    Expand
    titleAll corresponding methods are represented and results are very similar to its Synchronous counterpart


    Code Block
    languagejava
    titleAsync Client creation
    import com.microsoft.azure.spring.data.cosmosdb.repository.ReactiveCosmosRepository;
    
    import info.hayslip.AlertHoarder.models.Alert;
    import org.springframework.stereotype.Repository;
    
    @Repository
    public interface AlertReactRepository extends ReactiveCosmosRepository<Alert, String> {
    // repo for alert
    }

    Evolutions

    ...

    ...



    Limitations

    • Database/Collection is created as unknown, if the name is not retrieved from the properties file or if the name could not be resolved.

    Future Scope

    • To Support Query Methods using @Query annotation