Module: Familia::Features::Relationships::CollectionOperations

Included in:
ParticipantMethods, ParticipantMethods::Builder, TargetMethods, TargetMethods::Builder
Defined in:
lib/familia/features/relationships/collection_operations.rb

Overview

Shared collection operations for Participation module Provides common methods for working with Horreum-managed DataType collections Used by both ParticipantMethods and TargetMethods to reduce duplication

Instance Method Summary collapse

Instance Method Details

#add_to_collection(collection, item, type:, score: nil, target_class: nil, collection_name: nil) ⇒ Object

Add an item to a collection, handling type-specific operations

Parameters:

  • collection (Familia::DataType)

    The collection to add to

  • item (Object)

    The item to add (must respond to identifier)

  • score (Float, nil) (defaults to: nil)

    Score for sorted sets

  • type (Symbol)

    Collection type



29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/familia/features/relationships/collection_operations.rb', line 29

def add_to_collection(collection, item, type:, score: nil, target_class: nil, collection_name: nil)
  case type
  when :sorted_set
    # Ensure score is never nil for sorted sets
    score ||= calculate_item_score(item, target_class, collection_name)
    collection.add(item, score)
  when :list
    # Lists use push/unshift operations
    collection.add(item)
  when :set
    # Sets use simple add
    collection.add(item)
  else
    raise ArgumentError, "Unknown collection type: #{type}"
  end
end

#bulk_add_to_collection(collection, items, type:, target_class: nil, collection_name: nil) ⇒ Object

Bulk add items to a collection using DataType methods

Parameters:

  • collection (Familia::DataType)

    The collection to add to

  • items (Array)

    Array of items to add

  • type (Symbol)

    Collection type



67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/familia/features/relationships/collection_operations.rb', line 67

def bulk_add_to_collection(collection, items, type:, target_class: nil, collection_name: nil)
  return if items.empty?

  case type
  when :sorted_set
    # Add items one by one for sorted sets to ensure proper scoring
    items.each do |item|
      score = calculate_item_score(item, target_class, collection_name)
      collection.add(item, score)
    end
  when :set, :list
    # For sets and lists, add items one by one using DataType methods
    items.each do |item|
      collection.add(item)
    end
  else
    raise ArgumentError, "Unknown collection type: #{type}"
  end
end

#ensure_collection_field(target_class, collection_name, type) ⇒ Object

Ensure a target class has the specified DataType field defined

Parameters:

  • target_class (Class)

    The class that should have the collection

  • collection_name (Symbol)

    Name of the collection field

  • type (Symbol)

    Collection type (:sorted_set, :set, :list)



18
19
20
21
22
# File 'lib/familia/features/relationships/collection_operations.rb', line 18

def ensure_collection_field(target_class, collection_name, type)
  return if target_class.method_defined?(collection_name)

  target_class.send(type, collection_name)
end

#member_of_collection?(collection, item) ⇒ Boolean

Check if an item is a member of a collection

Parameters:

  • collection (Familia::DataType)

    The collection to check

  • item (Object)

    The item to check (must respond to identifier)

Returns:

  • (Boolean)

    True if item is in collection



59
60
61
# File 'lib/familia/features/relationships/collection_operations.rb', line 59

def member_of_collection?(collection, item)
  collection.member?(item)
end

#remove_from_collection(collection, item, type: nil) ⇒ Object

Remove an item from a collection

Parameters:

  • collection (Familia::DataType)

    The collection to remove from

  • item (Object)

    The item to remove (must respond to identifier)

  • type (Symbol) (defaults to: nil)

    Collection type



50
51
52
53
# File 'lib/familia/features/relationships/collection_operations.rb', line 50

def remove_from_collection(collection, item, type: nil)
  # All collection types support remove/delete
  collection.remove(item)
end