Class: Ashikawa::Core::Collection

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Defined in:
lib/ashikawa-core/collection.rb

Overview

A certain Collection within the Database

Direct Known Subclasses

EdgeCollection, VertexCollection

Constant Summary collapse

CONTENT_TYPES =

ArangoDB’s collections contain either only documents or only edges

{
  2 => :document,
  3 => :edge
}
CONTENT_CLASS =

Map the content types to the classes from Ashikawa

{
  document: Document,
  edge: Edge
}

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(database, raw_collection) ⇒ Collection

Create a new Collection object with a name and an optional ID

Examples:

Create a Collection object from scratch

database = Ashikawa::Core::Database.new('http://localhost:8529')
raw_collection = {
  'name' => 'example_1',
  'waitForSync' => true,
  'id' => 4588,
  'status' => 3,
  'error' => false,
  'code' => 200
}
collection = Ashikawa::Core::Collection.new(database, raw_collection)


145
146
147
148
149
# File 'lib/ashikawa-core/collection.rb', line 145

def initialize(database, raw_collection)
  @database = database
  parse_raw_collection(raw_collection)
  @content_class = CONTENT_CLASS[@content_type]
end

Instance Attribute Details

#content_type:document, :edge (readonly)

The kind of content in the collection: Documents or Edges

Examples:

database = Ashikawa::Core::Database.new('http://localhost:8529')
raw_collection = {
  'name' => 'example_1',
  'waitForSync' => true,
  'id' => 4588,
  'status' => 3,
  'error' => false,
  'code' => 200
}
collection = Ashikawa::Core::Collection.new(database, raw_collection)
collection.content_type #=> :document


124
125
126
# File 'lib/ashikawa-core/collection.rb', line 124

def content_type
  @content_type
end

#databaseDatabase (readonly)

The database the collection belongs to

Examples:

database = Ashikawa::Core::Database.new('http://localhost:8529')
raw_collection = {
  'name' => 'example_1',
  'waitForSync' => true,
  'id' => 4588,
  'status' => 3,
  'error' => false,
  'code' => 200
}
collection = Ashikawa::Core::Collection.new(database, raw_collection)
collection.database #=> #<Database: ...>


106
107
108
# File 'lib/ashikawa-core/collection.rb', line 106

def database
  @database
end

#idFixnum (readonly)

The ID of the collection. Is set by the database and unique

Examples:

Get the id of the collection

database = Ashikawa::Core::Database.new('http://localhost:8529')
raw_collection = {
  'name' => 'example_1',
  'waitForSync' => true,
  'id' => 4588,
  'status' => 3,
  'error' => false,
  'code' => 200
}
collection = Ashikawa::Core::Collection.new(database, raw_collection)
collection.id #=> 4588


69
70
71
# File 'lib/ashikawa-core/collection.rb', line 69

def id
  @id
end

#nameString

The name of the collection, must be unique

Examples:

Change the name of a collection

database = Ashikawa::Core::Database.new('http://localhost:8529')
raw_collection = {
  'name' => 'example_1',
  'waitForSync' => true,
  'id' => 4588,
  'status' => 3,
  'error' => false,
  'code' => 200
}
collection = Ashikawa::Core::Collection.new(database, raw_collection)
collection.name # => 'example_1'
collection.name = 'example_2'
collection.name # => 'example_2'


51
52
53
# File 'lib/ashikawa-core/collection.rb', line 51

def name
  @name
end

#statusStatus (readonly)

A wrapper around the status of the collection

Examples:

database = Ashikawa::Core::Database.new('http://localhost:8529')
raw_collection = {
  'name' => 'example_1',
  'waitForSync' => true,
  'id' => 4588,
  'status' => 3,
  'error' => false,
  'code' => 200
}
collection = Ashikawa::Core::Collection.new(database, raw_collection)
collection.status.loaded? #=> true
collection.status.new_born? #=> false


88
89
90
# File 'lib/ashikawa-core/collection.rb', line 88

def status
  @status
end

Instance Method Details

#[](document_key) ⇒ Object

Fetch a certain document by its key, return nil if the document does not exist

Examples:

Fetch the document with the key 12345

document = collection[12345]


367
368
369
370
371
# File 'lib/ashikawa-core/collection.rb', line 367

def [](document_key)
  fetch(document_key)
rescue DocumentNotFoundException
  nil
end

#add_index(type, options) ⇒ Object

Add an index to the collection

Examples:

Add a hash-index to the fields :name and :profession of a collection

people = database['people']
people.add_index(:hash, :on => [:name, :profession])

Add a hash-index to the field :email of a collection

user = database['user']
user.add_index(:hash, :on => :email)

Options Hash (options):

  • on (Array<Symbol>)

    fields on which to apply the index

  • unique (Boolean)

    Should the index be unique? Default is false



430
431
432
433
434
435
436
437
438
439
440
# File 'lib/ashikawa-core/collection.rb', line 430

def add_index(type, options)
  options[:on] = [options[:on]].flatten
  unique = options.fetch(:unique, false)
  response = send_request("index?collection=#{@id}", post: {
    'type' => type.to_s,
    'fields' => options.fetch(:on).map { |field| field.to_s },
    'unique' => unique
  })

  Index.new(self, response)
end

#build_content_class(data, additional_attributes = {}) ⇒ Document

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.

Builds an instance for the content class



498
499
500
# File 'lib/ashikawa-core/collection.rb', line 498

def build_content_class(data, additional_attributes = {})
  @content_class.new(@database, data, additional_attributes)
end

#create_document(attributes) ⇒ Document

Create a new document with given attributes

Examples:

Create a new document from raw data

collection.create_document(attributes)


392
393
394
395
396
# File 'lib/ashikawa-core/collection.rb', line 392

def create_document(attributes)
  raise "Can't create a document in an edge collection" if @content_type == :edge
  response = send_request_for_content(post: attributes)
  build_content_class(response, attributes)
end

#create_edge(from, to, attributes) ⇒ Edge

Deprecated.

Since we introduced the dedicated Graph module (‘gharial’) all operations regarding edges and vertices should be done through that module. Due to this please use EdgeCollection#add instead.

Create a new edge between two documents with certain attributes

Examples:

Create a new document from raw data

collection.create_edge(node_a, node_b, {'name' => 'incredible edge'})


410
411
412
413
414
415
# File 'lib/ashikawa-core/collection.rb', line 410

def create_edge(from, to, attributes)
  warn '[DEPRECATION] `create_edge` is deprecated.  Please use `EdgeCollection#add` instead.'
  raise "Can't create an edge in a document collection" if @content_type == :document
  response = send_request("edge?collection=#{@id}&from=#{from.id}&to=#{to.id}", post: attributes)
  Edge.new(@database, response, attributes)
end

#deleteString

Deletes the collection

Examples:

Delete a collection

database = Ashikawa::Core::Database.new('http://localhost:8529')
raw_collection = {
  'name' => 'example_1',
  'waitForSync' => true,
  'id' => 4588,
  'status' => 3,
  'error' => false,
  'code' => 200
}
collection = Ashikawa::Core::Collection.new(database, raw_collection)
collection.delete


283
284
285
# File 'lib/ashikawa-core/collection.rb', line 283

def delete
  send_request_for_this_collection('', delete: {})
end

#fetch(document_key) ⇒ Object

Fetch a certain document by its key

Examples:

Fetch the document with the key 12345

document = collection.fetch(12345)

Raises:



355
356
357
358
# File 'lib/ashikawa-core/collection.rb', line 355

def fetch(document_key)
  response = send_request_for_content_key(document_key)
  build_content_class(response)
end

#figureFigure

Return a Figure initialized with current data for the collection

Examples:

Get the datafile count for a collection

database = Ashikawa::Core::Database.new('http://localhost:8529')
raw_collection = {
  'name' => 'example_1',
  'waitForSync' => true,
  'id' => 4588,
  'status' => 3,
  'error' => false,
  'code' => 200
}
collection = Ashikawa::Core::Collection.new(database, raw_collection)
collection.figure.datafiles_count #=> 0


262
263
264
265
# File 'lib/ashikawa-core/collection.rb', line 262

def figure
  raw_figure = get_information_from_server(:figures, :figures)
  Figure.new(raw_figure)
end

#index(id) ⇒ Object

Get an index by ID

Examples:

Get an Index by its ID

people = database['people']
people.index(1244) #=> #<Index: id=1244...>


450
451
452
453
# File 'lib/ashikawa-core/collection.rb', line 450

def index(id)
  response = send_request("index/#{@name}/#{id}")
  Index.new(self, response)
end

#indicesArray<Index>

Get all indices

Examples:

Get all indices

people = database['people']
people.indices #=> [#<Index: id=1244...>, ...]


462
463
464
465
466
467
468
# File 'lib/ashikawa-core/collection.rb', line 462

def indices
  response = send_request("index?collection=#{@id}")

  response['indexes'].map do |raw_index|
    Index.new(self, raw_index)
  end
end

#key_optionsKeyOptions

Get information about the type of keys of this collection

Examples:

Check if this collection has autoincrementing keys

collection = Ashikawa::Core::Collection.new(database, raw_collection)
collection.key_options.type # => 'autoincrement'


222
223
224
# File 'lib/ashikawa-core/collection.rb', line 222

def key_options
  KeyOptions.new(get_information_from_server(:properties, :keyOptions))
end

#lengthFixnum

Returns the number of documents in the collection

Examples:

How many documents are in the collection?

database = Ashikawa::Core::Database.new('http://localhost:8529')
raw_collection = {
  'name' => 'example_1',
  'waitForSync' => true,
  'id' => 4588,
  'status' => 3,
  'error' => false,
  'code' => 200
}
collection = Ashikawa::Core::Collection.new(database, raw_collection)
collection.length # => 0


242
243
244
# File 'lib/ashikawa-core/collection.rb', line 242

def length
  get_information_from_server(:count, :count)
end

#loadString

Load the collection into memory

Examples:

Load a collection into memory

database = Ashikawa::Core::Database.new('http://localhost:8529')
raw_collection = {
  'name' => 'example_1',
  'waitForSync' => true,
  'id' => 4588,
  'status' => 3,
  'error' => false,
  'code' => 200
}
collection = Ashikawa::Core::Collection.new(database, raw_collection)
collection.load


303
304
305
# File 'lib/ashikawa-core/collection.rb', line 303

def load
  send_command_to_server(:load)
end

#queryQuery

Return a Query initialized with this collection

Examples:

Get all documents in this collection

people = database['people']
people.query.all #=> #<Cursor: id=1244...>


477
478
479
# File 'lib/ashikawa-core/collection.rb', line 477

def query
  Query.new(self)
end

#replace(document_key, raw_document) ⇒ Hash

Replace a document by its key

Examples:

Replace the document with the key 12345

collection.replace(12345, document)


381
382
383
# File 'lib/ashikawa-core/collection.rb', line 381

def replace(document_key, raw_document)
  send_request_for_content_key(document_key, put: raw_document)
end

#truncateString

Delete all documents from the collection

Examples:

Remove all documents from a collection

database = Ashikawa::Core::Database.new('http://localhost:8529')
raw_collection = {
  'name' => 'example_1',
  'waitForSync' => true,
  'id' => 4588,
  'status' => 3,
  'error' => false,
  'code' => 200
}
collection = Ashikawa::Core::Collection.new(database, raw_collection)
collection.truncate


343
344
345
# File 'lib/ashikawa-core/collection.rb', line 343

def truncate
  send_command_to_server(:truncate)
end

#unloadString

Load the collection into memory

Examples:

Unload a collection into memory

database = Ashikawa::Core::Database.new('http://localhost:8529')
raw_collection = {
  'name' => 'example_1',
  'waitForSync' => true,
  'id' => 4588,
  'status' => 3,
  'error' => false,
  'code' => 200
}
collection = Ashikawa::Core::Collection.new(database, raw_collection)
collection.unload


323
324
325
# File 'lib/ashikawa-core/collection.rb', line 323

def unload
  send_command_to_server(:unload)
end

#volatile?Boolean

Check if the collection is volatile

Examples:

Is the people collection volatile?

people = database['people']
people.volatile? #=> false


488
489
490
# File 'lib/ashikawa-core/collection.rb', line 488

def volatile?
  get_information_from_server(:properties, :isVolatile)
end

#wait_for_sync=(new_value) ⇒ String

Change if the document will wait until the data has been synchronised to disk

Examples:

Tell the collection to wait for file synchronization

database = Ashikawa::Core::Database.new('http://localhost:8529')
raw_collection = {
  'name' => 'example_1',
  'waitForSync' => true,
  'id' => 4588,
  'status' => 3,
  'error' => false,
  'code' => 200
}
collection = Ashikawa::Core::Collection.new(database, raw_collection)
collection.wait_for_sync = true


211
212
213
# File 'lib/ashikawa-core/collection.rb', line 211

def wait_for_sync=(new_value)
  send_information_to_server(:properties, :waitForSync, new_value)
end

#wait_for_sync?Boolean

Does the document wait until the data has been synchronised to disk?

Examples:

Does the collection wait for file synchronization?

database = Ashikawa::Core::Database.new('http://localhost:8529')
raw_collection = {
  'name' => 'example_1',
  'waitForSync' => true,
  'id' => 4588,
  'status' => 3,
  'error' => false,
  'code' => 200
}
collection = Ashikawa::Core::Collection.new(database, raw_collection)
collection.wait_for_sync? #=> false


191
192
193
# File 'lib/ashikawa-core/collection.rb', line 191

def wait_for_sync?
  get_information_from_server(:properties, :waitForSync)
end