package org.jvalue.ods.db;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.google.inject.Inject;
import com.google.inject.assistedinject.Assisted;
import org.ektorp.CouchDbConnector;
import org.ektorp.DocumentNotFoundException;
import org.ektorp.support.CouchDbRepositorySupport;
import org.ektorp.support.View;
import org.jvalue.commons.couchdb.DbConnectorFactory;
import org.jvalue.commons.couchdb.DbDocument;
import org.jvalue.commons.couchdb.DbDocumentAdaptable;
import org.jvalue.commons.couchdb.RepositoryAdapter;
import org.jvalue.ods.api.processors.ProcessorReferenceChain;
import java.util.List;
public final class ProcessorChainReferenceRepository extends RepositoryAdapter<
ProcessorChainReferenceRepository.ProcessorChainReferenceCouchDbRepository,
ProcessorChainReferenceRepository.ProcessorReferenceChainDocument,
ProcessorReferenceChain> {
private static final String DOCUMENT_ID = "doc.value.id != null && doc.value.processors != null";
@Inject
ProcessorChainReferenceRepository(DbConnectorFactory dbConnectorFactory, @Assisted String databaseName) {
super(new ProcessorChainReferenceCouchDbRepository(dbConnectorFactory.createConnector(databaseName, true)));
}
@View( name = "all", map = "function(doc) { if (" + DOCUMENT_ID + ") emit(null, doc) }")
static final class ProcessorChainReferenceCouchDbRepository
extends CouchDbRepositorySupport<ProcessorChainReferenceRepository.ProcessorReferenceChainDocument>
implements DbDocumentAdaptable<ProcessorReferenceChainDocument, ProcessorReferenceChain> {
ProcessorChainReferenceCouchDbRepository(CouchDbConnector connector) {
super(ProcessorReferenceChainDocument.class, connector);
initStandardDesignDocument();
}
@Override
@View(name = "by_id", map = "function(doc) { if (" + DOCUMENT_ID + ") emit(doc.value.id, doc._id) }")
public ProcessorReferenceChainDocument findById(String processorChainId) {
List<ProcessorReferenceChainDocument> chains = queryView("by_id", processorChainId);
if (chains.isEmpty()) throw new DocumentNotFoundException(processorChainId);
if (chains.size() > 1)
throw new IllegalStateException("found more than one chain for id " + processorChainId);
return chains.get(0);
}
@Override
public ProcessorReferenceChainDocument createDbDocument(ProcessorReferenceChain reference) {
return new ProcessorReferenceChainDocument(reference);
}
@Override
public String getIdForValue(ProcessorReferenceChain reference) {
return reference.getId();
}
}
static final class ProcessorReferenceChainDocument extends DbDocument<ProcessorReferenceChain> {
@JsonCreator
public ProcessorReferenceChainDocument(
@JsonProperty("value") ProcessorReferenceChain reference) {
super(reference);
}
}
}