Skip to content

Commit

Permalink
Fixed issue #14: add purge operation to CouchDbConnector
Browse files Browse the repository at this point in the history
  • Loading branch information
Henrik Lundgren committed Jul 8, 2011
1 parent d26f76b commit e63bf82
Show file tree
Hide file tree
Showing 4 changed files with 86 additions and 0 deletions.
6 changes: 6 additions & 0 deletions org.ektorp/src/main/java/org/ektorp/CouchDbConnector.java
Expand Up @@ -57,6 +57,12 @@ public interface CouchDbConnector {
* @throws UpdateConflictException if there was an update conflict.
*/
String delete(String id, String revision);
/**
* Permanently removes the references to deleted documents from the database.
* @param revisionsToPurge document IDs & revisions to be purged
* @return contains the purge sequence number, and a list of the document IDs and revisions successfully purged.
*/
PurgeResult purge(Map<String, List<String>> revisionsToPurge);
/**
*
* @param <T>
Expand Down
58 changes: 58 additions & 0 deletions org.ektorp/src/main/java/org/ektorp/PurgeResult.java
@@ -0,0 +1,58 @@
package org.ektorp;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.codehaus.jackson.annotate.JsonAnyGetter;
import org.codehaus.jackson.annotate.JsonAnySetter;
import org.codehaus.jackson.annotate.JsonCreator;
import org.codehaus.jackson.annotate.JsonProperty;

public class PurgeResult {

private final Map<String, List<String>> purged;
private final long purgeSeq;

@JsonCreator
public PurgeResult(@JsonProperty("purged") Map<String,
List<String>> purged,@JsonProperty("purge_seq") long purgeSeq) {
this.purged = purged;
this.purgeSeq = purgeSeq;
}

public Map<String, List<String>> getPurged() {
return purged;
}

public long getPurgeSeq() {
return purgeSeq;
}

private Map<String, Object> anonymous;

/**
* @return a Map containing fields that did not map to any other field in the class during object deserializarion from a JSON document.
*/
@JsonAnyGetter
public Map<String, Object> getAnonymous() {
return anonymous();
}

/**
* Exists in order to future proof this class.
* @param key
* @param value
*/
@JsonAnySetter
public void setAnonymous(String key, Object value) {
anonymous().put(key, value);
}

private Map<String, Object> anonymous() {
if (anonymous == null) {
anonymous = new HashMap<String, Object>();
}
return anonymous;
}
}
11 changes: 11 additions & 0 deletions org.ektorp/src/main/java/org/ektorp/impl/StdCouchDbConnector.java
Expand Up @@ -24,6 +24,7 @@
import org.ektorp.Options;
import org.ektorp.Page;
import org.ektorp.PageRequest;
import org.ektorp.PurgeResult;
import org.ektorp.ReplicationCommand;
import org.ektorp.ReplicationStatus;
import org.ektorp.Revision;
Expand Down Expand Up @@ -183,6 +184,16 @@ public String delete(Object o) {
return delete(Documents.getId(o), Documents.getRevision(o));
}

@Override
public PurgeResult purge(Map<String, List<String>> revisionsToPurge) {
return restTemplate.post(dbURI.append("_purge").toString(), jsonSerializer.toJson(revisionsToPurge), new StdResponseHandler<PurgeResult>() {
@Override
public PurgeResult success(HttpResponse hr) throws Exception {
return objectMapper.readValue(hr.getContent(), PurgeResult.class);
}
});
}

public <T> T get(final Class<T> c, String id) {
return get(c, id, EMPTY_OPTIONS);
}
Expand Down
Expand Up @@ -529,6 +529,17 @@ public void testEnsureFullCommit() {
verify(httpClient).post("/test_db/_ensure_full_commit", "");
}

@Test
public void testPurge() {
String rsp = "{\"purged\" : { \"Billy\" : [ \"17-b3eb5ac6fbaef4428d712e66483dcb79\"]},\"purge_seq\" : 11}";
when(httpClient.post(eq("/test_db/_purge"), anyString())).thenReturn(HttpResponseStub.valueOf(200, rsp));
Map<String, List<String>> revisionsToPurge = new HashMap<String, List<String>>();
revisionsToPurge.put("Billy", Collections.singletonList("17-b3eb5ac6fbaef4428d712e66483dcb79"));
PurgeResult r = dbCon.purge(revisionsToPurge);
assertEquals(11, r.getPurgeSeq());
assertTrue(r.getPurged().containsKey("Billy"));
}

@SuppressWarnings("serial")
static class DateDoc extends CouchDbDocument {

Expand Down

0 comments on commit e63bf82

Please sign in to comment.