All Downloads are FREE. Search and download functionalities are using the official Maven repository.

edu.stanford.protege.webprotege.issues.EntityDiscussionThreadRepository Maven / Gradle / Ivy

The newest version!
package edu.stanford.protege.webprotege.issues;

import edu.stanford.protege.webprotege.inject.ApplicationSingleton;
import edu.stanford.protege.webprotege.common.ProjectId;
import org.semanticweb.owlapi.model.OWLEntity;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;

import javax.annotation.Nonnull;
import javax.inject.Inject;
import java.util.List;
import java.util.Optional;

import static edu.stanford.protege.webprotege.issues.EntityDiscussionThread.*;
import static org.springframework.data.mongodb.core.query.Criteria.where;
import static org.springframework.data.mongodb.core.query.Query.query;
import static org.springframework.data.mongodb.core.query.Update.update;

/**
 * Matthew Horridge
 * Stanford Center for Biomedical Informatics Research
 * 5 Oct 2016
 */
@ApplicationSingleton
public class EntityDiscussionThreadRepository {

    public static final String MATCHED_COMMENT_PATH = "comments.$";

    private final MongoTemplate mongoTemplate;

    @Inject
    public EntityDiscussionThreadRepository(@Nonnull MongoTemplate mongoTemplate) {
        this.mongoTemplate = mongoTemplate;
    }

    public List findThreads(@Nonnull ProjectId projectId,
                                                    @Nonnull OWLEntity entity) {
        var query = query(where(PROJECT_ID).is(projectId).and(ENTITY).is(entity)).with(Sort.by("comments.0.createdAt"));
        return mongoTemplate.find(query, EntityDiscussionThread.class);
    }

    public int getCommentsCount(@Nonnull ProjectId projectId,
                                @Nonnull OWLEntity entity) {
        return findThreads(projectId, entity).stream()
                                             .map(thread -> thread.getComments().size())
                                             .reduce((left, right) -> left + right)
                                             .orElse(0);
    }

    public int getOpenCommentsCount(@Nonnull ProjectId projectId,
                                    @Nonnull OWLEntity entity) {
        var query = query(where(PROJECT_ID).is(projectId)
                      .and(ENTITY).is(entity).and(STATUS).is(Status.OPEN));
        return mongoTemplate.find(query, EntityDiscussionThread.class)
                        .stream().map(thread -> thread.getComments().size())
                        .reduce((left, right) -> left + right)
                        .orElse(0);
    }

    public void saveThread(@Nonnull EntityDiscussionThread thread) {
        mongoTemplate.save(thread);
    }

    public void addCommentToThread(@Nonnull ThreadId threadId,
                                   @Nonnull Comment comment) {
        var query = createQueryForThread(threadId);
        mongoTemplate.updateFirst(query, new Update().push(COMMENTS, comment), EntityDiscussionThread.class);
    }

    public Optional setThreadStatus(@Nonnull ThreadId threadId,
                                                            @Nonnull Status status) {
        var query = createQueryForThread(threadId);
        mongoTemplate.updateFirst(query, update(STATUS, status), EntityDiscussionThread.class);
        return Optional.ofNullable(mongoTemplate.findOne(query, EntityDiscussionThread.class));
    }


    public Optional getThread(@Nonnull ThreadId id) {
        return Optional.ofNullable(mongoTemplate.findOne(createQueryForThread(id), EntityDiscussionThread.class));
    }

    public void replaceEntity(ProjectId projectId, OWLEntity entity, OWLEntity withEntity) {
        var query = query(where(PROJECT_ID).is(projectId).and(ENTITY).is(entity));
        mongoTemplate.updateMulti(query, update(ENTITY, withEntity), EntityDiscussionThread.class);
    }


    private Query createQueryForThread(ThreadId threadId) {
        return query(where("_id").is(threadId));
    }

    public void updateComment(ThreadId id, Comment comment) {
        var query = createQueryForThread(id)
                .addCriteria(where(COMMENTS_ID).is(comment.getId()));
        mongoTemplate.updateFirst(query, update(MATCHED_COMMENT_PATH, comment), EntityDiscussionThread.class);
    }

    public Optional findThreadByCommentId(CommentId commentId) {
        var query = query(where(COMMENTS_ID).is(commentId));
        return Optional.ofNullable(mongoTemplate.findOne(query, EntityDiscussionThread.class));
    }

    public boolean deleteComment(CommentId commentId) {
        var query = query(where(COMMENTS_ID).is(commentId));
        return mongoTemplate.updateFirst(query, new Update().pull(COMMENTS, query(where("_id").is(commentId))),
                                  EntityDiscussionThread.class).getModifiedCount() == 1;
    }

    public List getThreadsInProject(ProjectId projectId) {
        return mongoTemplate.find(query(where(PROJECT_ID).is(projectId)),
                                  EntityDiscussionThread.class);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy