Search in sources :

Example 1 with AutoLinkRule

use of io.lumeer.api.model.rule.AutoLinkRule in project engine by Lumeer.

the class CollectionFacadeIT method createRule.

private Rule createRule(String collectionId, String attributeId) {
    final AutoLinkRule rule = new AutoLinkRule(new Rule("rule1", Rule.RuleType.AUTO_LINK, Rule.RuleTiming.ALL, new DataDocument()));
    rule.setCollection1(collectionId);
    rule.setAttribute1(attributeId);
    rule.setCollection2("some collection to test");
    rule.setAttribute2("a1");
    rule.setLinkType("some link type");
    return rule.getRule();
}
Also used : DataDocument(io.lumeer.engine.api.data.DataDocument) AutoLinkRule(io.lumeer.api.model.rule.AutoLinkRule) Rule(io.lumeer.api.model.Rule) AutoLinkRule(io.lumeer.api.model.rule.AutoLinkRule)

Example 2 with AutoLinkRule

use of io.lumeer.api.model.rule.AutoLinkRule in project engine by Lumeer.

the class TaskProcessingFacadeIT method testAutoLinkRules.

@Test
public void testAutoLinkRules() throws InterruptedException {
    final String ruleName = "autoLinkRule";
    final Collection c1 = createCollection("ac1", "auto1", Map.of("a0", "A", "a1", "B"));
    final Collection c2 = createCollection("ac2", "auto2", Map.of("a0", "C", "a1", "D"));
    final LinkType l = linkTypeFacade.createLinkType(new LinkType("link1", List.of(c1.getId(), c2.getId()), Collections.emptyList(), null, null, null));
    final Document c1d1 = documentFacade.createDocument(c1.getId(), new Document(new DataDocument("a0", "line1").append("a1", 10)));
    final Document c1d2 = documentFacade.createDocument(c1.getId(), new Document(new DataDocument("a0", "line2").append("a1", 20)));
    final Document c2d1 = documentFacade.createDocument(c2.getId(), new Document(new DataDocument("a0", "subline1").append("a1", 10)));
    final Document c2d2 = documentFacade.createDocument(c2.getId(), new Document(new DataDocument("a0", "subline2").append("a1", 20)));
    final Document c2d3 = documentFacade.createDocument(c2.getId(), new Document(new DataDocument("a0", "subline3").append("a1", 20)));
    final Document c2d4 = documentFacade.createDocument(c2.getId(), new Document(new DataDocument("a0", "subline3").append("a1", 30)));
    final Document c2d5 = documentFacade.createDocument(c2.getId(), new Document(new DataDocument("a0", "subline3").append("a1", 30)));
    final Document c2d6 = documentFacade.createDocument(c2.getId(), new Document(new DataDocument("a0", "subline3").append("a1", 30)));
    final AutoLinkRule rule = new AutoLinkRule(new Rule(ruleName, Rule.RuleType.AUTO_LINK, Rule.RuleTiming.ALL, new DataDocument()));
    rule.setCollection1(c1.getId());
    rule.setAttribute1("a1");
    rule.setCollection2(c2.getId());
    rule.setAttribute2("a1");
    rule.setLinkType(l.getId());
    c1.getRules().put(ruleName, rule.getRule());
    collectionFacade.updateCollection(c1.getId(), c1);
    collectionFacade.upsertRule(c1.getId(), ruleName, rule.getRule());
    assertThat(getLinksByType(l.getId())).hasSize(0);
    documentFacade.patchDocumentData(c1.getId(), c1d1.getId(), new DataDocument("a1", 11));
    // there is no way we can detect the change :-(
    Thread.sleep(1000);
    assertThat(getLinksByType(l.getId())).hasSize(0);
    documentFacade.patchDocumentData(c1.getId(), c1d1.getId(), new DataDocument("a1", 10));
    List<LinkInstance> instances = waitForLinksByType(l.getId());
    assertThat(instances).hasSize(1);
    assertThat(instances.get(0).getDocumentIds()).contains(c1d1.getId(), c2d1.getId());
    documentFacade.patchDocumentData(c1.getId(), c1d1.getId(), new DataDocument("a1", 11));
    instances = waitForLinksByType(l.getId());
    assertThat(instances).hasSize(0);
    documentFacade.patchDocumentData(c1.getId(), c1d1.getId(), new DataDocument("a1", 20));
    instances = waitForLinksByType(l.getId());
    assertThat(instances).hasSize(2);
    assertThat(instances.get(0).getDocumentIds()).contains(c1d1.getId()).containsAnyOf(c2d2.getId(), c2d3.getId());
    assertThat(instances.get(1).getDocumentIds()).contains(c1d1.getId()).containsAnyOf(c2d2.getId(), c2d3.getId());
    final Document c1d3 = documentFacade.createDocument(c1.getId(), new Document(new DataDocument("a0", "line3").append("a1", 30)));
    instances = waitForLinksByType(l.getId());
    assertThat(instances).hasSize(5);
    documentFacade.deleteDocument(c1.getId(), c1d1.getId());
    instances = waitForLinksByType(l.getId());
    assertThat(instances).hasSize(3);
}
Also used : DataDocument(io.lumeer.engine.api.data.DataDocument) Collection(io.lumeer.api.model.Collection) AutoLinkRule(io.lumeer.api.model.rule.AutoLinkRule) Rule(io.lumeer.api.model.Rule) BlocklyRule(io.lumeer.api.model.rule.BlocklyRule) LinkInstance(io.lumeer.api.model.LinkInstance) LinkType(io.lumeer.api.model.LinkType) DataDocument(io.lumeer.engine.api.data.DataDocument) Document(io.lumeer.api.model.Document) AutoLinkRule(io.lumeer.api.model.rule.AutoLinkRule) Test(org.junit.Test)

Example 3 with AutoLinkRule

use of io.lumeer.api.model.rule.AutoLinkRule in project engine by Lumeer.

the class CollectionFacade method runRule.

public void runRule(final Collection collection, final String ruleId) {
    if (adapter.getDocumentsCountByCollection(collection.getId()) > 2_000) {
        throw new UnsuccessfulOperationException("Too many documents in the source collection");
    }
    final Rule rule = collection.getRules().get(ruleId);
    if (rule != null && rule.getType() == Rule.RuleType.AUTO_LINK) {
        final AutoLinkRule autoLinkRule = new AutoLinkRule(rule);
        final String otherCollectionId = autoLinkRule.getCollection2().equals(collection.getId()) ? autoLinkRule.getCollection1() : autoLinkRule.getCollection2();
        final String attributeId = autoLinkRule.getCollection1().equals(collection.getId()) ? autoLinkRule.getAttribute1() : autoLinkRule.getAttribute2();
        final Attribute attribute = collection.getAttributes().stream().filter(a -> a.getId().equals(attributeId)).findFirst().orElse(null);
        final Collection otherCollection = getCollection(otherCollectionId);
        final String otherAttributeId = autoLinkRule.getCollection2().equals(collection.getId()) ? autoLinkRule.getAttribute1() : autoLinkRule.getAttribute2();
        final Attribute otherAttribute = otherCollection.getAttributes().stream().filter(a -> a.getId().equals(otherAttributeId)).findFirst().orElse(null);
        final Map<String, AllowedPermissions> permissions = permissionsChecker.getCollectionsPermissions(List.of(collection, otherCollection));
        if (adapter.getDocumentsCountByCollection(otherCollectionId) > 10_000) {
            throw new UnsuccessfulOperationException("Too many documents in the target collection");
        }
        final LinkType linkType = linkTypeDao.getLinkType(autoLinkRule.getLinkType());
        final AutoLinkBatchTask task = taskFactory.getInstance(AutoLinkBatchTask.class);
        task.setupBatch(autoLinkRule, linkType, collection, attribute, otherCollection, otherAttribute, getCurrentUser(), permissions);
        taskExecutor.submitTask(task);
    } else if (rule != null && rule.getType() == Rule.RuleType.CRON) {
        final CronRule cronRule = new CronRule(rule);
        List<Document> documents = new ArrayList<>();
        if (cronRule.getViewId() != null) {
            try {
                final View view = viewDao.getViewById(cronRule.getViewId());
                final User user = AuthenticatedUser.getMachineUser();
                final AllowedPermissions allowedPermissions = AllowedPermissions.allAllowed();
                documents = DocumentUtils.getDocuments(collectionDao, documentDao, dataDao, userDao, groupDao, selectionListDao, getOrganization(), getProject(), view.getQuery(), user, cronRule.getLanguage(), allowedPermissions, null);
                documents = documents.stream().filter(document -> document.getCollectionId().equals(collection.getId())).collect(Collectors.toList());
            } catch (ResourceNotFoundException ignore) {
            }
        }
        RuleTask task = taskFactory.getInstance(RuleTask.class);
        task.setRule(rule.getName(), rule, collection, documents);
        taskExecutor.submitTask(task);
    }
}
Also used : AutoLinkBatchTask(io.lumeer.core.task.AutoLinkBatchTask) TaskExecutor(io.lumeer.core.task.TaskExecutor) CollectionUtil(io.lumeer.api.util.CollectionUtil) ZonedDateTime(java.time.ZonedDateTime) User(io.lumeer.api.model.User) AuthenticatedUser(io.lumeer.core.auth.AuthenticatedUser) LinkTypeDao(io.lumeer.storage.api.dao.LinkTypeDao) AutoLinkRule(io.lumeer.api.model.rule.AutoLinkRule) CollectionDao(io.lumeer.storage.api.dao.CollectionDao) ResourceType(io.lumeer.api.model.ResourceType) DefaultViewConfigDao(io.lumeer.storage.api.dao.DefaultViewConfigDao) Map(java.util.Map) ResourceCommentDao(io.lumeer.storage.api.dao.ResourceCommentDao) CollectionAdapter(io.lumeer.core.adapter.CollectionAdapter) Permission(io.lumeer.api.model.Permission) RoleType(io.lumeer.api.model.RoleType) View(io.lumeer.api.model.View) ResourceNotFoundException(io.lumeer.storage.api.exception.ResourceNotFoundException) Document(io.lumeer.api.model.Document) Set(java.util.Set) NoResourcePermissionException(io.lumeer.core.exception.NoResourcePermissionException) Collectors(java.util.stream.Collectors) LinkType(io.lumeer.api.model.LinkType) Objects(java.util.Objects) AttributesResource(io.lumeer.api.model.common.AttributesResource) List(java.util.List) ResourceUtils(io.lumeer.api.util.ResourceUtils) PostConstruct(javax.annotation.PostConstruct) FavoriteItemDao(io.lumeer.storage.api.dao.FavoriteItemDao) Attribute(io.lumeer.api.model.Attribute) ContextualTaskFactory(io.lumeer.core.task.ContextualTaskFactory) UserDao(io.lumeer.storage.api.dao.UserDao) HashMap(java.util.HashMap) SelectionListDao(io.lumeer.storage.api.dao.SelectionListDao) AllowedPermissions(io.lumeer.api.model.AllowedPermissions) Function(java.util.function.Function) CollectionPurpose(io.lumeer.api.model.CollectionPurpose) GroupDao(io.lumeer.storage.api.dao.GroupDao) ArrayList(java.util.ArrayList) Inject(javax.inject.Inject) DataDao(io.lumeer.storage.api.dao.DataDao) ViewDao(io.lumeer.storage.api.dao.ViewDao) CodeGenerator(io.lumeer.core.util.CodeGenerator) Rule(io.lumeer.api.model.Rule) DocumentDao(io.lumeer.storage.api.dao.DocumentDao) Permissions(io.lumeer.api.model.Permissions) ResourceAdapter(io.lumeer.core.adapter.ResourceAdapter) DocumentUtils(io.lumeer.core.util.DocumentUtils) FileAttachment(io.lumeer.api.model.FileAttachment) Project(io.lumeer.api.model.Project) LinkInstanceDao(io.lumeer.storage.api.dao.LinkInstanceDao) UnsuccessfulOperationException(io.lumeer.engine.api.exception.UnsuccessfulOperationException) ConversionFacade(io.lumeer.core.facade.conversion.ConversionFacade) RuleTask(io.lumeer.core.task.RuleTask) RequestScoped(javax.enterprise.context.RequestScoped) CronRule(io.lumeer.api.model.rule.CronRule) AutoLinkBatchTask(io.lumeer.core.task.AutoLinkBatchTask) Collection(io.lumeer.api.model.Collection) User(io.lumeer.api.model.User) AuthenticatedUser(io.lumeer.core.auth.AuthenticatedUser) Attribute(io.lumeer.api.model.Attribute) View(io.lumeer.api.model.View) AllowedPermissions(io.lumeer.api.model.AllowedPermissions) UnsuccessfulOperationException(io.lumeer.engine.api.exception.UnsuccessfulOperationException) Collection(io.lumeer.api.model.Collection) List(java.util.List) ArrayList(java.util.ArrayList) RuleTask(io.lumeer.core.task.RuleTask) AutoLinkRule(io.lumeer.api.model.rule.AutoLinkRule) Rule(io.lumeer.api.model.Rule) CronRule(io.lumeer.api.model.rule.CronRule) LinkType(io.lumeer.api.model.LinkType) ResourceNotFoundException(io.lumeer.storage.api.exception.ResourceNotFoundException) AutoLinkRule(io.lumeer.api.model.rule.AutoLinkRule) CronRule(io.lumeer.api.model.rule.CronRule)

Aggregations

Rule (io.lumeer.api.model.Rule)3 AutoLinkRule (io.lumeer.api.model.rule.AutoLinkRule)3 Collection (io.lumeer.api.model.Collection)2 Document (io.lumeer.api.model.Document)2 LinkType (io.lumeer.api.model.LinkType)2 DataDocument (io.lumeer.engine.api.data.DataDocument)2 AllowedPermissions (io.lumeer.api.model.AllowedPermissions)1 Attribute (io.lumeer.api.model.Attribute)1 CollectionPurpose (io.lumeer.api.model.CollectionPurpose)1 FileAttachment (io.lumeer.api.model.FileAttachment)1 LinkInstance (io.lumeer.api.model.LinkInstance)1 Permission (io.lumeer.api.model.Permission)1 Permissions (io.lumeer.api.model.Permissions)1 Project (io.lumeer.api.model.Project)1 ResourceType (io.lumeer.api.model.ResourceType)1 RoleType (io.lumeer.api.model.RoleType)1 User (io.lumeer.api.model.User)1 View (io.lumeer.api.model.View)1 AttributesResource (io.lumeer.api.model.common.AttributesResource)1 BlocklyRule (io.lumeer.api.model.rule.BlocklyRule)1