Привіт. Зайшла задача на автоматизацію API тестів та БД CosmosDB. Не можу найти якогось паттерна проектування для робити з цією БД. Я раніше на робив з Azure DB, можливо щось не знаю де шукати.
Для роботи з CosmosDB використав бібліотеку 'com.microsoft.azure:azure-storage:8.6.0'
і зєднуюсь з БД через CloudStorageAccount
. Потрібно буде робити запити типу Select, Update, Insert, Delete.
Для прикладу, код запиту виглядає так:
String config = "DefaultEndpointsProtocol=https;AccountName=name;AccountKey=key;TableEndpoint=https://endpoint.table.cosmos.azure.com:443/";
CloudStorageAccount cloudStorageAccount = CloudStorageAccount.parse(config);
CloudTableClient tableClient = cloudStorageAccount.createCloudTableClient();
try {
CloudTable cloudTable = tableClient.getTableReference("tableName");
cloudTable.createIfNotExists();
TableQuery<TestEntity> query =
new TableQuery<TestEntity>()
.where(TableQuery.generateFilterCondition("ColumnName",
TableQuery.QueryComparisons.EQUAL, "testValue"));
Iterable<TestEntity> it = cloudTable.execute(query);
List<TestEntity> list= StreamSupport.stream(it.spliterator(), false).collect(Collectors.toList());
} catch (StorageException e) {
e.printStackTrace();
}
TestEntity
- це клас, який реалізовує колонки табличики.
При реалізації своєїї абстракції зіштовхнувся з такими питаннями:
- Для роботи з БД використувують
Sigleton
для створення одного конекшина, не розумію, як його зробити зCloudStorageAccount
. - Осікльки ми робимо для кожної таблички окремий клієнт
CloudTable cloudTable = tableClient.getTableReference("tableName");
, відповідно для кожної таблички потрібно буде зробити свій клас з запитами. Але тоді сильно буду завязуватись на реалізаціїquery
→
TableQuery<TableEntity> query =
new TableQuery<TableEntity>()
.where(TableQuery.generateFilterCondition(columnName,
operation, value));
а саме на типі фільтрів where
(можуть такі варіанти select, take, getColumns
ітд) і на типі порівнювального оператора TableQuery.QueryComparisons.EQUAL
(можуть бути NOT_EQUAL, GREATER_THAN
ітд)
Приклад методу:
public static List<TableEntity> select(String columnName, String operation, String value) {
Iterable<TableEntity> resultQuery = null;
try {
CloudStorageAccount cloudStorageAccount = CloudStorageAccount.parse(config);
CloudTableClient tableClient = cloudStorageAccount.createCloudTableClient();
CloudTable cloudTable = tableClient.getTableReference(tableName);
cloudTable.createIfNotExists();
TableQuery<TableEntity> query =
new TableQuery<TableEntity>()
.where(TableQuery.generateFilterCondition(columnName,
operation, value));
resultQuery = cloudTable.execute(query);
} catch (StorageException | URISyntaxException | InvalidKeyException e) {
e.printStackTrace();
}
return StreamSupport.stream(resultQuery.spliterator(), false).collect(Collectors.toList());
}
або метод, який вже приймає запит
public static List<TableEntity> select(TableQuery<TableEntity> query) {
Iterable<TableEntity> resultQuery = null;
try {
CloudStorageAccount cloudStorageAccount = CloudStorageAccount.parse(config);
CloudTableClient tableClient = cloudStorageAccount.createCloudTableClient();
CloudTable cloudTable = tableClient.getTableReference(tableName);
cloudTable.createIfNotExists();
resultQuery = cloudTable.execute(query);
} catch (StorageException | URISyntaxException | InvalidKeyException e) {
e.printStackTrace();
}
return StreamSupport.stream(resultQuery.spliterator(), false).collect(Collectors.toList());
}
Прошу допомогти створити цей паттерн або якщо хтось може поділитись паттерном/дати силку на паттерн проектування для роботи з Microsoft Azure CosmosDB, буду вдячний.
ПС: Я пробував через бібліотеку 'com.microsoft.azure:azure-cosmosdb:jar:2.6.5'
але не можу зєднатись таким способом чомусь, видає 400 BadRequest, url до БД і MasterKey коректні.