|
@@ -227,11 +227,11 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { |
|
@@ -227,11 +227,11 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { |
227
|
@Override
|
227
|
@Override
|
228
|
public long countEntitiesByQuery(TenantId tenantId, CustomerId customerId, EntityCountQuery query) {
|
228
|
public long countEntitiesByQuery(TenantId tenantId, CustomerId customerId, EntityCountQuery query) {
|
229
|
EntityType entityType = resolveEntityType(query.getEntityFilter());
|
229
|
EntityType entityType = resolveEntityType(query.getEntityFilter());
|
230
|
- QueryContext ctx = new QueryContext();
|
230
|
+ QueryContext ctx = new QueryContext(new QuerySecurityContext(tenantId, customerId, entityType));
|
231
|
ctx.append("select count(e.id) from ");
|
231
|
ctx.append("select count(e.id) from ");
|
232
|
- ctx.append(addEntityTableQuery(ctx, query.getEntityFilter(), entityType));
|
232
|
+ ctx.append(addEntityTableQuery(ctx, query.getEntityFilter()));
|
233
|
ctx.append(" e where ");
|
233
|
ctx.append(" e where ");
|
234
|
- ctx.append(buildEntityWhere(ctx, tenantId, customerId, query.getEntityFilter(), Collections.emptyList(), entityType));
|
234
|
+ ctx.append(buildEntityWhere(ctx, query.getEntityFilter(), Collections.emptyList()));
|
235
|
// log.error("QUERY: {}", ctx.getQuery());
|
235
|
// log.error("QUERY: {}", ctx.getQuery());
|
236
|
// Arrays.asList(ctx.getParameterNames()).forEach(param -> log.error("QUERY PARAM: {}->{}", param, ctx.getValue(param)));
|
236
|
// Arrays.asList(ctx.getParameterNames()).forEach(param -> log.error("QUERY PARAM: {}->{}", param, ctx.getValue(param)));
|
237
|
return transactionTemplate.execute(status -> jdbcTemplate.queryForObject(ctx.getQuery(), ctx, Long.class));
|
237
|
return transactionTemplate.execute(status -> jdbcTemplate.queryForObject(ctx.getQuery(), ctx, Long.class));
|
|
@@ -240,8 +240,8 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { |
|
@@ -240,8 +240,8 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { |
240
|
@Override
|
240
|
@Override
|
241
|
public PageData<EntityData> findEntityDataByQuery(TenantId tenantId, CustomerId customerId, EntityDataQuery query) {
|
241
|
public PageData<EntityData> findEntityDataByQuery(TenantId tenantId, CustomerId customerId, EntityDataQuery query) {
|
242
|
return transactionTemplate.execute(status -> {
|
242
|
return transactionTemplate.execute(status -> {
|
243
|
- QueryContext ctx = new QueryContext();
|
|
|
244
|
EntityType entityType = resolveEntityType(query.getEntityFilter());
|
243
|
EntityType entityType = resolveEntityType(query.getEntityFilter());
|
|
|
244
|
+ QueryContext ctx = new QueryContext(new QuerySecurityContext(tenantId, customerId, entityType));
|
245
|
EntityDataPageLink pageLink = query.getPageLink();
|
245
|
EntityDataPageLink pageLink = query.getPageLink();
|
246
|
|
246
|
|
247
|
List<EntityKeyMapping> mappings = EntityKeyMapping.prepareKeyMapping(query);
|
247
|
List<EntityKeyMapping> mappings = EntityKeyMapping.prepareKeyMapping(query);
|
|
@@ -264,9 +264,9 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { |
|
@@ -264,9 +264,9 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { |
264
|
.collect(Collectors.toList());
|
264
|
.collect(Collectors.toList());
|
265
|
|
265
|
|
266
|
|
266
|
|
267
|
- String entityWhereClause = DefaultEntityQueryRepository.this.buildEntityWhere(ctx, tenantId, customerId, query.getEntityFilter(), entityFieldsFiltersMapping, entityType);
|
267
|
+ String entityWhereClause = DefaultEntityQueryRepository.this.buildEntityWhere(ctx, query.getEntityFilter(), entityFieldsFiltersMapping);
|
268
|
String latestJoins = EntityKeyMapping.buildLatestJoins(ctx, query.getEntityFilter(), entityType, allLatestMappings);
|
268
|
String latestJoins = EntityKeyMapping.buildLatestJoins(ctx, query.getEntityFilter(), entityType, allLatestMappings);
|
269
|
- String whereClause = DefaultEntityQueryRepository.this.buildWhere(ctx, latestFiltersMapping, query.getEntityFilter().getType(), entityType);
|
269
|
+ String whereClause = DefaultEntityQueryRepository.this.buildWhere(ctx, latestFiltersMapping, query.getEntityFilter().getType());
|
270
|
String textSearchQuery = DefaultEntityQueryRepository.this.buildTextSearchQuery(ctx, selectionMapping, pageLink.getTextSearch());
|
270
|
String textSearchQuery = DefaultEntityQueryRepository.this.buildTextSearchQuery(ctx, selectionMapping, pageLink.getTextSearch());
|
271
|
String entityFieldsSelection = EntityKeyMapping.buildSelections(entityFieldsSelectionMapping, query.getEntityFilter().getType(), entityType);
|
271
|
String entityFieldsSelection = EntityKeyMapping.buildSelections(entityFieldsSelectionMapping, query.getEntityFilter().getType(), entityType);
|
272
|
String entityTypeStr;
|
272
|
String entityTypeStr;
|
|
@@ -289,7 +289,7 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { |
|
@@ -289,7 +289,7 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { |
289
|
String fromClause = String.format("from (select %s from (select %s from %s e where %s) entities %s %s) result %s",
|
289
|
String fromClause = String.format("from (select %s from (select %s from %s e where %s) entities %s %s) result %s",
|
290
|
topSelection,
|
290
|
topSelection,
|
291
|
entityFieldsSelection,
|
291
|
entityFieldsSelection,
|
292
|
- addEntityTableQuery(ctx, query.getEntityFilter(), entityType),
|
292
|
+ addEntityTableQuery(ctx, query.getEntityFilter()),
|
293
|
entityWhereClause,
|
293
|
entityWhereClause,
|
294
|
latestJoins,
|
294
|
latestJoins,
|
295
|
whereClause,
|
295
|
whereClause,
|
|
@@ -323,15 +323,10 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { |
|
@@ -323,15 +323,10 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { |
323
|
});
|
323
|
});
|
324
|
}
|
324
|
}
|
325
|
|
325
|
|
326
|
- private String buildEntityWhere(QueryContext ctx,
|
|
|
327
|
- TenantId tenantId,
|
|
|
328
|
- CustomerId customerId,
|
|
|
329
|
- EntityFilter entityFilter,
|
|
|
330
|
- List<EntityKeyMapping> entityFieldsFilters,
|
|
|
331
|
- EntityType entityType) {
|
|
|
332
|
- String permissionQuery = this.buildPermissionQuery(ctx, entityFilter, tenantId, customerId, entityType);
|
326
|
+ private String buildEntityWhere(QueryContext ctx, EntityFilter entityFilter, List<EntityKeyMapping> entityFieldsFilters) {
|
|
|
327
|
+ String permissionQuery = this.buildPermissionQuery(ctx, entityFilter);
|
333
|
String entityFilterQuery = this.buildEntityFilterQuery(ctx, entityFilter);
|
328
|
String entityFilterQuery = this.buildEntityFilterQuery(ctx, entityFilter);
|
334
|
- String entityFieldsQuery = EntityKeyMapping.buildQuery(ctx, entityFieldsFilters, entityFilter.getType(), entityType);
|
329
|
+ String entityFieldsQuery = EntityKeyMapping.buildQuery(ctx, entityFieldsFilters, entityFilter.getType());
|
335
|
String result = permissionQuery;
|
330
|
String result = permissionQuery;
|
336
|
if (!entityFilterQuery.isEmpty()) {
|
331
|
if (!entityFilterQuery.isEmpty()) {
|
337
|
result += " and " + entityFilterQuery;
|
332
|
result += " and " + entityFilterQuery;
|
|
@@ -342,28 +337,28 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { |
|
@@ -342,28 +337,28 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { |
342
|
return result;
|
337
|
return result;
|
343
|
}
|
338
|
}
|
344
|
|
339
|
|
345
|
- private String buildPermissionQuery(QueryContext ctx, EntityFilter entityFilter, TenantId tenantId, CustomerId customerId, EntityType entityType) {
|
340
|
+ private String buildPermissionQuery(QueryContext ctx, EntityFilter entityFilter) {
|
346
|
switch (entityFilter.getType()) {
|
341
|
switch (entityFilter.getType()) {
|
347
|
case RELATIONS_QUERY:
|
342
|
case RELATIONS_QUERY:
|
348
|
case DEVICE_SEARCH_QUERY:
|
343
|
case DEVICE_SEARCH_QUERY:
|
349
|
case ASSET_SEARCH_QUERY:
|
344
|
case ASSET_SEARCH_QUERY:
|
350
|
case ENTITY_VIEW_SEARCH_QUERY:
|
345
|
case ENTITY_VIEW_SEARCH_QUERY:
|
351
|
- return this.defaultPermissionQuery(ctx, tenantId, customerId, entityType);
|
346
|
+ return this.defaultPermissionQuery(ctx);
|
352
|
default:
|
347
|
default:
|
353
|
- if (entityType == EntityType.TENANT) {
|
|
|
354
|
- ctx.addUuidParameter("permissions_tenant_id", tenantId.getId());
|
348
|
+ if (ctx.getEntityType() == EntityType.TENANT) {
|
|
|
349
|
+ ctx.addUuidParameter("permissions_tenant_id", ctx.getTenantId().getId());
|
355
|
return "e.id=:permissions_tenant_id";
|
350
|
return "e.id=:permissions_tenant_id";
|
356
|
} else {
|
351
|
} else {
|
357
|
- return this.defaultPermissionQuery(ctx, tenantId, customerId, entityType);
|
352
|
+ return this.defaultPermissionQuery(ctx);
|
358
|
}
|
353
|
}
|
359
|
}
|
354
|
}
|
360
|
}
|
355
|
}
|
361
|
|
356
|
|
362
|
- private String defaultPermissionQuery(QueryContext ctx, TenantId tenantId, CustomerId customerId, EntityType entityType) {
|
|
|
363
|
- ctx.addUuidParameter("permissions_tenant_id", tenantId.getId());
|
|
|
364
|
- if (customerId != null && !customerId.isNullUid()) {
|
|
|
365
|
- ctx.addUuidParameter("permissions_customer_id", customerId.getId());
|
|
|
366
|
- if (entityType == EntityType.CUSTOMER) {
|
357
|
+ private String defaultPermissionQuery(QueryContext ctx) {
|
|
|
358
|
+ ctx.addUuidParameter("permissions_tenant_id", ctx.getTenantId().getId());
|
|
|
359
|
+ if (ctx.getCustomerId() != null && !ctx.getCustomerId().isNullUid()) {
|
|
|
360
|
+ ctx.addUuidParameter("permissions_customer_id", ctx.getCustomerId().getId());
|
|
|
361
|
+ if (ctx.getEntityType() == EntityType.CUSTOMER) {
|
367
|
return "e.tenant_id=:permissions_tenant_id and e.id=:permissions_customer_id";
|
362
|
return "e.tenant_id=:permissions_tenant_id and e.id=:permissions_customer_id";
|
368
|
} else {
|
363
|
} else {
|
369
|
return "e.tenant_id=:permissions_tenant_id and e.customer_id=:permissions_customer_id";
|
364
|
return "e.tenant_id=:permissions_tenant_id and e.customer_id=:permissions_customer_id";
|
|
@@ -395,7 +390,7 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { |
|
@@ -395,7 +390,7 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { |
395
|
}
|
390
|
}
|
396
|
}
|
391
|
}
|
397
|
|
392
|
|
398
|
- private String addEntityTableQuery(QueryContext ctx, EntityFilter entityFilter, EntityType entityType) {
|
393
|
+ private String addEntityTableQuery(QueryContext ctx, EntityFilter entityFilter) {
|
399
|
switch (entityFilter.getType()) {
|
394
|
switch (entityFilter.getType()) {
|
400
|
case RELATIONS_QUERY:
|
395
|
case RELATIONS_QUERY:
|
401
|
return relationQuery(ctx, (RelationsQueryFilter) entityFilter);
|
396
|
return relationQuery(ctx, (RelationsQueryFilter) entityFilter);
|
|
@@ -409,7 +404,7 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { |
|
@@ -409,7 +404,7 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { |
409
|
EntityViewSearchQueryFilter entityViewQuery = (EntityViewSearchQueryFilter) entityFilter;
|
404
|
EntityViewSearchQueryFilter entityViewQuery = (EntityViewSearchQueryFilter) entityFilter;
|
410
|
return entitySearchQuery(ctx, entityViewQuery, EntityType.ENTITY_VIEW, entityViewQuery.getEntityViewTypes());
|
405
|
return entitySearchQuery(ctx, entityViewQuery, EntityType.ENTITY_VIEW, entityViewQuery.getEntityViewTypes());
|
411
|
default:
|
406
|
default:
|
412
|
- return entityTableMap.get(entityType);
|
407
|
+ return entityTableMap.get(ctx.getEntityType());
|
413
|
}
|
408
|
}
|
414
|
}
|
409
|
}
|
415
|
|
410
|
|
|
@@ -505,8 +500,8 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { |
|
@@ -505,8 +500,8 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { |
505
|
return from;
|
500
|
return from;
|
506
|
}
|
501
|
}
|
507
|
|
502
|
|
508
|
- private String buildWhere(QueryContext ctx, List<EntityKeyMapping> latestFiltersMapping, EntityFilterType filterType, EntityType entityType) {
|
|
|
509
|
- String latestFilters = EntityKeyMapping.buildQuery(ctx, latestFiltersMapping, filterType, entityType);
|
503
|
+ private String buildWhere(QueryContext ctx, List<EntityKeyMapping> latestFiltersMapping, EntityFilterType filterType) {
|
|
|
504
|
+ String latestFilters = EntityKeyMapping.buildQuery(ctx, latestFiltersMapping, filterType);
|
510
|
if (!StringUtils.isEmpty(latestFilters)) {
|
505
|
if (!StringUtils.isEmpty(latestFilters)) {
|
511
|
return String.format("where %s", latestFilters);
|
506
|
return String.format("where %s", latestFilters);
|
512
|
} else {
|
507
|
} else {
|