[ https://issues.apache.org/jira/browse/CASSANDRA-6412?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Jeff Jirsa updated CASSANDRA-6412: ---------------------------------- Comment: was deleted (was: I'm playing with this, just to understand it conceptually, using CASSANDRA-8099 as a base. {noformat} cqlsh> create keyspace test2 WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 2}; use test2; cqlsh:test2> select column_name, column_resolver from system.schema_columns where keyspace_name='test2' and columnfamily_name='table_with_resolvers'; column_name | column_resolver -------------+------------------------------------------------------------ first | org.apache.cassandra.db.resolvers.ReverseTimestampResolver high | org.apache.cassandra.db.resolvers.MaxValueResolver id | org.apache.cassandra.db.resolvers.TimestampResolver last | org.apache.cassandra.db.resolvers.TimestampResolver low | org.apache.cassandra.db.resolvers.MinValueResolver (5 rows) cqlsh:test2> create table table_with_resolvers ( id text, low int with resolver 'org.apache.cassandra.db.resolvers.MinValueResolver', high int with resolver 'org.apache.cassandra.db.resolvers.MaxValueResolver', last int with resolver 'org.apache.cassandra.db.resolvers.TimestampResolver', first int with resolver 'org.apache.cassandra.db.resolvers.ReverseTimestampResolver', PRIMARY KEY(id)); cqlsh:test2> insert into table_with_resolvers (id, low, high, first, last ) values ('1', 1, 1, 1, 1); cqlsh:test2> insert into table_with_resolvers (id, low, high, first, last ) values ('1', 2, 2, 2, 2); cqlsh:test2> insert into table_with_resolvers (id, low, high, first, last ) values ('1', 3, 3, 3, 3); cqlsh:test2> insert into table_with_resolvers (id, low, high, first, last ) values ('1', 5, 5, 5, 5); cqlsh:test2> insert into table_with_resolvers (id, low, high, first, last ) values ('1', 4, 4, 4, 4); cqlsh:test2> select * from table_with_resolvers; id | first | high | last | low ----+-------+------+------+----- 1 | 1 | 5 | 4 | 1 (1 rows) {noformat} My diff/patch isn't fit for sharing at this time but as I'm going through, I had some questions: 1) Given that user types are frozen, does it make sense to allow a resolver per field in user types, assuming that eventually user types will become un-frozen? 2) My initial pass disallows custom resolvers on counters and collections - does anyone have any strong opinion on whether or not user defined merge functions should be allowed for collections? 3) Still battling through deletion/tombstone reconciliation. Still making sure I fully understand all of the problem cases. ) > Custom creation and merge functions for user-defined column types > ----------------------------------------------------------------- > > Key: CASSANDRA-6412 > URL: https://issues.apache.org/jira/browse/CASSANDRA-6412 > Project: Cassandra > Issue Type: New Feature > Components: Core > Reporter: Nicolas Favre-Felix > > This is a proposal for a new feature, mapping custom types to Cassandra > columns. > These types would provide a creation function and a merge function, to be > implemented in Java by the user. > This feature relates to the concept of CRDTs; the proposal is to replicate > "operations" on these types during write, to apply these operations > internally during merge (Column.reconcile), and to also merge their values on > read. > The following operations are made possible without reading back any data: > * MIN or MAX(value) for a column > * First value for a column > * Count Distinct > * HyperLogLog > * Count-Min > And any composition of these too, e.g. a Candlestick type includes first, > last, min, and max. > The merge operations exposed by these types need to be commutative; this is > the case for many functions used in analytics. > This feature is incomplete without some integration with CASSANDRA-4775 > (Counters 2.0) which provides a Read-Modify-Write implementation for > distributed counters. Integrating custom creation and merge functions with > new counters would let users implement complex CRDTs in Cassandra, including: > * Averages & related (sum of squares, standard deviation) > * Graphs > * Sets > * Custom registers (even with vector clocks) > I have a working prototype with implementations for min, max, and Candlestick > at https://github.com/acunu/cassandra/tree/crdts - I'd appreciate any > feedback on the design and interfaces. -- This message was sent by Atlassian JIRA (v6.3.4#6332)