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);
}
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);
}
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);
}
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;
}
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;
}
Aggregations