Class: Cequel::Metal::DataSet

Inherits:
Object
  • Object
show all
Extended by:
Util::Forwardable
Includes:
Enumerable
Defined in:
lib/cequel/metal/data_set.rb

Overview

Encapsulates a data set, specified as a table and optionally various query elements.

Examples:

Data set representing entire contents of a table

data_set = database[:posts]

Data set limiting rows returned

data_set = database[:posts].limit(10)

Data set targeting only one partition

data_set = database[:posts].where(blog_subdomain: 'cassandra')

See Also:

Since:

  • 1.0.0

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Util::Forwardable

delegate

Constructor Details

#initialize(table_name, keyspace) ⇒ DataSet

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns a new instance of DataSet.

See Also:

Since:

  • 1.0.0



64
65
66
67
68
# File 'lib/cequel/metal/data_set.rb', line 64

def initialize(table_name, keyspace)
  @table_name, @keyspace = table_name, keyspace
  @select_columns, @ttl_columns, @writetime_columns, @row_specifications,
    @sort_order = [], [], [], [], {}
end

Instance Attribute Details

#allow_filteringObject

Since:

  • 1.0.0



53
54
55
# File 'lib/cequel/metal/data_set.rb', line 53

def allow_filtering
  @allow_filtering
end

#keyspaceKeyspace (readonly)

Returns keyspace that this data set’s table resides in.

Since:

  • 1.0.0



27
28
29
# File 'lib/cequel/metal/data_set.rb', line 27

def keyspace
  @keyspace
end

#query_consistencySymbol

Returns what consistency level queries from this data set will use.

Since:

  • 1.1.0



50
51
52
# File 'lib/cequel/metal/data_set.rb', line 50

def query_consistency
  @query_consistency
end

#query_page_sizeObject

Since:

  • 1.0.0



51
52
53
# File 'lib/cequel/metal/data_set.rb', line 51

def query_page_size
  @query_page_size
end

#query_paging_stateObject

Since:

  • 1.0.0



52
53
54
# File 'lib/cequel/metal/data_set.rb', line 52

def query_paging_state
  @query_paging_state
end

#row_limitInteger

Returns maximum number of rows to return, ‘nil` if no limit.

Since:

  • 1.0.0



46
47
48
# File 'lib/cequel/metal/data_set.rb', line 46

def row_limit
  @row_limit
end

#row_specificationsArray<RowSpecification> (readonly)

Returns row specifications limiting the result rows returned by this data set.

Since:

  • 1.0.0



42
43
44
# File 'lib/cequel/metal/data_set.rb', line 42

def row_specifications
  @row_specifications
end

#select_columnsArray<Symbol> (readonly)

Returns columns that this data set restricts result rows to; empty if none.

Since:

  • 1.0.0



33
34
35
# File 'lib/cequel/metal/data_set.rb', line 33

def select_columns
  @select_columns
end

#sort_orderHash<Symbol,Symbol> (readonly)

Returns map of column names to sort directions.

Since:

  • 1.0.0



44
45
46
# File 'lib/cequel/metal/data_set.rb', line 44

def sort_order
  @sort_order
end

#table_nameSymbol (readonly)

Returns name of the table that this data set retrieves data from.

Since:

  • 1.0.0



30
31
32
# File 'lib/cequel/metal/data_set.rb', line 30

def table_name
  @table_name
end

#ttl_columnsArray<Symbol> (readonly)

Returns columns that this data set will select the TTLs of.

Since:

  • 1.0.0



36
37
38
# File 'lib/cequel/metal/data_set.rb', line 36

def ttl_columns
  @ttl_columns
end

#writetime_columnsArray<Symbol> (readonly)

Returns columns that this data set will select the writetimes of.

Since:

  • 1.0.0



39
40
41
# File 'lib/cequel/metal/data_set.rb', line 39

def writetime_columns
  @writetime_columns
end

Instance Method Details

#==(other) ⇒ Boolean

Since:

  • 1.0.0



671
672
673
# File 'lib/cequel/metal/data_set.rb', line 671

def ==(other)
  cql == other.cql
end

#allow_filtering!Object

See Also:

  • RecordSet#allow_filtering!

Since:

  • 1.0.0



580
581
582
583
584
# File 'lib/cequel/metal/data_set.rb', line 580

def allow_filtering!
  clone.tap do |data_set|
    data_set.allow_filtering = true
  end
end

#allow_filtering_cqlObject

Since:

  • 1.0.0



690
691
692
693
694
695
# File 'lib/cequel/metal/data_set.rb', line 690

def allow_filtering_cql
  if allow_filtering
    ' ALLOW FILTERING'
  else ''
  end
end

#consistency(consistency) ⇒ DataSet

Change the consistency for queries performed by this data set



565
566
567
568
569
# File 'lib/cequel/metal/data_set.rb', line 565

def consistency(consistency)
  clone.tap do |data_set|
    data_set.query_consistency = consistency
  end
end

#countObject Also known as: length, size

Raises:

  • (DangerousQueryError)

    to prevent loading the entire record set to be counted

Since:

  • 1.0.0



642
643
644
# File 'lib/cequel/metal/data_set.rb', line 642

def count
  raise Cequel::Record::DangerousQueryError.new
end

#cqlStatement

Returns CQL ‘SELECT` statement encoding this data set’s scope.

Since:

  • 1.0.0



651
652
653
654
655
656
657
658
659
# File 'lib/cequel/metal/data_set.rb', line 651

def cql
  statement = Statement.new
    .append(select_cql)
    .append(" FROM #{table_name}")
    .append(*row_specifications_cql)
    .append(sort_order_cql)
    .append(limit_cql)
    .append(allow_filtering_cql)
end

#decrement(deltas, options = {}) ⇒ void Also known as: decr

This method returns an undefined value.

Decrement one or more counter columns



175
176
177
# File 'lib/cequel/metal/data_set.rb', line 175

def decrement(deltas, options = {})
  incrementer { decrement(deltas) }.execute(options)
end

#delete(options = {}) ⇒ void #delete(*columns, options = {}) ⇒ void #delete(options = {}) { ... } ⇒ void

Note:

If enclosed in a Keyspace#batch block, this method will be executed as part of the batch.

This method returns an undefined value.

Overloads:

  • #delete(options = {}) ⇒ void

    Delete one or more rows from the table

    Examples:

    posts.where(blog_subdomain: 'cassandra', permalink: 'cequel').
      delete
    
  • #delete(*columns, options = {}) ⇒ void

    Delete data from given columns in the specified rows. This is equivalent to setting columns to ‘NULL` in an SQL database.

    Examples:

    posts.where(blog_subdomain: 'cassandra', permalink: 'cequel').
      delete(:body)
    
  • #delete(options = {}) { ... } ⇒ void

    Construct a ‘DELETE` statement with multiple operations (column deletions, collection element removals, etc.)

    Examples:

    posts.where(blog_subdomain: 'bigdata', permalink: 'cql').delete do
      delete_columns :body
      list_remove_at :categories, 2
    end
    

    Yields:

    • DSL context for construction delete statement

    See Also:

See Also:

Since:

  • 1.0.0



427
428
429
430
431
432
433
434
435
436
# File 'lib/cequel/metal/data_set.rb', line 427

def delete(*columns, &block)
  options = columns.extract_options!
  if block
    deleter(&block).execute(options)
  elsif columns.empty?
    deleter { delete_row }.execute(options)
  else
    deleter { delete_columns(*columns) }.execute(options)
  end
end

#eachEnumerator #each {|Hash| ... } ⇒ void

Enumerate over rows in this data set. Along with #each, all other Enumerable methods are implemented.

Overloads:

  • #each {|Hash| ... } ⇒ void

    This method returns an undefined value.

    Yields:

    • (Hash)

      result rows

Since:

  • 1.0.0



627
628
629
630
# File 'lib/cequel/metal/data_set.rb', line 627

def each
  return enum_for(:each) unless block_given?
  results.each { |row| yield Row.from_result_row(row) }
end

#firstHash

Returns the first row in this data set.

Since:

  • 1.0.0



635
636
637
638
# File 'lib/cequel/metal/data_set.rb', line 635

def first
  row = execute_cql(*limit(1).cql).first
  Row.from_result_row(row)
end

#increment(deltas, options = {}) ⇒ void Also known as: incr

Note:

This can only be used on counter tables

This method returns an undefined value.

Increment one or more counter columns

Examples:

post_analytics.
  where(blog_subdomain: 'cassandra', permalink: 'cequel').
  increment(pageviews: 10, tweets: 2)

See Also:

Since:

  • 0.5.0



158
159
160
# File 'lib/cequel/metal/data_set.rb', line 158

def increment(deltas, options = {})
  incrementer { increment(deltas) }.execute(options)
end

#insert(data, options = {}) ⇒ void

Note:

‘INSERT` statements will succeed even if a row at the specified primary key already exists. In this case, column values specified in the insert will overwrite the existing row.

Note:

If a enclosed in a Keyspace#batch block, this method will be executed as part of the batch.

This method returns an undefined value.

Insert a row into the column family.

See Also:

Since:

  • 1.0.0



86
87
88
# File 'lib/cequel/metal/data_set.rb', line 86

def insert(data, options = {})
  inserter { insert(data) }.execute(options)
end

#inspectString

Since:

  • 1.0.0



664
665
666
# File 'lib/cequel/metal/data_set.rb', line 664

def inspect
  "#<#{self.class.name}: #{cql.inspect}>"
end

#last_page?Boolean

Returns whether no more pages are available



608
609
610
# File 'lib/cequel/metal/data_set.rb', line 608

def last_page?
  results.last_page?
end

#limit(limit) ⇒ DataSet

Limit the number of rows returned by this data set

Since:

  • 1.0.0



535
536
537
# File 'lib/cequel/metal/data_set.rb', line 535

def limit(limit)
  clone.tap { |data_set| data_set.row_limit = limit }
end

#list_append(column, elements, options = {}) ⇒ void

Note:

If a enclosed in a Keyspace#batch block, this method will be executed as part of the batch.

This method returns an undefined value.

Append element(s) to a list in the row(s) matched by this data set.

Examples:

posts.list_append(:categories, ['CQL', 'ORMs'])

See Also:

Since:

  • 1.0.0



223
224
225
# File 'lib/cequel/metal/data_set.rb', line 223

def list_append(column, elements, options = {})
  updater { list_append(column, elements) }.execute(options)
end

#list_prepend(column, elements, options = {}) ⇒ void

Note:

A bug (CASSANDRA-8733) exists in Cassandra versions 0.3.0-2.0.12 and 2.1.0-2.1.2 which will make elements appear in REVERSE ORDER in the list.

Note:

If a enclosed in a Keyspace#batch block, this method will be executed as part of the batch.

This method returns an undefined value.

Prepend element(s) to a list in the row(s) matched by this data set.

Examples:

posts.list_prepend(:categories, ['CQL', 'ORMs'])

See Also:

Since:

  • 1.0.0



200
201
202
# File 'lib/cequel/metal/data_set.rb', line 200

def list_prepend(column, elements, options = {})
  updater { list_prepend(column, elements) }.execute(options)
end

#list_remove(column, value, options = {}) ⇒ void

Note:

If enclosed in a Keyspace#batch block, this method will be executed as part of the batch.

This method returns an undefined value.

Remove all occurrences of a given value from a list column

Examples:

posts.list_remove(:categories, 'CQL3')

See Also:

Since:

  • 1.0.0



267
268
269
# File 'lib/cequel/metal/data_set.rb', line 267

def list_remove(column, value, options = {})
  updater { list_remove(column, value) }.execute(options)
end

#list_remove_at(column, *positions, options = {}) ⇒ void

Note:

If enclosed in a Keyspace#batch block, this method will be executed as part of the batch.

This method returns an undefined value.

Remove the value from a given position or positions in a list column

Examples:

posts.list_remove_at(:categories, 2)

See Also:

Since:

  • 1.0.0

Since:

  • 1.0.0



290
291
292
293
# File 'lib/cequel/metal/data_set.rb', line 290

def list_remove_at(column, *positions)
  options = positions.extract_options!
  deleter { list_remove_at(column, *positions) }.execute(options)
end

#list_replace(column, index, value, options = {}) ⇒ void

Note:

if a enclosed in a Keyspace#batch block, this method will be executed as part of the batch.

This method returns an undefined value.

Replace a list element at a specified index with a new value

Examples:

posts.list_replace(:categories, 2, 'Object-Relational Mapper')

See Also:

Since:

  • 1.0.0



245
246
247
# File 'lib/cequel/metal/data_set.rb', line 245

def list_replace(column, index, value, options = {})
  updater { list_replace(column, index, value) }.execute(options)
end

#map_remove(column, *keys, options = {}) ⇒ void

Note:

If enclosed in a Keyspace#batch block, this method will be executed as part of the batch.

This method returns an undefined value.

Remove a given key from a map column

Examples:

posts.map_remove(:credits, 'editor')

See Also:

Since:

  • 1.0.0

Since:

  • 1.0.0



313
314
315
316
# File 'lib/cequel/metal/data_set.rb', line 313

def map_remove(column, *keys)
  options = keys.extract_options!
  deleter { map_remove(column, *keys) }.execute(options)
end

#map_update(column, updates, options = {}) ⇒ void

Note:

If enclosed in a Keyspace#batch block, this method will be executed as part of the batch.

This method returns an undefined value.

Update one or more keys in a map column

Examples:

posts.map_update(:credits, 'editor' => 34)

See Also:

Since:

  • 1.0.0



377
378
379
# File 'lib/cequel/metal/data_set.rb', line 377

def map_update(column, updates, options = {})
  updater { map_update(column, updates) }.execute(options)
end

#next_paging_stateString

Exposes current paging state for stateless pagination



599
600
601
# File 'lib/cequel/metal/data_set.rb', line 599

def next_paging_state
  results.paging_state
end

#order(pairs) ⇒ DataSet

Note:

The only valid ordering column is the first clustering column

Control how the result rows are sorted

Since:

  • 1.0.0



548
549
550
551
552
# File 'lib/cequel/metal/data_set.rb', line 548

def order(pairs)
  clone.tap do |data_set|
    data_set.sort_order.merge!(pairs.symbolize_keys)
  end
end

#page_size(page_size) ⇒ Object

Since:

  • 1.0.0



571
572
573
574
575
# File 'lib/cequel/metal/data_set.rb', line 571

def page_size(page_size)
  clone.tap do |data_set|
    data_set.query_page_size = page_size
  end
end

#paging_state(paging_state) ⇒ Object

Since:

  • 1.0.0



586
587
588
589
590
# File 'lib/cequel/metal/data_set.rb', line 586

def paging_state(paging_state)
  clone.tap do |data_set|
    data_set.query_paging_state = paging_state
  end
end

#row_specifications_cqlObject

Since:

  • 1.0.0



676
677
678
679
680
681
682
683
684
685
686
687
# File 'lib/cequel/metal/data_set.rb', line 676

def row_specifications_cql
  if row_specifications.any?
    cql_fragments, bind_vars = [], []
    row_specifications.each do |spec|
      cql_with_vars = spec.cql
      cql_fragments << cql_with_vars.shift
      bind_vars.concat(cql_with_vars)
    end
    [" WHERE #{cql_fragments.join(' AND ')}", *bind_vars]
  else ['']
  end
end

#select(*columns) ⇒ DataSet

Select specified columns from this data set.

Since:

  • 1.0.0



444
445
446
447
448
# File 'lib/cequel/metal/data_set.rb', line 444

def select(*columns)
  clone.tap do |data_set|
    data_set.select_columns.concat(columns.flatten)
  end
end

#select!(*columns) ⇒ DataSet

Select specified columns from this data set, overriding chained scope.

Since:

  • 1.0.0



485
486
487
488
489
# File 'lib/cequel/metal/data_set.rb', line 485

def select!(*columns)
  clone.tap do |data_set|
    data_set.select_columns.replace(columns.flatten)
  end
end

#select_ttl(*columns) ⇒ DataSet

Return the remaining TTL for the specified columns from this data set.

Since:

  • 1.0.0



458
459
460
461
462
# File 'lib/cequel/metal/data_set.rb', line 458

def select_ttl(*columns)
  clone.tap do |data_set|
    data_set.ttl_columns.concat(columns.flatten)
  end
end

#select_writetime(*columns) ⇒ DataSet Also known as: select_timestamp

Return the write time for the specified columns in the data set

Since:

  • 1.0.0



472
473
474
475
476
# File 'lib/cequel/metal/data_set.rb', line 472

def select_writetime(*columns)
  clone.tap do |data_set|
    data_set.writetime_columns.concat(columns.flatten)
  end
end

#set_add(column, values, options = {}) ⇒ void

Note:

If enclosed in a Keyspace#batch block, this method will be executed as part of the batch.

This method returns an undefined value.

Add one or more elements to a set column

Examples:

posts.set_add(:tags, 'cql3')

See Also:

Since:

  • 1.0.0



335
336
337
# File 'lib/cequel/metal/data_set.rb', line 335

def set_add(column, values, options = {})
  updater { set_add(column, values) }.execute(options)
end

#set_remove(column, value, options = {}) ⇒ void

Note:

If enclosed in a Keyspace#batch block, this method will be executed as part of the batch.

This method returns an undefined value.

Remove an element from a set

Examples:

posts.set_remove(:tags, 'cql3')

See Also:

Since:

  • 1.0.0



356
357
358
# File 'lib/cequel/metal/data_set.rb', line 356

def set_remove(column, value, options = {})
  updater { set_remove(column, value) }.execute(options)
end

#update(column_values, options = {}) ⇒ void #update(options = {}) { ... } ⇒ void

Note:

‘UPDATE` statements will succeed even if targeting a row that does not exist. In this case a new row will be created.

Note:

This statement will fail unless one or more rows are fully specified by primary key using ‘where`

Note:

If a enclosed in a Keyspace#batch block, this method will be executed as part of the batch.

This method returns an undefined value.

Upsert data into one or more rows

Overloads:

  • #update(column_values, options = {}) ⇒ void

    Update the rows specified in the data set with new values

    Examples:

    posts.where(blog_subdomain: 'cassandra', permalink: 'cequel').
      update(title: 'Announcing Cequel 1.0')
    
  • #update(options = {}) { ... } ⇒ void

    Construct an update statement consisting of multiple operations

    Examples:

    posts.where(blog_subdomain: 'bigdata', permalink: 'cql').update do
      set(title: 'Announcing Cequel 1.0')
      list_append(categories: 'ORMs')
    end
    

    Yields:

    • DSL context for adding write operations

    See Also:

    Since:

    • 1.0.0

See Also:

Since:

  • 1.0.0



131
132
133
134
135
136
137
138
# File 'lib/cequel/metal/data_set.rb', line 131

def update(*args, &block)
  if block
    updater(&block).execute(args.extract_options!)
  else
    data = args.shift
    updater { set(data) }.execute(args.extract_options!)
  end
end

#where(column_values) ⇒ DataSet #where(cql, *bind_vars) ⇒ DataSet

Filter this data set with a row specification

Overloads:

  • #where(column_values) ⇒ DataSet

    Examples:

    database[:posts].where(title: 'Hey')
    
  • #where(cql, *bind_vars) ⇒ DataSet

    Examples:

    DB[:posts].where('title = ?', 'Hey')
    

Since:

  • 1.0.0



509
510
511
512
513
514
# File 'lib/cequel/metal/data_set.rb', line 509

def where(row_specification, *bind_vars)
  clone.tap do |data_set|
    data_set.row_specifications
      .concat(build_row_specifications(row_specification, bind_vars))
  end
end

#where!(row_specification, *bind_vars) ⇒ DataSet

Replace existing row specifications

See Also:

Since:

  • 1.0.0



522
523
524
525
526
527
# File 'lib/cequel/metal/data_set.rb', line 522

def where!(row_specification, *bind_vars)
  clone.tap do |data_set|
    data_set.row_specifications
      .replace(build_row_specifications(row_specification, bind_vars))
  end
end