Uploaded image for project: 'Couchbase .NET client library'
  1. Couchbase .NET client library
  2. NCBC-286

Accessing key data when using strongly-typed views

    XMLWordPrintable

Details

    • Improvement
    • Resolution: Won't Fix
    • Major
    • backlog-1.0
    • 1.2.6
    • None
    • Sprint 4

    Description

      Directly lifted from forum post here and copied and pasted below:
      http://www.couchbase.com/forums/thread/net-client-accessing-key-data-when-using-strongly-typed-views

      ====Forum Post 1 (Simon, Requester) ====
      I have a Couchbase 2.0 View that returns a projection of the underlying objects - e.g.

      { Count: 100, SumPrices: 1231231.02 }

      if I use a strongly typed view - e.g.
      client.GetView<MyDto>("my_dd", "my_view")
      the projection is automatically deserialised to my DTO class, which is nice and easy. However, I'd also like to retrieve info from the key, which doesn't seem to be possible with this approach.
      I can use the more general IView syntax, but now I have to deserialize the DTO myself which is not simple since the data is exposed as a dictionary, not a JSON string.
      Perhaps I'm missing something, but it would be useful to be able to use both strong-typing and still have access to the key meta data.
      The alternative would be to include the values from the key in the projection data, but this seems wrong in that the data will be repeated twice in the index?

      ====Forum Post 2 (John)====
      As I understand your view returns.

      { Count: 100, SumPrices: 1231231.02 }

      If this is correct you use reduce function that counts and summs multiple keys. And it returns 1 key-value pair where key is null and value is an object mentioned before.
      So I don't understand which one key's metadata your want to see and where? If you want to see all keys metadata you can store it in reduce function into array or something:

      { Count: 100, SumPrices: 1231231.02, Keys: [key1, key2 ...] }

      .

      ====Forum Post 3 (John)====
      If your DTO includes an "Id" property, it will be populated a bit magically by the generic view method. It's a little trickier than that, and I describe a solution here - http://www.couchbase.com/docs/couchbase-sdk-net-1.2/brewerycrud.html. I'm going to work on improving the JSON extensions to make this easier to use - https://www.couchbase.com/docs/couchbase-sdk-net-1.2/jsonextensions.html.

      ====Forum Post 4 (Simon, Requester)====
      Hi yes, you are correct that this is a map-reduce scenario.
      However I am using the group feature so each row returned should have a distinct key associated with it as per the IViewRow.ViewKey property (of type object[]) in the .NET Client API. I can make this work with the loosely typed version but the mapping code for the returned projection is a bit icky - e.g.
      ((IDictionary)(vr.Info["value"]))["Count"]
      to get the Count value!

      ====Forum Post 5 (Simon, Requester)====
      HI John - Thanks for the pointers. To clarify, this is a map-reduce view scenario. My client code is like this:
      return _client.GetView<WebsiteBrowseQuoteSummary>("browse", "ret_by_route_dow")
      .StartKey(new object[]

      { from, to, (int)departureDate.DayOfWeek, (int)returnDate.DayOfWeek }

      )
      .EndKey(new object[]

      { from, to, (int)departureDate.DayOfWeek, (int)returnDate.DayOfWeek + 1 }

      )
      .Group(true)
      .Reduce(true)
      .ToList();
      I think the issue is that in the strongly typed approach (e.g. GetView<T>) the return type is IView<T> which is an IEnumerable<T> where T is the DTO. If there was an IViewRow<T> with a Value property of type T and a ViewKey property, I think that would do it as I could add the additional work to populate the missing params from the ViewKey.

      ====Forum Post 6 (John)====
      Ah, didn't catch the reduce part... In the beer sample, I used the non-generic view for such queries:
      https://github.com/couchbaselabs/beer-sample-net/blob/master/src/Couchba...
      The limitation with the generic query is that it either a) expects to get the document JSON by its ID, where reduce won't obviously have the id, or b) it expects the value to be a JSON projection to deserialize into an instance of T.
      I'd like to support generic reduce queries, so I'll give it some thought...
      ====End of Forum Posts====

      Attachments

        No reviews matched the request. Check your Options in the drop-down menu of this sections header.

        Activity

          People

            jmorris Jeff Morris
            dhaikney David Haikney (Inactive)
            Votes:
            1 Vote for this issue
            Watchers:
            4 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved:

              Gerrit Reviews

                There are no open Gerrit changes

                PagerDuty