Class: FederationManager

Inherits:
Object
  • Object
show all
Defined in:
lib/active_rdf/federation/federation_manager.rb

Class Method Summary collapse

Class Method Details

.add(s, p, o) ⇒ Object

add triple s,p,o to the currently selected write-adapter



11
12
13
14
15
# File 'lib/active_rdf/federation/federation_manager.rb', line 11

def FederationManager.add(s,p,o)
  # TODO: allow addition of full graphs
  $log.debug "FederationManager: add: triple is #{s} #{p} #{o}"
  ConnectionPool.write_adapter.add(s,p,o)
end

.query(q, options = {:flatten => true}) ⇒ Object

executes read-only queries by distributing query over complete read-pool and aggregating the results



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/active_rdf/federation/federation_manager.rb', line 20

def FederationManager.query(q, options={:flatten => true})
if ConnectionPool.read_adapters.empty?
	raise ActiveRdfError, "cannot execute query without data sources" 
end

  $log.debug "FederationManager: query called with: #{q}"
  # ask each adapter for query results
  # and yield them consequtively
  if block_given?
    ConnectionPool.read_adapters.each do |source|
      source.query(q) do |*clauses|
        yield(*clauses)
      end
    end
  else
    # build Array of results from all sources
    # TODO: write test for sebastian's select problem
    # (without distinct, should get duplicates, they
    # were filtered out when doing results.union)
    results = []
    ConnectionPool.read_adapters.each do |source|
		source_results = source.query(q)
		source_results.each do |clauses|
			results << clauses
		end
	end

    # filter the empty results
    results.reject {|ary| ary.empty? }

    # remove duplicate results from multiple
    # adapters if asked for distinct query
    # (adapters return only distinct results,
    # but they cannot check duplicates against each other)
    results.uniq! if q.distinct?

    # flatten results array if only one select clause
    # to prevent unnecessarily nested array [[eyal],[renaud],...]
    results.flatten! if q.select_clauses.size == 1 or q.ask?

    # and remove array (return single value) unless asked not to
    if options[:flatten]
      case results.size
      when 0
        final_results = nil
      when 1
        final_results = results.first
      else
        final_results = results
      end
    else
      final_results = results
    end
  end
  
  $log.debug_pp("FederationManager: query results are %s", final_results)
  
  
  return final_results
end