Search in sources :

Example 11 with Query

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

the class SearchFacadeIT method testSearchFulltextDocumentsByNumberConstraint.

@Test
public void testSearchFulltextDocumentsByNumberConstraint() {
    Constraint constraint = new Constraint(ConstraintType.Number, new DataDocument("currency", "sk-SK"));
    Attribute attribute = new Attribute(DOCUMENT_KEY, DOCUMENT_KEY, null, constraint, null, null, 3, null);
    String collectionId = createCollection("numberCollection2", attribute).getId();
    String id1 = createDocument(collectionId, "20.3").getId();
    String id2 = createDocument(collectionId, "40.1").getId();
    String id3 = createDocument(collectionId, "60").getId();
    Query query = createSimpleQueryWithFulltext("20");
    List<Document> documents = searchFacade.searchDocuments(query, true);
    assertThat(documents).extracting(Document::getId).containsOnly(id1);
    query = createSimpleQueryWithFulltext("€");
    documents = searchFacade.searchDocuments(query, true);
    assertThat(documents).extracting(Document::getId).containsOnly(id1, id2, id3);
    query = createSimpleQueryWithFulltext("60 €");
    documents = searchFacade.searchDocuments(query, true);
    assertThat(documents).extracting(Document::getId).containsOnly(id3);
}
Also used : DataDocument(io.lumeer.engine.api.data.DataDocument) Query(io.lumeer.api.model.Query) Constraint(io.lumeer.api.model.Constraint) Attribute(io.lumeer.api.model.Attribute) DataDocument(io.lumeer.engine.api.data.DataDocument) Document(io.lumeer.api.model.Document) Test(org.junit.Test)

Example 12 with Query

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

the class ViewFacadeIT method configureProject.

@Before
public void configureProject() {
    User user = new User(USER);
    this.user = userDao.createUser(user);
    Organization organization = new Organization();
    organization.setCode(ORGANIZATION_CODE);
    organization.setPermissions(new Permissions());
    Organization storedOrganization = organizationDao.createOrganization(organization);
    projectDao.setOrganization(storedOrganization);
    groupDao.setOrganization(storedOrganization);
    group = groupDao.createGroup(new Group(GROUP, Collections.singletonList(user.getId())));
    user.setOrganizations(Collections.singleton(storedOrganization.getId()));
    this.user = userDao.updateUser(user.getId(), user);
    Permissions organizationPermissions = new Permissions();
    Permission userPermission = Permission.buildWithRoles(this.user.getId(), Set.of(new Role(RoleType.Read)));
    organizationPermissions.updateUserPermissions(userPermission);
    storedOrganization.setPermissions(organizationPermissions);
    this.organization = organizationDao.updateOrganization(storedOrganization.getId(), storedOrganization);
    this.userPermission = Permission.buildWithRoles(this.user.getId(), Set.of(new Role(RoleType.Read)));
    this.groupPermission = Permission.buildWithRoles(this.group.getId(), Set.of(new Role(RoleType.Read)));
    Project project = new Project();
    project.setCode(PROJECT_CODE);
    project.setPermissions(new Permissions());
    Project storedProject = projectDao.createProject(project);
    workspaceKeeper.setWorkspaceIds(storedOrganization.getId(), storedProject.getId());
    Permissions projectPermissions = new Permissions();
    Permission userProjectPermission = Permission.buildWithRoles(this.user.getId(), Set.of(new Role(RoleType.Read), new Role(RoleType.ViewContribute), new Role(RoleType.CollectionContribute)));
    projectPermissions.updateUserPermissions(userProjectPermission);
    storedProject.setPermissions(projectPermissions);
    this.project = projectDao.updateProject(storedProject.getId(), storedProject);
    viewDao.setProject(this.project);
    Collection collection = collectionFacade.createCollection(new Collection("abc", "abc random", ICON, COLOR, projectPermissions));
    collectionFacade.updateUserPermissions(collection.getId(), Set.of(Permission.buildWithRoles(this.user.getId(), Collections.singleton(new Role(RoleType.Read)))));
    query = new Query(new QueryStem(collection.getId()));
    PermissionCheckerUtil.allowGroups();
    permissionsChecker.getPermissionAdapter().invalidateUserCache();
}
Also used : Role(io.lumeer.api.model.Role) Group(io.lumeer.api.model.Group) Project(io.lumeer.api.model.Project) User(io.lumeer.api.model.User) AuthenticatedUser(io.lumeer.core.auth.AuthenticatedUser) Organization(io.lumeer.api.model.Organization) Query(io.lumeer.api.model.Query) LumeerAssertions.assertPermissions(io.lumeer.test.util.LumeerAssertions.assertPermissions) Permissions(io.lumeer.api.model.Permissions) Permission(io.lumeer.api.model.Permission) Collection(io.lumeer.api.model.Collection) QueryStem(io.lumeer.api.model.QueryStem) Before(org.junit.Before)

Example 13 with Query

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

the class ViewFacadeIT method testCollectionAccessViaView.

@Test
public void testCollectionAccessViaView() {
    // non-existing user
    final String NON_EXISTING_USER = "aaaaa4444400000000111111";
    final String COLLECTION_NAME = "kolekce1";
    final String COLLECTION_ICON = "fa-eye";
    final String COLLECTION_COLOR = "#abcdea";
    setOrganizationUserRoles(Set.of(new Role(RoleType.Read), new Role(RoleType.UserConfig)));
    setProjectUserRoles(Set.of(new Role(RoleType.Read), new Role(RoleType.ViewContribute), new Role(RoleType.CollectionContribute), new Role(RoleType.UserConfig)));
    Permission workspacePermission = Permission.buildWithRoles(NON_EXISTING_USER, Set.of(new Role(RoleType.Read)));
    organizationFacade.updateUserPermissions(organization.getId(), Set.of(workspacePermission));
    projectFacade.updateUserPermissions(project.getId(), Set.of(workspacePermission));
    // create collection under a different user
    Permissions collectionPermissions = new Permissions();
    Permission userPermission = Permission.buildWithRoles(NON_EXISTING_USER, Collection.ROLES);
    collectionPermissions.updateUserPermissions(userPermission);
    Collection collection = collectionFacade.createCollection(new Collection("", COLLECTION_NAME, COLLECTION_ICON, COLLECTION_COLOR, collectionPermissions));
    collectionFacade.updateUserPermissions(collection.getId(), Set.of(Permission.buildWithRoles(this.user.getId(), Collections.emptySet())));
    removeOrganizationManagePermission();
    removeProjectManagePermission();
    // we are not able to read the collection now
    try {
        collectionFacade.getCollection(collection.getId());
        fail("Still able to access collection where I have no access rights");
    } catch (Exception e) {
        assertThat(e).isInstanceOf(NoResourcePermissionException.class);
    }
    // create a view under a different user
    View view = createView(CODE2);
    view.setAuthorId(NON_EXISTING_USER);
    view.setQuery(new Query(new QueryStem(collection.getId())));
    Permissions permissions = new Permissions();
    permissions.updateUserPermissions(Set.of(Permission.buildWithRoles(NON_EXISTING_USER, View.ROLES), Permission.buildWithRoles(this.user.getId(), Collections.emptySet())));
    view.setPermissions(permissions);
    viewDao.updateView(view.getId(), view);
    try {
        viewFacade.getViewById(view.getId());
        fail("Still able to access view where I have no access rights");
    } catch (Exception e) {
        assertThat(e).isInstanceOf(NoResourcePermissionException.class);
    }
    try {
        viewFacade.updateUserPermissions(view.getId(), Set.of(Permission.buildWithRoles(this.user.getId(), Set.of(new Role(RoleType.Read)))));
        fail("Can manage view without manage rights");
    } catch (Exception e) {
        assertThat(e).isInstanceOf(NoResourcePermissionException.class);
    }
    // share the view and make sure we can see it now
    Permissions viewPermissions = new Permissions();
    viewPermissions.updateUserPermissions(Permission.buildWithRoles(NON_EXISTING_USER, View.ROLES));
    viewPermissions.updateUserPermissions(Permission.buildWithRoles(this.user.getId(), Collections.singleton(new Role(RoleType.Read))));
    view.setPermissions(viewPermissions);
    // since we lost manage rights, we can only do it directly
    viewDao.updateView(view.getId(), view);
    // now this should be all possible
    viewFacade.getViewById(view.getId());
    // access the collection via the view with the current user
    PermissionCheckerUtil.setViewId(permissionsChecker, view.getId());
    collectionFacade.getCollection(collection.getId());
}
Also used : Role(io.lumeer.api.model.Role) Query(io.lumeer.api.model.Query) NoResourcePermissionException(io.lumeer.core.exception.NoResourcePermissionException) Permission(io.lumeer.api.model.Permission) LumeerAssertions.assertPermissions(io.lumeer.test.util.LumeerAssertions.assertPermissions) Permissions(io.lumeer.api.model.Permissions) Collection(io.lumeer.api.model.Collection) View(io.lumeer.api.model.View) ResourceNotFoundException(io.lumeer.storage.api.exception.ResourceNotFoundException) NoResourcePermissionException(io.lumeer.core.exception.NoResourcePermissionException) QueryStem(io.lumeer.api.model.QueryStem) Test(org.junit.Test)

Example 14 with Query

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

the class SearchFacade method searchDocumentsAndLinksInStem.

private Tuple<? extends java.util.Collection<Document>, ? extends java.util.Collection<LinkInstance>> searchDocumentsAndLinksInStem(final QueryStem stem, final Set<String> fulltexts, final Map<String, Collection> collectionsMap, final Map<String, LinkType> linkTypesMap, @Nullable final Function<Document, Boolean> documentFilter, final ConstraintData constraintData, boolean includeChildDocuments) {
    final Set<Document> allDocuments = new HashSet<>();
    final Set<LinkInstance> allLinkInstances = new HashSet<>();
    var resources = getResourcesFromStem(stem, collectionsMap, linkTypesMap);
    final List<Collection> allCollections = resources.getFirst();
    final List<LinkType> allLinkTypes = resources.getSecond();
    if (allCollections.isEmpty()) {
        return new Tuple<>(allDocuments, allLinkInstances);
    }
    final Map<String, AllowedPermissions> collectionsPermissions = permissionsChecker.getCollectionsPermissions(allCollections);
    final Map<String, AllowedPermissions> linkTypesPermissions = permissionsChecker.getLinkTypesPermissions(allLinkTypes);
    final Query query = new Query(Collections.singletonList(stem), fulltexts, null, null);
    var hasMoreDocuments = true;
    var page = 0;
    while (hasMoreDocuments) {
        var previousCollection = allCollections.get(0);
        var firstCollectionDocuments = getDocumentsByCollection(previousCollection, page, FETCH_SIZE);
        var previousDocuments = filterDocumentsByDocumentFilter(firstCollectionDocuments, documentFilter);
        final Set<Document> currentDocuments = new HashSet<>(previousDocuments);
        final Set<LinkInstance> currentLinkInstances = new HashSet<>();
        for (String linkTypeId : stem.getLinkTypeIds()) {
            var linkType = linkTypesMap.get(linkTypeId);
            var collection = getOtherCollection(linkType, collectionsMap, Utils.computeIfNotNull(previousCollection, Collection::getId));
            if (linkType != null && previousCollection != null) {
                var links = getLinkInstancesByLinkType(linkType, getDocumentsIds(previousDocuments));
                var documents = getDocumentsByCollection(collection, getLinkDocumentsIds(links), documentFilter);
                currentDocuments.addAll(documents);
                currentLinkInstances.addAll(links);
                previousCollection = collection;
                previousDocuments = documents;
            }
        }
        if (!currentDocuments.isEmpty()) {
            var result = DataFilter.filterDocumentsAndLinksByQueryFromJson(new ArrayList<>(currentDocuments), allCollections, allLinkTypes, new ArrayList<>(currentLinkInstances), query, collectionsPermissions, linkTypesPermissions, constraintData, includeChildDocuments, language);
            allDocuments.addAll(result.getFirst());
            allLinkInstances.addAll(result.getSecond());
        }
        page++;
        hasMoreDocuments = !firstCollectionDocuments.isEmpty();
    }
    return new Tuple<>(allDocuments, allLinkInstances);
}
Also used : Query(io.lumeer.api.model.Query) LinkInstance(io.lumeer.api.model.LinkInstance) Document(io.lumeer.api.model.Document) AllowedPermissions(io.lumeer.api.model.AllowedPermissions) Collection(io.lumeer.api.model.Collection) LinkType(io.lumeer.api.model.LinkType) Tuple(io.lumeer.core.util.Tuple) HashSet(java.util.HashSet)

Example 15 with Query

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

the class SearchFacade method modifyQueryForTasks.

private Query modifyQueryForTasks(boolean isPublic, final Query query, final List<Collection> collections) {
    if (isPublic || !query.isEmpty()) {
        return query;
    }
    final List<QueryStem> stems = collections.stream().map(collection -> {
        final String assigneeAttributeId = collection.getPurpose().getAssigneeAttributeId();
        final Attribute assigneeAttribute = ResourceUtils.findAttribute(collection.getAttributes(), assigneeAttributeId);
        if (assigneeAttribute != null) {
            final CollectionAttributeFilter filter = CollectionAttributeFilter.createFromTypes(collection.getId(), assigneeAttribute.getId(), ConditionType.HAS_SOME, ConditionValueType.CURRENT_USER.getValue());
            return new QueryStem(null, collection.getId(), Collections.emptyList(), Collections.emptySet(), Collections.singletonList(filter), Collections.emptyList());
        }
        if (permissionsChecker.hasAnyRole(collection, Set.of(RoleType.DataRead, RoleType.DataContribute))) {
            return new QueryStem(null, collection.getId(), Collections.emptyList(), Collections.emptySet(), Collections.emptyList(), Collections.emptyList());
        }
        return null;
    }).filter(Objects::nonNull).collect(Collectors.toList());
    return stems.isEmpty() ? null : new Query(stems);
}
Also used : CollectionAttributeFilter(io.lumeer.api.model.CollectionAttributeFilter) Query(io.lumeer.api.model.Query) Attribute(io.lumeer.api.model.Attribute) QueryStem(io.lumeer.api.model.QueryStem)

Aggregations

Query (io.lumeer.api.model.Query)43 Document (io.lumeer.api.model.Document)28 Test (org.junit.Test)26 DataDocument (io.lumeer.engine.api.data.DataDocument)24 QueryStem (io.lumeer.api.model.QueryStem)22 Collection (io.lumeer.api.model.Collection)15 Attribute (io.lumeer.api.model.Attribute)14 Constraint (io.lumeer.api.model.Constraint)10 LinkInstance (io.lumeer.api.model.LinkInstance)10 Role (io.lumeer.api.model.Role)10 LinkType (io.lumeer.api.model.LinkType)9 View (io.lumeer.api.model.View)9 ArrayList (java.util.ArrayList)9 HashSet (java.util.HashSet)9 Permission (io.lumeer.api.model.Permission)7 Permissions (io.lumeer.api.model.Permissions)7 List (java.util.List)7 Project (io.lumeer.api.model.Project)6 User (io.lumeer.api.model.User)6 CollectionAttributeFilter (io.lumeer.api.model.CollectionAttributeFilter)5