cassie 1.0.0.beta.26 → 1.0.0.beta.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c8c2696d4e1b2aa0bf26d50ba39d4b807084d5f6
4
- data.tar.gz: f8b3d4e1d0d9e751beafe23020dfeb9801c7e3b4
3
+ metadata.gz: cc7caa19b667525c10964c15b1c8c0560280bbb7
4
+ data.tar.gz: 4c77f29fbdc4fff2693125498ebc00a9497218e7
5
5
  SHA512:
6
- metadata.gz: 3c56721404043fef6ebe7b8ec7b6c9919fa6fad2649254758aef5c00dc9e5b4589c8f006ee053b60ab2830816a61b2411e701bc5d14ce65207006a4ff04b0209
7
- data.tar.gz: 35a13f31e014a3907c5922663b7b8f4727942213c8c48eade9a11e616c328964e9e82908d57b45ff3fb8aa1c849b45d162a154886d4745e3287376931b2cf1f3
6
+ metadata.gz: 8d8b604b1c52dea54e403534c6d4244464ed22eee9791a432da16a19534c1929358c0f1b5de03fc86c5c3fc7f858f01f45f9a1370f52f4f8c7d06891e5069b79
7
+ data.tar.gz: 1f09cc8256cdd66eb76b827216008287b8cd9a524ab1349fe3a29b832aeeb1148f3fb3ba5da80ff0ded2abd1cea0ca3798569c8622a61e119dace401d17e97b6
@@ -88,7 +88,7 @@ Cassie provides 3 base classes for these 3 kinds of queries. Subclass `Cassie::D
88
88
  * `result` attribute, populated by execution
89
89
  * instrumentation and logging of execution
90
90
 
91
- Typical use of a `Definition` subclass would be for a static DDL query. Override the `statement` method, returning a CQL statement (`String` or `Cassandra::Statements`) that will be executed with the `Cassandra` driver.
91
+ A typical use of a `Definition` subclass would be for a static DDL query. Override the `statement` method, returning a CQL statement (`String` or `Cassandra::Statements`) that will be executed with the `Cassandra` driver.
92
92
 
93
93
  ##### `Cassie::Modification`
94
94
  Includes core functionality for prepared statement execution.
@@ -280,9 +280,11 @@ set :id, term: "now()"
280
280
  ```
281
281
 
282
282
  ```ruby
283
- insert_into :posts
283
+ update :post_counts
284
+
285
+ set :comments_count, "comments_count + 1"
284
286
 
285
- set :published_at, "toTimestamp(now())"
287
+ non_idempotent
286
288
  ```
287
289
 
288
290
  A value will be fetched and placed as an argument in the statement if the provided term includes a positional marker ('?').
@@ -351,80 +353,6 @@ Arbitrary strings are supported as well in case the DSL gets in the way.
351
353
  #=> SELECT cowboy, coder FROM posts_by_author;
352
354
  ```
353
355
 
354
- #### Consistency configuration
355
-
356
- The [consistency level](http://datastax.github.io/ruby-driver/v2.1.6/api/cassandra/#consistencies-constant) for a query is determined by your `Cassie::configuration` by default, falling to back to the `Cassandra` default if none is given.
357
-
358
- ```ruby
359
- Cassie.configuration[:consistency]
360
- #=> nil
361
-
362
- Cassie.cluster.instance_variable_get(:@execution_options).consistency
363
- #=> :one
364
- ```
365
-
366
- Cassie queries allow for a consistency level to be defined on the object, subclass, base class, and global levels. If none is found, it will default to the `cluster` default when the query is executed.
367
-
368
- Object writer:
369
- ```ruby
370
- query = MyQuery.new
371
- query.consistency = :all
372
- query.execute
373
- ```
374
- Override Object reader:
375
- ```ruby
376
- select_from :posts_by_author_category
377
-
378
- where :author_id, :eq
379
- where :category, :eq, if: :filter_by_category?
380
-
381
- def filter_by_category?
382
- #true or false, as makes sense for your query
383
- end
384
-
385
- def consistency
386
- #dynamically determine a query object's consistency level
387
- if filter_by_category?
388
- :quorum
389
- else
390
- super
391
- end
392
- end
393
- ```
394
-
395
- Class writer
396
- ```ruby
397
- select_from :posts_by_author_category
398
-
399
- where :author_id, :eq
400
- where :category, :eq
401
-
402
- consistency :quorum
403
- ```
404
-
405
- Cassie query classes
406
- ```ruby
407
- # lib/tasks/interesting_task.rake
408
- require_relative "interesting_worker"
409
-
410
- task :interesting_task do
411
- Cassie::Modification.consistency = :all
412
-
413
- InterestingWorker.new.perform
414
- end
415
- ```
416
-
417
- Cassie global default
418
- ```ruby
419
- # lib/tasks/interesting_task.rake
420
- require_relative "interesting_worker"
421
-
422
- task :interesting_task do
423
- Cassie::Statements.default_consistency = :all
424
-
425
- InterestingWorker.new.perform
426
- end
427
- ```
428
356
 
429
357
  #### Execution and Result
430
358
 
@@ -698,6 +626,123 @@ By default, this works for ascending and descending orderings when paging in the
698
626
 
699
627
  Custom policies can be defined by setting `Query.partition_linker` for more complex schemas. See the `SimplePolicy` source for an example.
700
628
 
629
+ #### Consistency configuration
630
+
631
+ The [consistency level](http://datastax.github.io/ruby-driver/api/cassandra/#consistencies-constant) for a query is determined by your `Cassie::configuration` by default, falling to back to the `Cassandra` default if none is given.
632
+
633
+ ```ruby
634
+ Cassie.configuration[:consistency]
635
+ #=> nil
636
+
637
+ Cassie.cluster.instance_variable_get(:@execution_options).consistency
638
+ #=> :one
639
+ ```
640
+
641
+ Cassie queries allow for a consistency level to be defined on the object, subclass, base class, and global levels. If none is found, it will default to the `cluster` default when the query is executed.
642
+
643
+ Object writer:
644
+ ```ruby
645
+ query = MyQuery.new
646
+ query.consistency = :all
647
+ query.execute
648
+ ```
649
+ Override Object reader:
650
+ ```ruby
651
+ select_from :posts_by_author_category
652
+
653
+ where :author_id, :eq
654
+ where :category, :eq, if: :filter_by_category?
655
+
656
+ def filter_by_category?
657
+ #true or false, as makes sense for your query
658
+ end
659
+
660
+ def consistency
661
+ #dynamically determine a query object's consistency level
662
+ if filter_by_category?
663
+ :quorum
664
+ else
665
+ super
666
+ end
667
+ end
668
+ ```
669
+
670
+ Class writer
671
+ ```ruby
672
+ select_from :posts_by_author_category
673
+
674
+ where :author_id, :eq
675
+ where :category, :eq
676
+
677
+ consistency :quorum
678
+ ```
679
+
680
+ Cassie query classes
681
+ ```ruby
682
+ # lib/tasks/interesting_task.rake
683
+ require_relative "interesting_worker"
684
+
685
+ task :interesting_task do
686
+ Cassie::Modification.consistency = :all
687
+
688
+ InterestingWorker.new.perform
689
+ end
690
+ ```
691
+
692
+ Cassie global default
693
+ ```ruby
694
+ # lib/tasks/interesting_task.rake
695
+ require_relative "interesting_worker"
696
+
697
+ task :interesting_task do
698
+ Cassie::Statements.default_consistency = :all
699
+
700
+ InterestingWorker.new.perform
701
+ end
702
+ ```
703
+
704
+ #### Idempotentcy configuration
705
+
706
+ Cassie statements are set as [idempotent](http://datastax.github.io/ruby-driver/api/cassandra/statements/simple/) by default. This setting influences how [retries](http://datastax.github.io/ruby-driver/features/retry_policies/) are handled.
707
+
708
+ Mark queries that are not idempotent, so that the driver won't automatically retry for certain failure scenarios.
709
+
710
+ Similar to other settings, there is a `Cassie::Statements.default_idempotency`, class level setting, and object level setting.
711
+
712
+ ```ruby
713
+ class MyQuery < Cassie::Modification
714
+ update :counter_table
715
+
716
+ set :counter, term: :counter_val
717
+
718
+ def counter_val
719
+ "counter + 1"
720
+ end
721
+ end
722
+ ```
723
+ ```
724
+ MyQuery.idempotent?
725
+ # => true
726
+ ```
727
+
728
+ ```ruby
729
+ class MyQuery < Cassie::Modification
730
+ update :counter_table
731
+
732
+ set :counter, term: :counter_val
733
+
734
+ non_idempotent
735
+
736
+ def counter_val
737
+ "counter + 1"
738
+ end
739
+ end
740
+ ```
741
+ ```
742
+ MyQuery.idempotent?
743
+ # => false
744
+ ```
745
+
701
746
  #### Prepared statements
702
747
 
703
748
  A `Cassie::Query` will use prepared statements by default, cacheing prepared statements across all `Query`, `Modification`, and `Definition` objects, keyed by the unbound CQL string.
@@ -728,6 +773,26 @@ set_1 = query.fetch([1, 2, 3])
728
773
  set_2 = query.fetch([7, 8, 9, 10, 11, 12])
729
774
  ```
730
775
 
776
+ #### Custom queries
777
+
778
+ For certain queries, it may be more effective to write your own CQL. The recommended way is to override `cql` and `params`.
779
+
780
+ ```ruby
781
+ class MySpecialQuery < Cassandra::Modification
782
+ map_from :resource
783
+
784
+ def cql
785
+ "UPDATE my_table SET udt.field = ? WHERE id = ?;"
786
+ end
787
+
788
+ def params
789
+ [field, id]
790
+ end
791
+ end
792
+ ```
793
+
794
+ This will preserve using other features such as consistency, idempotency, prepared statements, etc.
795
+
731
796
  #### Non-positional (unbound) statements
732
797
 
733
798
  Cassie Query features are built around using bound statements with positional arguments. However, overriding `#statement`, returning something that a `Cassandra::Session` can execute, will result in an unbound, unprepared statement.
@@ -48,16 +48,16 @@ module Cassie::Statements
48
48
  statement.to_s
49
49
  end
50
50
  end
51
-
51
+
52
52
  def logger
53
53
  Cassie::Statements.logger
54
54
  end
55
-
55
+
56
56
  def cql
57
57
  return @cql if defined?(@cql)
58
58
  ""
59
59
  end
60
-
60
+
61
61
  def params
62
62
  return @params if defined?(@params)
63
63
  nil
@@ -69,6 +69,7 @@ module Cassie::Statements
69
69
  if self.class.type
70
70
  send "build_#{self.class.type}_cql_and_params"
71
71
  end
72
+
72
73
  [cql, params]
73
74
  end
74
75
 
@@ -1,7 +1,7 @@
1
1
  module Cassie::Statements
2
2
  def self.default_idempotency
3
3
  return @default_idempotency if defined?(@default_idempotency)
4
- false
4
+ true
5
5
  end
6
6
 
7
7
  def self.default_idempotency=(val)
@@ -34,7 +34,11 @@ module Cassie::Statements
34
34
  self.idempotent = val
35
35
  end
36
36
  end
37
-
37
+
38
+ def non_idempotent
39
+ self.idempotent = false
40
+ end
41
+
38
42
  def idempotent?
39
43
  !!idempotent
40
44
  end
@@ -44,7 +48,7 @@ module Cassie::Statements
44
48
  return @idempotent if defined?(@idempotent)
45
49
  self.class.idempotent
46
50
  end
47
-
51
+
48
52
  def idempotent?
49
53
  !!idempotent
50
54
  end
@@ -1,3 +1,3 @@
1
1
  module Cassie
2
- VERSION = "1.0.0.beta.26"
2
+ VERSION = "1.0.0.beta.27"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cassie
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.beta.26
4
+ version: 1.0.0.beta.27
5
5
  platform: ruby
6
6
  authors:
7
7
  - Evan Prothro