class LooseLeaf::DocumentAttribute

Attributes

attribute[R]
document[R]

Public Class Methods

new(document, attribute) click to toggle source
# File lib/loose_leaf/document_attribute.rb, line 5
def initialize(document, attribute)
  @document = document
  @attribute = attribute

  @operations = []
end

Public Instance Methods

apply_operation(operation, client_version) click to toggle source

Based on github.com/Operational-Transformation/ot.js/blob/15d4e7/lib/server.js#L16

# File lib/loose_leaf/document_attribute.rb, line 13
def apply_operation(operation, client_version)
  Rails.logger.debug "Applying client version #{client_version}, server version: #{version}"

  unless client_version > version
    operation = transform_old_operation(operation, client_version)
  end

  store_operation(operation)

  self.value = new_text(operation)

  [version, operation]
end
clear_cache() click to toggle source
# File lib/loose_leaf/document_attribute.rb, line 41
def clear_cache
  Rails.cache.delete(value_key)
end
clear_operations_cache() click to toggle source
# File lib/loose_leaf/document_attribute.rb, line 45
def clear_operations_cache
  Rails.cache.delete(operations_key)
end
value() click to toggle source
# File lib/loose_leaf/document_attribute.rb, line 31
def value
  cached_value || document.attributes[attribute.to_s]
end
value=(value) click to toggle source
# File lib/loose_leaf/document_attribute.rb, line 35
def value=(value)
  return unless document.persisted?

  Rails.cache.write(value_key, value)
end
version() click to toggle source
# File lib/loose_leaf/document_attribute.rb, line 27
def version
  operations.length
end

Private Instance Methods

cached_value() click to toggle source
# File lib/loose_leaf/document_attribute.rb, line 55
def cached_value
  return unless document.persisted?
  Rails.cache.read(value_key)
end
new_text(operation) click to toggle source
# File lib/loose_leaf/document_attribute.rb, line 72
def new_text(operation)
  operation.apply(value || '')
end
operations() click to toggle source
# File lib/loose_leaf/document_attribute.rb, line 64
def operations
  Rails.cache.read(operations_key) || []
end
operations_key() click to toggle source
# File lib/loose_leaf/document_attribute.rb, line 60
def operations_key
  "loose_leaf-#{document.class}-#{document.id}-#{attribute}-operations"
end
store_operation(operation) click to toggle source
# File lib/loose_leaf/document_attribute.rb, line 68
def store_operation(operation)
  Rails.cache.write(operations_key, operations + [operation])
end
transform_old_operation(operation, client_version) click to toggle source
# File lib/loose_leaf/document_attribute.rb, line 76
def transform_old_operation(operation, client_version)
  server_version = version
  concurrent_operations = operations.slice(
      client_version - 1,
      server_version - client_version + 1
  )

  concurrent_operations.each do |other_operation|
    operation = OT::TextOperation.transform(operation, other_operation).first
  end

  operation
end
value_key() click to toggle source
# File lib/loose_leaf/document_attribute.rb, line 51
def value_key
  "loose_leaf-#{document.class}-#{document.id}-#{attribute}"
end