|
|
|
@ -35,6 +35,7 @@ import org.thingsboard.server.dao.exception.DataValidationException; |
|
|
|
|
|
|
|
import java.util.ArrayList; |
|
|
|
import java.util.Collections; |
|
|
|
import java.util.LinkedList; |
|
|
|
import java.util.List; |
|
|
|
import java.util.concurrent.ExecutionException; |
|
|
|
|
|
|
|
@ -80,7 +81,7 @@ public abstract class BaseRelationServiceTest extends AbstractServiceTest { |
|
|
|
|
|
|
|
Assert.assertTrue(relationService.deleteRelationAsync(SYSTEM_TENANT_ID, relationA).get()); |
|
|
|
|
|
|
|
Assert.assertFalse(relationService.checkRelation(SYSTEM_TENANT_ID, parentId, childId, EntityRelation.CONTAINS_TYPE, RelationTypeGroup.COMMON)); |
|
|
|
Assert.assertFalse(relationService.checkRelation(SYSTEM_TENANT_ID, parentId, childId, EntityRelation.CONTAINS_TYPE, RelationTypeGroup.COMMON)); |
|
|
|
|
|
|
|
Assert.assertTrue(relationService.checkRelation(SYSTEM_TENANT_ID, childId, subChildId, EntityRelation.CONTAINS_TYPE, RelationTypeGroup.COMMON)); |
|
|
|
|
|
|
|
@ -171,8 +172,8 @@ public abstract class BaseRelationServiceTest extends AbstractServiceTest { |
|
|
|
Assert.assertEquals(0, relations.size()); |
|
|
|
} |
|
|
|
|
|
|
|
private Boolean saveRelation(EntityRelation relationA1) throws ExecutionException, InterruptedException { |
|
|
|
return relationService.saveRelationAsync(SYSTEM_TENANT_ID, relationA1).get(); |
|
|
|
private Boolean saveRelation(EntityRelation relationA1) { |
|
|
|
return relationService.saveRelation(SYSTEM_TENANT_ID, relationA1); |
|
|
|
} |
|
|
|
|
|
|
|
@Test |
|
|
|
@ -194,9 +195,6 @@ public abstract class BaseRelationServiceTest extends AbstractServiceTest { |
|
|
|
saveRelation(relationB1); |
|
|
|
saveRelation(relationB2); |
|
|
|
|
|
|
|
// Data propagation to views is async
|
|
|
|
Thread.sleep(3000); |
|
|
|
|
|
|
|
List<EntityRelation> relations = relationService.findByTo(SYSTEM_TENANT_ID, childA, RelationTypeGroup.COMMON); |
|
|
|
Assert.assertEquals(2, relations.size()); |
|
|
|
for (EntityRelation relation : relations) { |
|
|
|
@ -288,6 +286,53 @@ public abstract class BaseRelationServiceTest extends AbstractServiceTest { |
|
|
|
Assert.assertTrue(relations.contains(relationBC)); |
|
|
|
} |
|
|
|
|
|
|
|
@Test |
|
|
|
public void testRecursiveRelationDepth() throws ExecutionException, InterruptedException { |
|
|
|
int maxLevel = 1000; |
|
|
|
AssetId root = new AssetId(Uuids.timeBased()); |
|
|
|
AssetId left = new AssetId(Uuids.timeBased()); |
|
|
|
AssetId right = new AssetId(Uuids.timeBased()); |
|
|
|
|
|
|
|
List<EntityRelation> expected = new ArrayList<>(); |
|
|
|
|
|
|
|
EntityRelation relationAB = new EntityRelation(root, left, EntityRelation.CONTAINS_TYPE); |
|
|
|
EntityRelation relationBC = new EntityRelation(root, right, EntityRelation.CONTAINS_TYPE); |
|
|
|
saveRelation(relationAB); |
|
|
|
expected.add(relationAB); |
|
|
|
|
|
|
|
saveRelation(relationBC); |
|
|
|
expected.add(relationBC); |
|
|
|
|
|
|
|
for (int i = 0; i < maxLevel; i++) { |
|
|
|
var newLeft = new AssetId(Uuids.timeBased()); |
|
|
|
var newRight = new AssetId(Uuids.timeBased()); |
|
|
|
EntityRelation relationLeft = new EntityRelation(left, newLeft, EntityRelation.CONTAINS_TYPE); |
|
|
|
EntityRelation relationRight = new EntityRelation(right, newRight, EntityRelation.CONTAINS_TYPE); |
|
|
|
saveRelation(relationLeft); |
|
|
|
expected.add(relationLeft); |
|
|
|
saveRelation(relationRight); |
|
|
|
expected.add(relationRight); |
|
|
|
left = newLeft; |
|
|
|
right = newRight; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
EntityRelationsQuery query = new EntityRelationsQuery(); |
|
|
|
query.setParameters(new RelationsSearchParameters(root, EntitySearchDirection.FROM, -1, false)); |
|
|
|
query.setFilters(Collections.singletonList(new RelationEntityTypeFilter(EntityRelation.CONTAINS_TYPE, Collections.singletonList(EntityType.ASSET)))); |
|
|
|
List<EntityRelation> relations = relationService.findByQuery(SYSTEM_TENANT_ID, query).get(); |
|
|
|
Assert.assertEquals(expected.size(), relations.size()); |
|
|
|
for(EntityRelation r : expected){ |
|
|
|
Assert.assertTrue(relations.contains(r)); |
|
|
|
} |
|
|
|
|
|
|
|
//Test from cache
|
|
|
|
relations = relationService.findByQuery(SYSTEM_TENANT_ID, query).get(); |
|
|
|
Assert.assertEquals(expected.size(), relations.size()); |
|
|
|
for(EntityRelation r : expected){ |
|
|
|
Assert.assertTrue(relations.contains(r)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@Test(expected = DataValidationException.class) |
|
|
|
public void testSaveRelationWithEmptyFrom() throws ExecutionException, InterruptedException { |
|
|
|
@ -312,4 +357,290 @@ public abstract class BaseRelationServiceTest extends AbstractServiceTest { |
|
|
|
relation.setTo(new AssetId(Uuids.timeBased())); |
|
|
|
Assert.assertTrue(saveRelation(relation)); |
|
|
|
} |
|
|
|
|
|
|
|
@Test |
|
|
|
public void testFindByQueryFetchLastOnlyTreeLike() throws Exception { |
|
|
|
// A -> B
|
|
|
|
// A -> C
|
|
|
|
// C -> D
|
|
|
|
// C -> E
|
|
|
|
|
|
|
|
AssetId assetA = new AssetId(Uuids.timeBased()); |
|
|
|
AssetId assetB = new AssetId(Uuids.timeBased()); |
|
|
|
AssetId assetC = new AssetId(Uuids.timeBased()); |
|
|
|
AssetId assetD = new AssetId(Uuids.timeBased()); |
|
|
|
AssetId assetE = new AssetId(Uuids.timeBased()); |
|
|
|
|
|
|
|
EntityRelation relationA = new EntityRelation(assetA, assetB, EntityRelation.CONTAINS_TYPE); |
|
|
|
EntityRelation relationB = new EntityRelation(assetA, assetC, EntityRelation.CONTAINS_TYPE); |
|
|
|
EntityRelation relationC = new EntityRelation(assetC, assetD, EntityRelation.CONTAINS_TYPE); |
|
|
|
EntityRelation relationD = new EntityRelation(assetC, assetE, EntityRelation.CONTAINS_TYPE); |
|
|
|
|
|
|
|
saveRelation(relationA); |
|
|
|
saveRelation(relationB); |
|
|
|
saveRelation(relationC); |
|
|
|
saveRelation(relationD); |
|
|
|
|
|
|
|
EntityRelationsQuery query = new EntityRelationsQuery(); |
|
|
|
query.setParameters(new RelationsSearchParameters(assetA, EntitySearchDirection.FROM, -1, true)); |
|
|
|
query.setFilters(Collections.singletonList(new RelationEntityTypeFilter(EntityRelation.CONTAINS_TYPE, Collections.singletonList(EntityType.ASSET)))); |
|
|
|
List<EntityRelation> relations = relationService.findByQuery(SYSTEM_TENANT_ID, query).get(); |
|
|
|
Assert.assertEquals(3, relations.size()); |
|
|
|
Assert.assertTrue(relations.contains(relationA)); |
|
|
|
Assert.assertTrue(relations.contains(relationC)); |
|
|
|
Assert.assertTrue(relations.contains(relationD)); |
|
|
|
Assert.assertFalse(relations.contains(relationB)); |
|
|
|
|
|
|
|
//Test from cache
|
|
|
|
relations = relationService.findByQuery(SYSTEM_TENANT_ID, query).get(); |
|
|
|
Assert.assertTrue(relations.contains(relationA)); |
|
|
|
Assert.assertTrue(relations.contains(relationC)); |
|
|
|
Assert.assertTrue(relations.contains(relationD)); |
|
|
|
Assert.assertFalse(relations.contains(relationB)); |
|
|
|
} |
|
|
|
|
|
|
|
@Test |
|
|
|
public void testFindByQueryFetchLastOnlySingleLinked() throws Exception { |
|
|
|
// A -> B -> C -> D
|
|
|
|
|
|
|
|
AssetId assetA = new AssetId(Uuids.timeBased()); |
|
|
|
AssetId assetB = new AssetId(Uuids.timeBased()); |
|
|
|
AssetId assetC = new AssetId(Uuids.timeBased()); |
|
|
|
AssetId assetD = new AssetId(Uuids.timeBased()); |
|
|
|
|
|
|
|
EntityRelation relationA = new EntityRelation(assetA, assetB, EntityRelation.CONTAINS_TYPE); |
|
|
|
EntityRelation relationB = new EntityRelation(assetB, assetC, EntityRelation.CONTAINS_TYPE); |
|
|
|
EntityRelation relationC = new EntityRelation(assetC, assetD, EntityRelation.CONTAINS_TYPE); |
|
|
|
|
|
|
|
saveRelation(relationA); |
|
|
|
saveRelation(relationB); |
|
|
|
saveRelation(relationC); |
|
|
|
|
|
|
|
EntityRelationsQuery query = new EntityRelationsQuery(); |
|
|
|
query.setParameters(new RelationsSearchParameters(assetA, EntitySearchDirection.FROM, -1, true)); |
|
|
|
query.setFilters(Collections.singletonList(new RelationEntityTypeFilter(EntityRelation.CONTAINS_TYPE, Collections.singletonList(EntityType.ASSET)))); |
|
|
|
List<EntityRelation> relations = relationService.findByQuery(SYSTEM_TENANT_ID, query).get(); |
|
|
|
Assert.assertEquals(1, relations.size()); |
|
|
|
Assert.assertTrue(relations.contains(relationC)); |
|
|
|
Assert.assertFalse(relations.contains(relationA)); |
|
|
|
Assert.assertFalse(relations.contains(relationB)); |
|
|
|
|
|
|
|
//Test from cache
|
|
|
|
relations = relationService.findByQuery(SYSTEM_TENANT_ID, query).get(); |
|
|
|
Assert.assertTrue(relations.contains(relationC)); |
|
|
|
Assert.assertFalse(relations.contains(relationA)); |
|
|
|
Assert.assertFalse(relations.contains(relationB)); |
|
|
|
} |
|
|
|
|
|
|
|
@Test |
|
|
|
public void testFindByQueryFetchLastOnlyTreeLikeWithMaxLvl() throws Exception { |
|
|
|
// A -> B A
|
|
|
|
// A -> C B
|
|
|
|
// C -> D C
|
|
|
|
// C -> E D
|
|
|
|
// D -> F E
|
|
|
|
// D -> G F
|
|
|
|
|
|
|
|
AssetId assetA = new AssetId(Uuids.timeBased()); |
|
|
|
AssetId assetB = new AssetId(Uuids.timeBased()); |
|
|
|
AssetId assetC = new AssetId(Uuids.timeBased()); |
|
|
|
AssetId assetD = new AssetId(Uuids.timeBased()); |
|
|
|
AssetId assetE = new AssetId(Uuids.timeBased()); |
|
|
|
AssetId assetF = new AssetId(Uuids.timeBased()); |
|
|
|
AssetId assetG = new AssetId(Uuids.timeBased()); |
|
|
|
|
|
|
|
EntityRelation relationA = new EntityRelation(assetA, assetB, EntityRelation.CONTAINS_TYPE); |
|
|
|
EntityRelation relationB = new EntityRelation(assetA, assetC, EntityRelation.CONTAINS_TYPE); |
|
|
|
EntityRelation relationC = new EntityRelation(assetC, assetD, EntityRelation.CONTAINS_TYPE); |
|
|
|
EntityRelation relationD = new EntityRelation(assetC, assetE, EntityRelation.CONTAINS_TYPE); |
|
|
|
EntityRelation relationE = new EntityRelation(assetD, assetF, EntityRelation.CONTAINS_TYPE); |
|
|
|
EntityRelation relationF = new EntityRelation(assetD, assetG, EntityRelation.CONTAINS_TYPE); |
|
|
|
|
|
|
|
saveRelation(relationA); |
|
|
|
saveRelation(relationB); |
|
|
|
saveRelation(relationC); |
|
|
|
saveRelation(relationD); |
|
|
|
saveRelation(relationE); |
|
|
|
saveRelation(relationF); |
|
|
|
|
|
|
|
EntityRelationsQuery query = new EntityRelationsQuery(); |
|
|
|
query.setParameters(new RelationsSearchParameters(assetA, EntitySearchDirection.FROM, 2, true)); |
|
|
|
query.setFilters(Collections.singletonList(new RelationEntityTypeFilter(EntityRelation.CONTAINS_TYPE, Collections.singletonList(EntityType.ASSET)))); |
|
|
|
List<EntityRelation> relations = relationService.findByQuery(SYSTEM_TENANT_ID, query).get(); |
|
|
|
Assert.assertEquals(3, relations.size()); |
|
|
|
Assert.assertTrue(relations.contains(relationA)); |
|
|
|
Assert.assertTrue(relations.contains(relationC)); |
|
|
|
Assert.assertTrue(relations.contains(relationD)); |
|
|
|
Assert.assertFalse(relations.contains(relationB)); |
|
|
|
Assert.assertFalse(relations.contains(relationE)); |
|
|
|
Assert.assertFalse(relations.contains(relationF)); |
|
|
|
|
|
|
|
//Test from cache
|
|
|
|
relations = relationService.findByQuery(SYSTEM_TENANT_ID, query).get(); |
|
|
|
Assert.assertTrue(relations.contains(relationA)); |
|
|
|
Assert.assertTrue(relations.contains(relationC)); |
|
|
|
Assert.assertTrue(relations.contains(relationD)); |
|
|
|
Assert.assertFalse(relations.contains(relationB)); |
|
|
|
Assert.assertFalse(relations.contains(relationE)); |
|
|
|
Assert.assertFalse(relations.contains(relationF)); |
|
|
|
} |
|
|
|
|
|
|
|
@Test |
|
|
|
public void testFindByQueryTreeLikeWithMaxLvl() throws Exception { |
|
|
|
// A -> B A
|
|
|
|
// A -> C B
|
|
|
|
// C -> D C
|
|
|
|
// C -> E D
|
|
|
|
// D -> F E
|
|
|
|
// D -> G F
|
|
|
|
|
|
|
|
AssetId assetA = new AssetId(Uuids.timeBased()); |
|
|
|
AssetId assetB = new AssetId(Uuids.timeBased()); |
|
|
|
AssetId assetC = new AssetId(Uuids.timeBased()); |
|
|
|
AssetId assetD = new AssetId(Uuids.timeBased()); |
|
|
|
AssetId assetE = new AssetId(Uuids.timeBased()); |
|
|
|
AssetId assetF = new AssetId(Uuids.timeBased()); |
|
|
|
AssetId assetG = new AssetId(Uuids.timeBased()); |
|
|
|
|
|
|
|
EntityRelation relationA = new EntityRelation(assetA, assetB, EntityRelation.CONTAINS_TYPE); |
|
|
|
EntityRelation relationB = new EntityRelation(assetA, assetC, EntityRelation.CONTAINS_TYPE); |
|
|
|
EntityRelation relationC = new EntityRelation(assetC, assetD, EntityRelation.CONTAINS_TYPE); |
|
|
|
EntityRelation relationD = new EntityRelation(assetC, assetE, EntityRelation.CONTAINS_TYPE); |
|
|
|
EntityRelation relationE = new EntityRelation(assetD, assetF, EntityRelation.CONTAINS_TYPE); |
|
|
|
EntityRelation relationF = new EntityRelation(assetD, assetG, EntityRelation.CONTAINS_TYPE); |
|
|
|
|
|
|
|
saveRelation(relationA); |
|
|
|
saveRelation(relationB); |
|
|
|
saveRelation(relationC); |
|
|
|
saveRelation(relationD); |
|
|
|
saveRelation(relationE); |
|
|
|
saveRelation(relationF); |
|
|
|
|
|
|
|
EntityRelationsQuery query = new EntityRelationsQuery(); |
|
|
|
query.setParameters(new RelationsSearchParameters(assetA, EntitySearchDirection.FROM, 2, false)); |
|
|
|
query.setFilters(Collections.singletonList(new RelationEntityTypeFilter(EntityRelation.CONTAINS_TYPE, Collections.singletonList(EntityType.ASSET)))); |
|
|
|
List<EntityRelation> relations = relationService.findByQuery(SYSTEM_TENANT_ID, query).get(); |
|
|
|
Assert.assertEquals(4, relations.size()); |
|
|
|
Assert.assertTrue(relations.contains(relationA)); |
|
|
|
Assert.assertTrue(relations.contains(relationB)); |
|
|
|
Assert.assertTrue(relations.contains(relationC)); |
|
|
|
Assert.assertTrue(relations.contains(relationD)); |
|
|
|
Assert.assertFalse(relations.contains(relationE)); |
|
|
|
Assert.assertFalse(relations.contains(relationF)); |
|
|
|
|
|
|
|
//Test from cache
|
|
|
|
relations = relationService.findByQuery(SYSTEM_TENANT_ID, query).get(); |
|
|
|
Assert.assertTrue(relations.contains(relationA)); |
|
|
|
Assert.assertTrue(relations.contains(relationB)); |
|
|
|
Assert.assertTrue(relations.contains(relationC)); |
|
|
|
Assert.assertTrue(relations.contains(relationD)); |
|
|
|
Assert.assertFalse(relations.contains(relationE)); |
|
|
|
Assert.assertFalse(relations.contains(relationF)); |
|
|
|
} |
|
|
|
|
|
|
|
@Test |
|
|
|
public void testFindByQueryTreeLikeWithUnlimLvl() throws Exception { |
|
|
|
// A -> B A
|
|
|
|
// A -> C B
|
|
|
|
// C -> D C
|
|
|
|
// C -> E D
|
|
|
|
// D -> F E
|
|
|
|
// D -> G F
|
|
|
|
|
|
|
|
AssetId assetA = new AssetId(Uuids.timeBased()); |
|
|
|
AssetId assetB = new AssetId(Uuids.timeBased()); |
|
|
|
AssetId assetC = new AssetId(Uuids.timeBased()); |
|
|
|
AssetId assetD = new AssetId(Uuids.timeBased()); |
|
|
|
AssetId assetE = new AssetId(Uuids.timeBased()); |
|
|
|
AssetId assetF = new AssetId(Uuids.timeBased()); |
|
|
|
AssetId assetG = new AssetId(Uuids.timeBased()); |
|
|
|
|
|
|
|
EntityRelation relationA = new EntityRelation(assetA, assetB, EntityRelation.CONTAINS_TYPE); |
|
|
|
EntityRelation relationB = new EntityRelation(assetA, assetC, EntityRelation.CONTAINS_TYPE); |
|
|
|
EntityRelation relationC = new EntityRelation(assetC, assetD, EntityRelation.CONTAINS_TYPE); |
|
|
|
EntityRelation relationD = new EntityRelation(assetC, assetE, EntityRelation.CONTAINS_TYPE); |
|
|
|
EntityRelation relationE = new EntityRelation(assetD, assetF, EntityRelation.CONTAINS_TYPE); |
|
|
|
EntityRelation relationF = new EntityRelation(assetD, assetG, EntityRelation.CONTAINS_TYPE); |
|
|
|
|
|
|
|
saveRelation(relationA); |
|
|
|
saveRelation(relationB); |
|
|
|
saveRelation(relationC); |
|
|
|
saveRelation(relationD); |
|
|
|
saveRelation(relationE); |
|
|
|
saveRelation(relationF); |
|
|
|
|
|
|
|
EntityRelationsQuery query = new EntityRelationsQuery(); |
|
|
|
query.setParameters(new RelationsSearchParameters(assetA, EntitySearchDirection.FROM, -1, false)); |
|
|
|
query.setFilters(Collections.singletonList(new RelationEntityTypeFilter(EntityRelation.CONTAINS_TYPE, Collections.singletonList(EntityType.ASSET)))); |
|
|
|
List<EntityRelation> relations = relationService.findByQuery(SYSTEM_TENANT_ID, query).get(); |
|
|
|
Assert.assertEquals(6, relations.size()); |
|
|
|
Assert.assertTrue(relations.contains(relationA)); |
|
|
|
Assert.assertTrue(relations.contains(relationB)); |
|
|
|
Assert.assertTrue(relations.contains(relationC)); |
|
|
|
Assert.assertTrue(relations.contains(relationD)); |
|
|
|
Assert.assertTrue(relations.contains(relationE)); |
|
|
|
Assert.assertTrue(relations.contains(relationF)); |
|
|
|
|
|
|
|
//Test from cache
|
|
|
|
relations = relationService.findByQuery(SYSTEM_TENANT_ID, query).get(); |
|
|
|
Assert.assertTrue(relations.contains(relationA)); |
|
|
|
Assert.assertTrue(relations.contains(relationB)); |
|
|
|
Assert.assertTrue(relations.contains(relationC)); |
|
|
|
Assert.assertTrue(relations.contains(relationD)); |
|
|
|
Assert.assertTrue(relations.contains(relationE)); |
|
|
|
Assert.assertTrue(relations.contains(relationF)); |
|
|
|
} |
|
|
|
|
|
|
|
@Test |
|
|
|
public void testFindByQueryLargeHierarchyFetchAllWithUnlimLvl() throws Exception { |
|
|
|
AssetId rootAsset = new AssetId(Uuids.timeBased()); |
|
|
|
final int hierarchyLvl = 10; |
|
|
|
List<EntityRelation> expectedRelations = new LinkedList<>(); |
|
|
|
|
|
|
|
createAssetRelationsRecursively(rootAsset, hierarchyLvl, expectedRelations, false); |
|
|
|
|
|
|
|
EntityRelationsQuery query = new EntityRelationsQuery(); |
|
|
|
query.setParameters(new RelationsSearchParameters(rootAsset, EntitySearchDirection.FROM, -1, false)); |
|
|
|
query.setFilters(Collections.singletonList(new RelationEntityTypeFilter(EntityRelation.CONTAINS_TYPE, Collections.singletonList(EntityType.ASSET)))); |
|
|
|
List<EntityRelation> relations = relationService.findByQuery(SYSTEM_TENANT_ID, query).get(); |
|
|
|
Assert.assertEquals(expectedRelations.size(), relations.size()); |
|
|
|
Assert.assertTrue(relations.containsAll(expectedRelations)); |
|
|
|
} |
|
|
|
|
|
|
|
@Test |
|
|
|
public void testFindByQueryLargeHierarchyFetchLastOnlyWithUnlimLvl() throws Exception { |
|
|
|
AssetId rootAsset = new AssetId(Uuids.timeBased()); |
|
|
|
final int hierarchyLvl = 10; |
|
|
|
List<EntityRelation> expectedRelations = new LinkedList<>(); |
|
|
|
|
|
|
|
createAssetRelationsRecursively(rootAsset, hierarchyLvl, expectedRelations, true); |
|
|
|
|
|
|
|
EntityRelationsQuery query = new EntityRelationsQuery(); |
|
|
|
query.setParameters(new RelationsSearchParameters(rootAsset, EntitySearchDirection.FROM, -1, true)); |
|
|
|
query.setFilters(Collections.singletonList(new RelationEntityTypeFilter(EntityRelation.CONTAINS_TYPE, Collections.singletonList(EntityType.ASSET)))); |
|
|
|
List<EntityRelation> relations = relationService.findByQuery(SYSTEM_TENANT_ID, query).get(); |
|
|
|
Assert.assertEquals(expectedRelations.size(), relations.size()); |
|
|
|
Assert.assertTrue(relations.containsAll(expectedRelations)); |
|
|
|
} |
|
|
|
|
|
|
|
private void createAssetRelationsRecursively(AssetId rootAsset, int lvl, List<EntityRelation> entityRelations, boolean lastLvlOnly) throws Exception { |
|
|
|
if (lvl == 0) return; |
|
|
|
|
|
|
|
AssetId firstAsset = new AssetId(Uuids.timeBased()); |
|
|
|
AssetId secondAsset = new AssetId(Uuids.timeBased()); |
|
|
|
|
|
|
|
EntityRelation firstRelation = new EntityRelation(rootAsset, firstAsset, EntityRelation.CONTAINS_TYPE); |
|
|
|
EntityRelation secondRelation = new EntityRelation(rootAsset, secondAsset, EntityRelation.CONTAINS_TYPE); |
|
|
|
|
|
|
|
saveRelation(firstRelation); |
|
|
|
saveRelation(secondRelation); |
|
|
|
|
|
|
|
if (!lastLvlOnly || lvl == 1) { |
|
|
|
entityRelations.add(firstRelation); |
|
|
|
entityRelations.add(secondRelation); |
|
|
|
} |
|
|
|
|
|
|
|
createAssetRelationsRecursively(firstAsset, lvl - 1, entityRelations, lastLvlOnly); |
|
|
|
createAssetRelationsRecursively(secondAsset, lvl - 1, entityRelations, lastLvlOnly); |
|
|
|
} |
|
|
|
} |
|
|
|
|