Search in sources :

Example 16 with Query

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

the class SearchFacade method searchTasksDocumentsAndLinks.

private Tuple<List<Document>, List<LinkInstance>> searchTasksDocumentsAndLinks(final Query query, boolean isPublic, boolean includeChildDocuments) {
    final List<Collection> collections = collectionDao.getCollectionsByPurpose(CollectionPurposeType.Tasks);
    // we don't fetch links for tasks
    final List<LinkType> linkTypes = Collections.emptyList();
    final Query tasksQuery = modifyQueryForTasks(isPublic, query, collections);
    if (tasksQuery == null) {
        return new Tuple<>(Collections.emptyList(), Collections.emptyList());
    }
    final Map<String, Collection> collectionsMap = getCollectionsMap(collections);
    final Map<String, LinkType> linkTypesMap = getLinkTypeMap(linkTypes);
    final Function<Document, Boolean> documentFilter = query.isEmpty() ? document -> !CollectionPurposeUtils.isDoneState(document.getData(), collectionsMap.get(document.getCollectionId())) : null;
    return searchDocumentsAndLinks(tasksQuery, includeChildDocuments, !isPublic && query.isEmpty(), collectionsMap, linkTypesMap, documentFilter, isPublic);
}
Also used : Query(io.lumeer.api.model.Query) Collection(io.lumeer.api.model.Collection) LinkType(io.lumeer.api.model.LinkType) Document(io.lumeer.api.model.Document) Tuple(io.lumeer.core.util.Tuple)

Example 17 with Query

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

the class SearchFacade method searchDocumentsAndLinksByFulltexts.

private Tuple<? extends java.util.Collection<Document>, ? extends java.util.Collection<LinkInstance>> searchDocumentsAndLinksByFulltexts(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<>();
    // because we are filtering documents (or links) without linked documents, so it is safe to fetch more
    var fetchSizeMultiplier = 3;
    var fetchSize = FETCH_SIZE * fetchSizeMultiplier;
    collectionsMap.values().forEach(collection -> {
        final List<Collection> collections = Collections.singletonList(collection);
        final Map<String, AllowedPermissions> collectionsPermissions = permissionsChecker.getCollectionsPermissions(collections);
        final Map<String, AllowedPermissions> linkTypesPermissions = Collections.emptyMap();
        final Query query = new Query(Collections.emptyList(), fulltexts, null, null);
        var hasMoreDocuments = true;
        var page = 0;
        while (hasMoreDocuments) {
            final List<Document> pagedDocuments = getDocumentsByCollection(collection, page, fetchSize);
            final List<Document> filteredDocuments = filterDocumentsByDocumentFilter(pagedDocuments, documentFilter);
            if (!filteredDocuments.isEmpty()) {
                var result = DataFilter.filterDocumentsAndLinksByQueryFromJson(new ArrayList<>(filteredDocuments), collections, Collections.emptyList(), new ArrayList<>(), query, collectionsPermissions, linkTypesPermissions, constraintData, includeChildDocuments, language);
                allDocuments.addAll(result.getFirst());
            }
            hasMoreDocuments = !pagedDocuments.isEmpty();
            page++;
        }
    });
    linkTypesMap.values().forEach(linkType -> {
        final List<LinkType> linkTypes = Collections.singletonList(linkType);
        final List<Collection> collections = linkType.getCollectionIds().stream().map(collectionsMap::get).filter(Objects::nonNull).collect(Collectors.toList());
        final Map<String, AllowedPermissions> collectionsPermissions = permissionsChecker.getCollectionsPermissions(collections);
        final Map<String, AllowedPermissions> linkTypesPermissions = permissionsChecker.getLinkTypesPermissions(linkTypes);
        final Query query = new Query(Collections.emptyList(), fulltexts, null, null);
        var hasMoreLinks = true;
        var page = 0;
        while (hasMoreLinks) {
            final List<LinkInstance> linkInstances = getLinkInstancesByLinkType(linkType, page, fetchSize);
            if (!linkInstances.isEmpty()) {
                var result = DataFilter.filterDocumentsAndLinksByQueryFromJson(new ArrayList<>(), collections, linkTypes, linkInstances, query, collectionsPermissions, linkTypesPermissions, constraintData, true, language);
                allLinkInstances.addAll(result.getSecond());
            }
            hasMoreLinks = !linkInstances.isEmpty();
            page++;
        }
    });
    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 18 with Query

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

the class SearchFacade method searchDocumentsAndLinks.

private Tuple<List<Document>, List<LinkInstance>> searchDocumentsAndLinks(final Query query, boolean includeChildDocuments, boolean shouldCheckQuery, final Map<String, Collection> collectionsMap, final Map<String, LinkType> linkTypesMap, @Nullable final Function<Document, Boolean> documentFilter, boolean isPublic) {
    final Query encodedQuery = checkQuery(query, collectionsMap, linkTypesMap, shouldCheckQuery);
    final Set<Document> allDocuments = new HashSet<>();
    final Set<LinkInstance> allLinkInstances = new HashSet<>();
    if (encodedQuery.containsStems()) {
        ConstraintData constraintData = createConstraintData();
        encodedQuery.getStems().forEach(stem -> {
            var result = stem.containsAnyFilter() || encodedQuery.getFulltexts().size() > 0 ? searchDocumentsAndLinksInStem(stem, encodedQuery.getFulltexts(), collectionsMap, linkTypesMap, documentFilter, constraintData, includeChildDocuments) : searchDocumentsAndLinksInStemWithoutFilters(stem, collectionsMap, linkTypesMap, documentFilter, isPublic);
            allDocuments.addAll(result.getFirst());
            allLinkInstances.addAll(result.getSecond());
        });
    } else if (encodedQuery.getFulltexts().size() > 0) {
        var result = searchDocumentsAndLinksByFulltexts(encodedQuery.getFulltexts(), collectionsMap, linkTypesMap, documentFilter, createConstraintData(), includeChildDocuments);
        allDocuments.addAll(result.getFirst());
        allLinkInstances.addAll(result.getSecond());
    } else {
        var result = searchDocumentsAndLinksByEmptyQuery(collectionsMap, linkTypesMap, documentFilter, isPublic);
        allDocuments.addAll(result.getFirst());
        allLinkInstances.addAll(result.getSecond());
    }
    var mappedDocuments = documentAdapter.mapDocumentsData(new ArrayList<>(allDocuments), getCurrentUserId(), workspaceKeeper.getProjectId());
    var mappedLinkInstances = linkInstanceAdapter.mapLinkInstancesData(new ArrayList<>(allLinkInstances));
    return new Tuple<>(mappedDocuments, mappedLinkInstances);
}
Also used : ConstraintData(io.lumeer.api.model.ConstraintData) Query(io.lumeer.api.model.Query) LinkInstance(io.lumeer.api.model.LinkInstance) Document(io.lumeer.api.model.Document) Tuple(io.lumeer.core.util.Tuple) HashSet(java.util.HashSet)

Example 19 with Query

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

the class UserNotificationFacade method getResourceDescription.

private DataDocument getResourceDescription(final Resource resource) {
    final DataDocument data = new DataDocument();
    if (resource.getType() == ResourceType.ORGANIZATION) {
        appendOrganization((Organization) resource, data);
    } else if (resource.getType() == ResourceType.PROJECT) {
        appendOrganization(getOrganization(), data);
        appendProject((Project) resource, data);
    } else if (resource.getType() == ResourceType.COLLECTION) {
        appendOrganization(getOrganization(), data);
        appendProject(getProject(), data);
        data.append(UserNotification.CollectionShared.COLLECTION_ID, resource.getId());
        data.append(UserNotification.CollectionShared.COLLECTION_NAME, resource.getName());
        data.append(UserNotification.CollectionShared.COLLECTION_ICON, resource.getIcon());
        data.append(UserNotification.CollectionShared.COLLECTION_COLOR, resource.getColor());
        final String query = new Query(List.of(new QueryStem(resource.getId())), null, null, null).toQueryString();
        data.append(UserNotification.CollectionShared.COLLECTION_QUERY, Utils.encodeQueryParam(query));
    } else if (resource.getType() == ResourceType.VIEW) {
        appendOrganization(getOrganization(), data);
        appendProject(getProject(), data);
        data.append(UserNotification.ViewShared.VIEW_CODE, resource.getCode());
        data.append(UserNotification.ViewShared.VIEW_ICON, resource.getIcon());
        data.append(UserNotification.ViewShared.VIEW_COLOR, resource.getColor());
        data.append(UserNotification.ViewShared.VIEW_PERSPECTIVE, ((View) resource).getPerspective());
        data.append(UserNotification.ViewShared.VIEW_NAME, resource.getName());
    }
    return data;
}
Also used : DataDocument(io.lumeer.engine.api.data.DataDocument) Project(io.lumeer.api.model.Project) Query(io.lumeer.api.model.Query) View(io.lumeer.api.model.View) QueryStem(io.lumeer.api.model.QueryStem)

Example 20 with Query

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

the class ViewCodec method decode.

@Override
public View decode(final BsonReader reader, final DecoderContext decoderContext) {
    Document bson = documentCodec.decode(reader, decoderContext);
    SimpleResource resource = decodeResource(bson, ResourceType.VIEW);
    Query query = QueryCodec.convertFromDocument(bson.get(QUERY, Document.class));
    Perspective perspective = decodePerspective(bson);
    Object config = bson.get(CONFIG);
    Object settings = bson.get(SETTINGS);
    String authorId = bson.getString(AUTHOR_ID);
    Date lastTimeUsed = bson.getDate(LAST_TIME_USED);
    List<String> folders = bson.getList(FOLDERS, String.class);
    List<Query> additionalQueries = Collections.emptyList();
    List queriesList = bson.get(ADDITIONAL_QUERIES, List.class);
    if (queriesList != null) {
        additionalQueries = new ArrayList<Document>(queriesList).stream().map(QueryCodec::convertFromDocument).collect(Collectors.toList());
    }
    View view = new View(resource, query, additionalQueries, perspective, config, settings, authorId, folders);
    view.setVersion(resource.getVersion());
    if (lastTimeUsed != null) {
        view.setLastTimeUsed(ZonedDateTime.ofInstant(lastTimeUsed.toInstant(), ZoneOffset.UTC));
    }
    return view;
}
Also used : Query(io.lumeer.api.model.Query) ArrayList(java.util.ArrayList) Document(org.bson.Document) View(io.lumeer.api.model.View) Date(java.util.Date) Perspective(io.lumeer.api.model.Perspective) SimpleResource(io.lumeer.api.model.common.SimpleResource) ArrayList(java.util.ArrayList) List(java.util.List)

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