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.

Parameters:

  • table_name (Symbol)

    column family for this data set

  • keyspace (Keyspace)

    keyspace this data set’s table lives in

See Also:

Since:

  • 1.0.0



61
62
63
64
65
# File 'lib/cequel/metal/data_set.rb', line 61

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

#keyspaceKeyspace (readonly)

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

Returns:

  • (Keyspace)

    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.

Returns:

  • (Symbol)

    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

#row_limitInteger

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

Returns:

  • (Integer)

    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.

Returns:

  • (Array<RowSpecification>)

    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.

Returns:

  • (Array<Symbol>)

    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.

Returns:

  • (Hash<Symbol,Symbol>)

    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.

Returns:

  • (Symbol)

    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.

Returns:

  • (Array<Symbol>)

    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.

Returns:

  • (Array<Symbol>)

    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

Returns:

  • (Boolean)

Since:

  • 1.0.0



638
639
640
# File 'lib/cequel/metal/data_set.rb', line 638

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

#consistency(consistency) ⇒ DataSet

Change the consistency for queries performed by this data set

Parameters:

  • consistency (Symbol)

    a consistency level

Returns:

  • (DataSet)

    new data set tuned to the given consistency

See Also:

Since:

  • 1.1.0



562
563
564
565
566
# File 'lib/cequel/metal/data_set.rb', line 562

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

#countFixnum

Returns the number of rows in this data set.

Returns:

  • (Fixnum)

    the number of rows in this data set

Since:

  • 1.0.0



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

def count
  execute_cql(*count_cql).first['count']
end

#count_cqlString

Returns CQL statement to get count of rows in this data set.

Returns:

  • (String)

    CQL statement to get count of rows in this data set

Since:

  • 1.0.0



620
621
622
623
624
625
# File 'lib/cequel/metal/data_set.rb', line 620

def count_cql
  Statement.new
    .append("SELECT COUNT(*) FROM #{table_name}")
    .append(*row_specifications_cql)
    .append(limit_cql).args
end

#cqlString

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

Returns:

  • (String)

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

Since:

  • 1.0.0



607
608
609
610
611
612
613
614
615
# File 'lib/cequel/metal/data_set.rb', line 607

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

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

This method returns an undefined value.

Decrement one or more counter columns

Parameters:

  • deltas (Hash<Symbol,Integer>)

    map of counter column names to amount by which to decrement each column

See Also:

Since:

  • 0.5.0



172
173
174
# File 'lib/cequel/metal/data_set.rb', line 172

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

    Parameters:

    • options (Options) (defaults to: {})

      options for persistence

  • #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)

    Parameters:

    • columns (Symbol)

      columns to remove

    • options (Options) (defaults to: {})

      options for persistence

  • #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

    Parameters:

    • options (Options) (defaults to: {})

      options for persistence

    Yields:

    • DSL context for construction delete statement

    See Also:

See Also:

Since:

  • 1.0.0



424
425
426
427
428
429
430
431
432
433
# File 'lib/cequel/metal/data_set.rb', line 424

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:

  • #eachEnumerator

    Returns enumerator for rows, if no block given.

    Returns:

    • (Enumerator)

      enumerator for rows, if no block given

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

    This method returns an undefined value.

    Yields:

    • (Hash)

      result rows

Returns:

  • (Enumerator, void)

Since:

  • 1.0.0



583
584
585
586
587
# File 'lib/cequel/metal/data_set.rb', line 583

def each
  return enum_for(:each) unless block_given?
  result = execute_cql(*cql)
  result.each { |row| yield Row.from_result_row(row) }
end

#firstHash

Returns the first row in this data set.

Returns:

  • (Hash)

    the first row in this data set

Since:

  • 1.0.0



592
593
594
595
# File 'lib/cequel/metal/data_set.rb', line 592

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)

Parameters:

  • deltas (Hash<Symbol,Integer>)

    map of counter column names to amount by which to increment each column

See Also:

Since:

  • 0.5.0



155
156
157
# File 'lib/cequel/metal/data_set.rb', line 155

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.

Parameters:

  • data (Hash)

    column-value pairs

  • options (Options) (defaults to: {})

    options for persisting the row

See Also:

Since:

  • 1.0.0



83
84
85
# File 'lib/cequel/metal/data_set.rb', line 83

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

#inspectString

Returns:

  • (String)

Since:

  • 1.0.0



630
631
632
633
# File 'lib/cequel/metal/data_set.rb', line 630

def inspect
  "#<#{self.class.name}: " \
    "#{Keyspace.sanitize(cql.first, cql.drop(1))}>"
end

#limit(limit) ⇒ DataSet

Limit the number of rows returned by this data set

Parameters:

  • limit (Integer)

    maximum number of rows to return

Returns:

  • (DataSet)

    new data set scoped with given limit

Since:

  • 1.0.0



532
533
534
# File 'lib/cequel/metal/data_set.rb', line 532

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'])

Parameters:

  • column (Symbol)

    name of list column to append to

  • elements (Object, Array)

    one element or an array of elements to append

  • options (Options) (defaults to: {})

    options for persisting the column data

See Also:

Since:

  • 1.0.0



220
221
222
# File 'lib/cequel/metal/data_set.rb', line 220

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

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

Note:

If multiple elements are passed, they will appear in the list in reverse order.

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'])

Parameters:

  • column (Symbol)

    name of list column to prepend to

  • elements (Object, Array)

    one element or an array of elements to prepend

  • options (Options) (defaults to: {})

    options for persisting the column data

See Also:

Since:

  • 1.0.0



197
198
199
# File 'lib/cequel/metal/data_set.rb', line 197

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')

Parameters:

  • column (Symbol)

    name of list column

  • value (Object)

    value to remove

  • options (Options) (defaults to: {})

    options for persisting the data

See Also:

Since:

  • 1.0.0



264
265
266
# File 'lib/cequel/metal/data_set.rb', line 264

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)

Parameters:

  • column (Symbol)

    name of list column

  • positions (Integer)

    position(s) in list to remove value from

  • options (Options) (defaults to: {})

    options for persisting the data

See Also:

Since:

  • 1.0.0

Since:

  • 1.0.0



287
288
289
290
# File 'lib/cequel/metal/data_set.rb', line 287

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')

Parameters:

  • column (Symbol)

    name of list column

  • index (Integer)

    which element to replace

  • value (Object)

    new value at this index

  • options (Options) (defaults to: {})

    options for persisting the data

See Also:

Since:

  • 1.0.0



242
243
244
# File 'lib/cequel/metal/data_set.rb', line 242

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')

Parameters:

  • column (Symbol)

    name of map column

  • keys (Object)

    map key to remove

  • options (Options) (defaults to: {})

    options for persisting the data

See Also:

Since:

  • 1.0.0

Since:

  • 1.0.0



310
311
312
313
# File 'lib/cequel/metal/data_set.rb', line 310

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)

Parameters:

  • column (Symbol)

    name of set column

  • updates (Hash)

    map of map keys to new values

  • options (Options) (defaults to: {})

    options for persisting the data

See Also:

Since:

  • 1.0.0



374
375
376
# File 'lib/cequel/metal/data_set.rb', line 374

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

#order(pairs) ⇒ DataSet

Note:

The only valid ordering column is the first clustering column

Control how the result rows are sorted

Parameters:

  • pairs (Hash)

    Map of column name to sort direction

Returns:

  • (DataSet)

    new data set with the specified ordering

Since:

  • 1.0.0



545
546
547
548
549
# File 'lib/cequel/metal/data_set.rb', line 545

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

#row_specifications_cqlObject

Since:

  • 1.0.0



643
644
645
646
647
648
649
650
651
652
653
654
# File 'lib/cequel/metal/data_set.rb', line 643

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.

Parameters:

  • columns (Symbol)

    columns columns to select

Returns:

  • (DataSet)

    new data set scoped to specified columns

Since:

  • 1.0.0



441
442
443
444
445
# File 'lib/cequel/metal/data_set.rb', line 441

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.

Parameters:

  • columns (Symbol, Array)

    columns to select

Returns:

  • (DataSet)

    new data set scoped to specified columns

Since:

  • 1.0.0



482
483
484
485
486
# File 'lib/cequel/metal/data_set.rb', line 482

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.

Parameters:

  • columns (Symbol)

    columns to select

Returns:

  • (DataSet)

    new data set scoped to specified columns

Since:

  • 1.0.0



455
456
457
458
459
# File 'lib/cequel/metal/data_set.rb', line 455

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

Parameters:

  • columns (Symbol)

    columns to select

Returns:

  • (DataSet)

    new data set scoped to specified columns

Since:

  • 1.0.0



469
470
471
472
473
# File 'lib/cequel/metal/data_set.rb', line 469

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')

Parameters:

  • column (Symbol)

    name of set column

  • values (Object, Set)

    value or values to add

  • options (Options) (defaults to: {})

    options for persisting the data

See Also:

Since:

  • 1.0.0



332
333
334
# File 'lib/cequel/metal/data_set.rb', line 332

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')

Parameters:

  • column (Symbol)

    name of set column

  • value (Object)

    value to remove

  • options (Options) (defaults to: {})

    options for persisting the data

See Also:

Since:

  • 1.0.0



353
354
355
# File 'lib/cequel/metal/data_set.rb', line 353

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')

    Parameters:

    • column_values (Hash)

      map of column names to new values

    • options (Options) (defaults to: {})

      options for persisting the column data

  • #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

    Parameters:

    • options (Options) (defaults to: {})

      options for persisting the data

    Yields:

    • DSL context for adding write operations

    See Also:

    Since:

    • 1.0.0

See Also:

Since:

  • 1.0.0



128
129
130
131
132
133
134
135
# File 'lib/cequel/metal/data_set.rb', line 128

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')

    Parameters:

    • column_values (Hash)

      Map of column name to values to match

  • #where(cql, *bind_vars) ⇒ DataSet

    Examples:

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

    Parameters:

    • cql (String)

      CQL fragment representing ‘WHERE` statement

    • bind_vars (Object)

      Bind variables for the CQL fragment

Returns:

  • (DataSet)

    New data set scoped to the row specification

Since:

  • 1.0.0



506
507
508
509
510
511
# File 'lib/cequel/metal/data_set.rb', line 506

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

Returns:

  • (DataSet)

    New data set with only row specifications given

See Also:

Since:

  • 1.0.0



519
520
521
522
523
524
# File 'lib/cequel/metal/data_set.rb', line 519

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