You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by "Tellier Benoit (JIRA)" <se...@james.apache.org> on 2019/06/24 10:16:00 UTC

[jira] [Updated] (JAMES-2809) DeletedMessageVault implementation of append & search (full scan version) on top of BlobStore

     [ https://issues.apache.org/jira/browse/JAMES-2809?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Tellier Benoit updated JAMES-2809:
----------------------------------
    Description: 
You will write a BlobStore based DeletedMessageVault implementation where it has:

 - a dedicated component(DeletedMessageMetadataVault) to store metadata in order to have reasonable searching performance (JAMES-2807)
 - the capability of choosing bucket in BlobStore as the proposal JAMES-2806 described
 
# Append
you also have to implement a related method loadMimeMessage()



{code:java}
class BlobStoreDeletedMessageVault implements DeletedMessageVault {
    private final DeletedMessageMetadataVault metadataVault;
    private final BlobStore blobStore;

    Mono<Void> append(User user, DeletedMessage message, InputStream mimeMessage) {
        BlobId deletedMessageFileName = calculateFileName(message);
        blobStore
            .store(mimeMessage, deletedMessageFileName, calculateCurrentBucket());
        metadataVault.store(calculateCurrentBucket(), message);
    }

    Mono<InputStream> loadMimeMessage(User user, MessageId messageId) {
        ....
    }
}
{code}

Pattern for BucketName: `deletedMessages-2019-06-01` where 2019 is the year and 06 the month. 01 is used to later allow smaller bucket definition.

# Searching ontop of DeletedMessageMetadataVault JAMES-2807

 - retrieve all available buckets from DeletedMessageMetadataVault
 - for each bucket, use retrieve all deleted message metadata of corresponding user
   - filter records match with query criteria

{code:java}
class BlobStoreDeletedMessageVault implements DeletedMessageVault {
    
    private DeletedMessageMetadataVault metadataVault;

    Flux<DeletedMessage> search(User user, Query query) {
        return metadataVault.listContainers()
            .flatMap(containerName -> metadataVault.listMessages(containerName, user))
            .filter(deletedMessage -> matches(deletedMessage, query));
    }
}
{code}

  was:
You will write a BlobStore based DeletedMessageVault implementation where it has:

 - a dedicated component(DeletedMessageMetadataVault) to store metadata in order to have reasonable searching performance (JAMES-2807)
 - the capability of choosing bucket in BlobStore as the proposal JAMES-2806 described
 
### Append
you also have to implement a related method loadMimeMessage()



{code:java}
class BlobStoreDeletedMessageVault implements DeletedMessageVault {
    private final DeletedMessageMetadataVault metadataVault;
    private final BlobStore blobStore;

    Mono<Void> append(User user, DeletedMessage message, InputStream mimeMessage) {
        BlobId deletedMessageFileName = calculateFileName(message);
        blobStore
            .store(mimeMessage, deletedMessageFileName, calculateCurrentBucket());
        metadataVault.store(calculateCurrentBucket(), message);
    }

    Mono<InputStream> loadMimeMessage(User user, MessageId messageId) {
        ....
    }
}
{code}

Pattern for BucketName: `deletedMessages-2019-06-01` where 2019 is the year and 06 the month. 01 is used to later allow smaller bucket definition.

#Searching ontop of DeletedMessageMetadataVault JAMES-2807

 - retrieve all available buckets from DeletedMessageMetadataVault
 - for each bucket, use retrieve all deleted message metadata of corresponding user
   - filter records match with query criteria

{code:java}
class BlobStoreDeletedMessageVault implements DeletedMessageVault {
    
    private DeletedMessageMetadataVault metadataVault;

    Flux<DeletedMessage> search(User user, Query query) {
        return metadataVault.listContainers()
            .flatMap(containerName -> metadataVault.listMessages(containerName, user))
            .filter(deletedMessage -> matches(deletedMessage, query));
    }
}
{code}


> DeletedMessageVault implementation of append & search (full scan version) on top of BlobStore
> ---------------------------------------------------------------------------------------------
>
>                 Key: JAMES-2809
>                 URL: https://issues.apache.org/jira/browse/JAMES-2809
>             Project: James Server
>          Issue Type: Sub-task
>          Components: deletedMessageVault
>            Reporter: Tellier Benoit
>            Priority: Major
>
> You will write a BlobStore based DeletedMessageVault implementation where it has:
>  - a dedicated component(DeletedMessageMetadataVault) to store metadata in order to have reasonable searching performance (JAMES-2807)
>  - the capability of choosing bucket in BlobStore as the proposal JAMES-2806 described
>  
> # Append
> you also have to implement a related method loadMimeMessage()
> {code:java}
> class BlobStoreDeletedMessageVault implements DeletedMessageVault {
>     private final DeletedMessageMetadataVault metadataVault;
>     private final BlobStore blobStore;
>     Mono<Void> append(User user, DeletedMessage message, InputStream mimeMessage) {
>         BlobId deletedMessageFileName = calculateFileName(message);
>         blobStore
>             .store(mimeMessage, deletedMessageFileName, calculateCurrentBucket());
>         metadataVault.store(calculateCurrentBucket(), message);
>     }
>     Mono<InputStream> loadMimeMessage(User user, MessageId messageId) {
>         ....
>     }
> }
> {code}
> Pattern for BucketName: `deletedMessages-2019-06-01` where 2019 is the year and 06 the month. 01 is used to later allow smaller bucket definition.
> # Searching ontop of DeletedMessageMetadataVault JAMES-2807
>  - retrieve all available buckets from DeletedMessageMetadataVault
>  - for each bucket, use retrieve all deleted message metadata of corresponding user
>    - filter records match with query criteria
> {code:java}
> class BlobStoreDeletedMessageVault implements DeletedMessageVault {
>     
>     private DeletedMessageMetadataVault metadataVault;
>     Flux<DeletedMessage> search(User user, Query query) {
>         return metadataVault.listContainers()
>             .flatMap(containerName -> metadataVault.listMessages(containerName, user))
>             .filter(deletedMessage -> matches(deletedMessage, query));
>     }
> }
> {code}



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org