3

At first I misunderstood my problem and posted this question : Can someone explain me Cascading and FetchType lazy in Ektorp?

What I need to do: I need to save an Entity in couchdb and then have way to read it and potentially ignore some fields. So I came up with this solution: I create a show function that delete fields from an object and then send it back.

function(doc, req) {
    var result = doc;
    var ignore = JSON.parse(decodeURIComponent(req.query.ignore)); //this is an array of field names
    for (var i = 0, j = ignore.length; i < j; i++) {
        if (result[ignore[i]]) {
            delete result[ignore[i]];
        }
    }
    return {
        body : JSON.stringify(result),
        headers : {
            "Content-Type" : "application/json"
        }
    };
}

I have the same function but reversed in which the object keeps the fields I tell the function to keep.

Is there a better way to do this?

I also want to use Ektorp to call this but it allows me to only call Views. Right now I am forced to manage the http request myself. Is there a way to avoid this?

Right now this is the code I must use, but I would like to use Ektorp to do this.

    HttpClient httpClient = new StdHttpClient.Builder().url("http://localhost:5984").build();
    CouchDbInstance dbInstance = new StdCouchDbInstance(httpClient);
    CouchDbConnector db = new StdCouchDbConnector("mydatabase", dbInstance);
    db.createDatabaseIfNotExists();

    String[] forget = new String[] { "field_to_ignore" };
    String uri = "/mydatabase/_design/mydesigndoc/_show/ignorefields/mydocid?ignore=" + URLEncoder.encode(Json.stringify(Json.toJson(forget)), "UTF-8");
    System.out.println(uri);
    HttpResponse r = db.getConnection().get(uri);
    String stuff = new Scanner(r.getContent()).useDelimiter("\\A").next();
    System.out.println(stuff);
Community
  • 1
  • 1
le-doude
  • 3,345
  • 2
  • 25
  • 55

1 Answers1

1

A show function isn't a terrible idea, from a CouchDB point of view. Ektorp may not support them, presumably because they're not hugely used, but Ektorp's open-source and on Github; you could easily just add this functionality, especially since you already have the basics of a working implementation of it.

Alternatively you could just build a view that does this for a given set of fields. You can't really parameterize this though, so you'd need well-defined sets of fields you know beforehand.

Finally I'd suggest either pulling the whole document and not worrying about it (unless you're in an extremely hugely bandwidth-limited situation it's probably not going to matter), or splitting the document into the constituent parts you're querying for and requesting them independently, if that's definitely the unusual case.

Tim Perry
  • 11,766
  • 1
  • 57
  • 85
  • yeah mostly this would be usefull for huge documents where the field I ignore are very big (bandwidth or deserializtion wize) and they not needed all the time. I think I am going to do as you suggested about Ektorp. – le-doude Apr 17 '13 at 11:50