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.views.DataView;
import java.util.List;
public final class DataViewRepository extends RepositoryAdapter<
DataViewRepository.DataViewCouchDbRepository,
DataViewRepository.DataViewDocument,
DataView> {
private static final String DOCUMENT_ID = "doc.value.id != null && doc.value.mapFunction != null";
@Inject
DataViewRepository(DbConnectorFactory dbConnectorFactory, @Assisted String databaseName) {
super(new DataViewCouchDbRepository(dbConnectorFactory.createConnector(databaseName, true)));
}
@View( name = "all", map = "function(doc) { if (" + DOCUMENT_ID + ") emit(null, doc) }")
static final class DataViewCouchDbRepository
extends CouchDbRepositorySupport<DataViewRepository.DataViewDocument>
implements DbDocumentAdaptable<DataViewDocument, DataView> {
public DataViewCouchDbRepository(CouchDbConnector connector) {
super(DataViewDocument.class, connector);
initStandardDesignDocument();
}
@Override
@View(name = "by_id", map = "function(doc) { if (" + DOCUMENT_ID + ") emit(doc.value.id, doc._id) }")
public DataViewDocument findById(String viewId) {
List<DataViewDocument> views = queryView("by_id", viewId);
if (views.isEmpty()) throw new DocumentNotFoundException(viewId);
if (views.size() > 1)
throw new IllegalStateException("found more than one view for id " + viewId);
return views.get(0);
}
@Override
public DataViewDocument createDbDocument(DataView view) {
return new DataViewDocument(view);
}
@Override
public String getIdForValue(DataView view) {
return view.getId();
}
}
static final class DataViewDocument extends DbDocument<DataView> {
@JsonCreator
public DataViewDocument(
@JsonProperty("value") DataView dataView) {
super(dataView);
}
}
}