class SPARQL::Algebra::Operator::Copy

The SPARQL UPDATE `copy` operator.

The COPY operation is a shortcut for inserting all data from an input graph into a destination graph. Data from the input graph is not affected, but data from the destination graph, if any, is removed before insertion.

@example

(copy silent <iri> to default)

@see www.w3.org/TR/sparql11-update/#copy

Constants

NAME

Public Instance Methods

execute(queryable, **options) click to toggle source

Executes this upate on the given `writable` graph or repository.

@param [RDF::Queryable] queryable

the graph or repository to write

@param [Hash{Symbol => Object}] options

any additional keyword options

@option options [Boolean] debug

Query execution debugging

@return [RDF::Queryable]

Returns queryable.

@raise [IOError]

If `from` does not exist, unless the `silent` operator is present

@see www.w3.org/TR/sparql11-update/

# File lib/sparql/algebra/operator/copy.rb, line 32
def execute(queryable, **options)
  debug(options) {"Copy"}
  silent = operands.first == :silent
  operands.shift if silent

  src_name, dest_name = operands[-2..-1]
  raise ArgumentError, "copy expected two operands, got #{operands.length}" unless operands.length == 2
  raise ArgumentError, "copy from must be IRI or :default" unless src_name == :default || src_name.is_a?(RDF::URI)
  raise ArgumentError, "copy to must be IRI or :default" unless dest_name == :default || dest_name.is_a?(RDF::URI)
  src = queryable.enum_graph.detect {|g| g.to_s == src_name.to_s}

  if src.nil?
    raise IOError, "copy operation source does not exist" unless silent
  elsif dest_name == src_name
    # No operation
  else
    dest = queryable.enum_graph.detect {|g| g.to_s == dest_name.to_s}
    
    # Clear destination first
    dest.clear! if dest

    # Copy statements using destination graph_name
    src.each do |statement|
      statement = statement.dup
      statement.graph_name = (dest_name unless dest_name == :default)
      queryable << statement
    end
  end
  queryable
end