Counters inside Maps

2014-08-19 Thread Alex De la rosa
Imagine I have a Riak object footballer with some static fields: name,
team, number. I store them like this now:

1: CREATE INDEX FOR RIAK SEARCH
curl -XPUT http://148.251.140.229:8098/search/index/ix_footballers;

2: CREATE BUCKET TYPE
riak-admin bucket-type create tp_footballers
'{props:{allow_mult:false,search_index:ix_footballers}}'
riak-admin bucket-type activate tp_footballers

3: INSERT A PLAYER
bucket = client.bucket_type('tp_footballers').bucket('footballers')
key = bucket.new('lionelmessi', data={'name_s':'Messi',
'team_s':'Barcelona', 'number_i':10}, content_type='application/json')
key.store()

4: SEARCH FOR BARCELONA PLAYERS
r = client.fulltext_search('ix_footballers', 'team_s:Barcelona')

So far so good :) BUT... what if I want to have a field goals_i that is a
counter that will be incremented each match day with the number of goals he
scored? What is the syntax/steps to do to set up footballers as a MAP and
then put a COUNTER inside? I know is possible as I read it in some data
dump some Basho employee passed me some time ago, but I can't manage to see
how to do it now.

Thanks!
Alex
___
riak-users mailing list
riak-users@lists.basho.com
http://lists.basho.com/mailman/listinfo/riak-users_lists.basho.com


Re: Counters inside Maps

2014-08-19 Thread Sean Cribbs
Alex,

Assuming you've already made your bucket-type with map as the
datatype, then bucket.new() will return you a Map instead of a
RiakObject. Translating your example above:

key = bucket.new('lionelmessi')
key.registers['name'].assign('Messi')
key.registers['team'].assign('Barcelona')
key.counters['number'].increment(10)
key.store()

Note that because Maps are based on mutation operations and not
replacing the value with new ones, you can later do this without
setting the entire value:

key.counters['number'].increment(1)
key.store()

This will also change your searches, however, in that the fields will
be suffixed with the embedded type you are using:

r = client.fulltext_search('ix_footballers', 'team_register:Barcelona')

Hope that helps!

On Tue, Aug 19, 2014 at 2:59 PM, Alex De la rosa
alex.rosa@gmail.com wrote:
 Imagine I have a Riak object footballer with some static fields: name,
 team, number. I store them like this now:

 1: CREATE INDEX FOR RIAK SEARCH
 curl -XPUT http://148.251.140.229:8098/search/index/ix_footballers;

 2: CREATE BUCKET TYPE
 riak-admin bucket-type create tp_footballers
 '{props:{allow_mult:false,search_index:ix_footballers}}'
 riak-admin bucket-type activate tp_footballers

 3: INSERT A PLAYER
 bucket = client.bucket_type('tp_footballers').bucket('footballers')
 key = bucket.new('lionelmessi', data={'name_s':'Messi',
 'team_s':'Barcelona', 'number_i':10}, content_type='application/json')
 key.store()

 4: SEARCH FOR BARCELONA PLAYERS
 r = client.fulltext_search('ix_footballers', 'team_s:Barcelona')

 So far so good :) BUT... what if I want to have a field goals_i that is a
 counter that will be incremented each match day with the number of goals he
 scored? What is the syntax/steps to do to set up footballers as a MAP and
 then put a COUNTER inside? I know is possible as I read it in some data dump
 some Basho employee passed me some time ago, but I can't manage to see how
 to do it now.

 Thanks!
 Alex

 ___
 riak-users mailing list
 riak-users@lists.basho.com
 http://lists.basho.com/mailman/listinfo/riak-users_lists.basho.com




-- 
Sean Cribbs s...@basho.com
Software Engineer
Basho Technologies, Inc.
http://basho.com/

___
riak-users mailing list
riak-users@lists.basho.com
http://lists.basho.com/mailman/listinfo/riak-users_lists.basho.com


Re: Counters inside Maps

2014-08-19 Thread Alex De la rosa
Cool! Understood :)

Thanks!
Alex

On Wednesday, August 20, 2014, Sean Cribbs s...@basho.com wrote:

 On Tue, Aug 19, 2014 at 3:34 PM, Alex De la rosa
 alex.rosa@gmail.com javascript:; wrote:
  Hi Sean,
 
  I didn't created the bucket_type as a map datatype as at first i was just
  testing simple Riak Search... then it occurred to me what if I want a
  counter in the data? :)
 
  Your example is pretty straightforward to follow and simple. Just 2
  questions:
 
  1. key.counters['number'].increment(1) = No need to define a counters
  data-type somewhere before putting it inside the map as we normally need
 in
  simple buckets? If it works automatically is great :)

 Yes, it works automatically. All included datatypes are available inside
 maps.

 
  2. if we use number_counter instead of number_i does Search/SOLR
  understand is an integer? in case you want to do a range... as somewhere
 in
  the docs I read that better to use _s for strings, _b for binary,
 _i
  for integers, etc... so SOLR knows how to treat the data... I believe
 there
  will be no strange behaviours for having _register instead of _s and
  _counter instead of _i, right?

 The default Solr schema that ships with Riak accounts for these
 datatypes automatically and uses the appropriate index field type:

 https://github.com/basho/yokozuna/blob/develop/priv/default_schema.xml#L96-L104

 If you write your own schema, you will want to include or change the
 schema fields appropriately.

 
  Thanks!
  Alex
 
 
  On Wed, Aug 20, 2014 at 12:24 AM, Sean Cribbs s...@basho.com
 javascript:; wrote:
 
  Alex,
 
  Assuming you've already made your bucket-type with map as the
  datatype, then bucket.new() will return you a Map instead of a
  RiakObject. Translating your example above:
 
  key = bucket.new('lionelmessi')
  key.registers['name'].assign('Messi')
  key.registers['team'].assign('Barcelona')
  key.counters['number'].increment(10)
  key.store()
 
  Note that because Maps are based on mutation operations and not
  replacing the value with new ones, you can later do this without
  setting the entire value:
 
  key.counters['number'].increment(1)
  key.store()
 
  This will also change your searches, however, in that the fields will
  be suffixed with the embedded type you are using:
 
  r = client.fulltext_search('ix_footballers', 'team_register:Barcelona')
 
  Hope that helps!
 
  On Tue, Aug 19, 2014 at 2:59 PM, Alex De la rosa
  alex.rosa@gmail.com javascript:; wrote:
   Imagine I have a Riak object footballer with some static fields:
 name,
   team, number. I store them like this now:
  
   1: CREATE INDEX FOR RIAK SEARCH
   curl -XPUT http://148.251.140.229:8098/search/index/ix_footballers;
  
   2: CREATE BUCKET TYPE
   riak-admin bucket-type create tp_footballers
   '{props:{allow_mult:false,search_index:ix_footballers}}'
   riak-admin bucket-type activate tp_footballers
  
   3: INSERT A PLAYER
   bucket = client.bucket_type('tp_footballers').bucket('footballers')
   key = bucket.new('lionelmessi', data={'name_s':'Messi',
   'team_s':'Barcelona', 'number_i':10}, content_type='application/json')
   key.store()
  
   4: SEARCH FOR BARCELONA PLAYERS
   r = client.fulltext_search('ix_footballers', 'team_s:Barcelona')
  
   So far so good :) BUT... what if I want to have a field goals_i that
   is a
   counter that will be incremented each match day with the number of
 goals
   he
   scored? What is the syntax/steps to do to set up footballers as a
 MAP
   and
   then put a COUNTER inside? I know is possible as I read it in some
 data
   dump
   some Basho employee passed me some time ago, but I can't manage to see
   how
   to do it now.
  
   Thanks!
   Alex
  
   ___
   riak-users mailing list
   riak-users@lists.basho.com javascript:;
   http://lists.basho.com/mailman/listinfo/riak-users_lists.basho.com
  
 
 
 
  --
  Sean Cribbs s...@basho.com javascript:;
  Software Engineer
  Basho Technologies, Inc.
  http://basho.com/
 
 



 --
 Sean Cribbs s...@basho.com javascript:;
 Software Engineer
 Basho Technologies, Inc.
 http://basho.com/

___
riak-users mailing list
riak-users@lists.basho.com
http://lists.basho.com/mailman/listinfo/riak-users_lists.basho.com