activerdf 1.6.8 → 1.6.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +4 -0
- data/lib/active_rdf/federation/federation_manager.rb +7 -0
- data/lib/active_rdf/instance_exec.rb +13 -0
- data/lib/active_rdf/objectmanager/literal.rb +52 -35
- data/lib/active_rdf/objectmanager/resource.rb +95 -41
- data/lib/active_rdf/queryengine/ntriples_parser.rb +35 -12
- data/lib/active_rdf/queryengine/query2sparql.rb +3 -8
- data/test/objectmanager/test_literal.rb +17 -18
- data/test/objectmanager/test_object_manager.rb +26 -0
- data/test/objectmanager/test_resource_reading.rb +3 -3
- data/test/objectmanager/test_resource_writing.rb +10 -6
- data/test/queryengine/test_ntriples_parser.rb +16 -1
- data/test/queryengine/test_query2sparql.rb +12 -14
- data/test/queryengine/test_query_engine.rb +2 -2
- data/test/test_adapters.rb +12 -5
- data/test/test_person_data.nt +2 -2
- metadata +23 -24
- data/test/queryengine/test_query.rb +0 -55
- data/test/queryengine/test_query2jars2.rb +0 -51
    
        data/CHANGELOG
    CHANGED
    
    | @@ -1,3 +1,7 @@ | |
| 1 | 
            +
            == activerdf (1.6.9) Fri, 08 Feb 2008 13:36:31 +0100
         | 
| 2 | 
            +
              * automatic conversion from typed literals to Ruby internal datatypes
         | 
| 3 | 
            +
              * added Resource#to_xml (José Ignacio)
         | 
| 4 | 
            +
             | 
| 1 5 | 
             
            == activerdf (1.6.8) Thu, 01 Nov 2007 15:55:38 +0100
         | 
| 2 6 | 
             
              * no need for ObjectManager.construct_classes (done during namespace registration)
         | 
| 3 7 | 
             
              * small fix to running form source on jruby
         | 
| @@ -11,6 +11,13 @@ class FederationManager | |
| 11 11 | 
             
                ConnectionPool.write_adapter.add(s,p,o)
         | 
| 12 12 | 
             
              end
         | 
| 13 13 |  | 
| 14 | 
            +
              # delete triple s,p,o from the currently selected write adapter (s and p are 
         | 
| 15 | 
            +
              # mandatory, o is optional, symbols are interpreted as wildcards)
         | 
| 16 | 
            +
              def FederationManager.delete(s,p,o=:all)
         | 
| 17 | 
            +
                raise ActiveRdfError, "cannot write without a write-adapter" unless ConnectionPool.write_adapter
         | 
| 18 | 
            +
                ConnectionPool.write_adapter.delete(s,p,o)
         | 
| 19 | 
            +
              end
         | 
| 20 | 
            +
             | 
| 14 21 | 
             
              # executes read-only queries
         | 
| 15 22 | 
             
              # by distributing query over complete read-pool
         | 
| 16 23 | 
             
              # and aggregating the results
         | 
| @@ -0,0 +1,13 @@ | |
| 1 | 
            +
            module Kernel
         | 
| 2 | 
            +
             # Like instace_eval but allows parameters to be passed.
         | 
| 3 | 
            +
              def instance_exec(*args, &block)
         | 
| 4 | 
            +
                mname = "__instance_exec_#{Thread.current.object_id.abs}_#{object_id.abs}"
         | 
| 5 | 
            +
                Object.class_eval{ define_method(mname, &block) }
         | 
| 6 | 
            +
                begin
         | 
| 7 | 
            +
                  ret = send(mname, *args)
         | 
| 8 | 
            +
                ensure
         | 
| 9 | 
            +
                  Object.class_eval{ undef_method(mname) } rescue nil
         | 
| 10 | 
            +
                end
         | 
| 11 | 
            +
                ret
         | 
| 12 | 
            +
              end
         | 
| 13 | 
            +
            end
         | 
| @@ -1,48 +1,65 @@ | |
| 1 1 | 
             
            require 'active_rdf'
         | 
| 2 2 |  | 
| 3 | 
            -
             | 
| 4 | 
            -
            # TODO: language tags
         | 
| 5 | 
            -
            class Literal
         | 
| 3 | 
            +
            module Literal
         | 
| 6 4 | 
             
              Namespace.register :xsd, 'http://www.w3.org/2001/XMLSchema#'
         | 
| 5 | 
            +
              def xsd_type
         | 
| 6 | 
            +
                case self
         | 
| 7 | 
            +
                when String
         | 
| 8 | 
            +
                  XSD::string
         | 
| 9 | 
            +
                when Integer
         | 
| 10 | 
            +
                  XSD::integer
         | 
| 11 | 
            +
                when TrueClass, FalseClass
         | 
| 12 | 
            +
                  XSD::boolean
         | 
| 13 | 
            +
                when DateTime, Date, Time
         | 
| 14 | 
            +
                  XSD::date
         | 
| 15 | 
            +
                end
         | 
| 16 | 
            +
              end
         | 
| 7 17 |  | 
| 8 | 
            -
               | 
| 9 | 
            -
             | 
| 18 | 
            +
              def self.typed(value, type)
         | 
| 19 | 
            +
                case type
         | 
| 20 | 
            +
                when XSD::string
         | 
| 21 | 
            +
                  String.new(value)
         | 
| 22 | 
            +
                when XSD::date
         | 
| 23 | 
            +
                  DateTime.parse(value)
         | 
| 24 | 
            +
                when XSD::boolean
         | 
| 25 | 
            +
                  value == 'true' or value == 1
         | 
| 26 | 
            +
                when XSD::integer
         | 
| 27 | 
            +
                  value.to_i
         | 
| 28 | 
            +
                end
         | 
| 29 | 
            +
              end
         | 
| 10 30 |  | 
| 11 | 
            -
               | 
| 12 | 
            -
             | 
| 13 | 
            -
             | 
| 14 | 
            -
                @value = value
         | 
| 15 | 
            -
                
         | 
| 16 | 
            -
                if type_or_language.nil?
         | 
| 17 | 
            -
                  # deduce type from the given value
         | 
| 18 | 
            -
                  @type = case value
         | 
| 19 | 
            -
                           when String
         | 
| 20 | 
            -
                             XSD::string
         | 
| 21 | 
            -
                           when Date, Time, DateTime
         | 
| 22 | 
            -
                             XSD::date
         | 
| 23 | 
            -
                           when TrueClass, FalseClass
         | 
| 24 | 
            -
                             XSD::boolean
         | 
| 25 | 
            -
                           when Fixnum
         | 
| 26 | 
            -
                             XSD::integer
         | 
| 27 | 
            -
                    end
         | 
| 28 | 
            -
                elsif type_or_language[0..0] == "@"
         | 
| 29 | 
            -
                  # a language tag has been given
         | 
| 30 | 
            -
                  @language = type_or_language[1..type_or_language.length]
         | 
| 31 | 
            +
              def to_ntriple
         | 
| 32 | 
            +
                if $activerdf_without_xsdtype
         | 
| 33 | 
            +
                  "\"#{to_s}\""
         | 
| 31 34 | 
             
                else
         | 
| 32 | 
            -
                  # | 
| 33 | 
            -
             | 
| 34 | 
            -
             | 
| 35 | 
            +
                  "\"#{to_s}\"^^#{xsd_type}"
         | 
| 36 | 
            +
                end
         | 
| 37 | 
            +
              end
         | 
| 38 | 
            +
            end
         | 
| 39 | 
            +
             | 
| 40 | 
            +
            class String; include Literal; end
         | 
| 41 | 
            +
            class Integer; include Literal; end
         | 
| 42 | 
            +
            class DateTime; include Literal; end
         | 
| 43 | 
            +
            class Date; include Literal; end
         | 
| 44 | 
            +
            class Time; include Literal; end
         | 
| 45 | 
            +
            class TrueClass; include Literal; end
         | 
| 46 | 
            +
            class FalseClass; include Literal; end
         | 
| 47 | 
            +
             | 
| 48 | 
            +
            class LocalizedString < String
         | 
| 49 | 
            +
              include Literal
         | 
| 50 | 
            +
              attr_reader :lang
         | 
| 51 | 
            +
              def initialize value, lang=nil
         | 
| 52 | 
            +
                super(value)
         | 
| 35 53 |  | 
| 54 | 
            +
                @lang = lang
         | 
| 55 | 
            +
                @lang = lang[1..-1] if @lang[0..0] == '@'
         | 
| 36 56 | 
             
              end
         | 
| 37 57 |  | 
| 38 | 
            -
               | 
| 39 | 
            -
             | 
| 40 | 
            -
             | 
| 41 | 
            -
                  "\"#{value}\"^^#{type.to_s}"
         | 
| 42 | 
            -
                elsif language
         | 
| 43 | 
            -
                  "\"#{value}\"@#{language}"
         | 
| 58 | 
            +
              def to_ntriple
         | 
| 59 | 
            +
                if @lang
         | 
| 60 | 
            +
                  "\"#{to_s}\"@#@lang"
         | 
| 44 61 | 
             
                else
         | 
| 45 | 
            -
                   | 
| 62 | 
            +
                  super
         | 
| 46 63 | 
             
                end
         | 
| 47 64 | 
             
              end
         | 
| 48 65 | 
             
            end
         | 
| @@ -2,9 +2,7 @@ require 'active_rdf' | |
| 2 2 | 
             
            require 'objectmanager/object_manager'
         | 
| 3 3 | 
             
            require 'objectmanager/namespace'
         | 
| 4 4 | 
             
            require 'queryengine/query'
         | 
| 5 | 
            -
             | 
| 6 | 
            -
            # TODO: finish removal of ObjectManager.construct_classes: make dynamic finders 
         | 
| 7 | 
            -
            # accessible on instance level, and probably more stuff.
         | 
| 5 | 
            +
            require 'instance_exec'
         | 
| 8 6 |  | 
| 9 7 | 
             
            module RDFS
         | 
| 10 8 | 
             
            	# Represents an RDF resource and manages manipulations of that resource,
         | 
| @@ -28,7 +26,7 @@ module RDFS | |
| 28 26 | 
             
                        # allow Resource.new(other_resource)
         | 
| 29 27 | 
             
                        when RDFS::Resource
         | 
| 30 28 | 
             
                         uri.uri
         | 
| 31 | 
            -
                        # allow Resource.new(<uri>) by stripping out <>
         | 
| 29 | 
            +
                        # allow Resource.new('<uri>') by stripping out <>
         | 
| 32 30 | 
             
                        when /^<([^>]*)>$/
         | 
| 33 31 | 
             
                          $1
         | 
| 34 32 | 
             
                        # allow Resource.new('uri')
         | 
| @@ -55,21 +53,53 @@ module RDFS | |
| 55 53 | 
             
                ##### start of instance-level code
         | 
| 56 54 | 
             
                #####                        ######
         | 
| 57 55 |  | 
| 56 | 
            +
                def abbreviation; [Namespace.prefix(uri).to_s, localname]; end
         | 
| 58 57 | 
             
                # a resource is same as another if they both represent the same uri
         | 
| 59 | 
            -
                def ==(other)
         | 
| 58 | 
            +
                def ==(other);
         | 
| 60 59 | 
             
                  other.respond_to?(:uri) ? other.uri == self.uri : false
         | 
| 61 60 | 
             
                end
         | 
| 62 61 | 
             
                alias_method 'eql?','=='
         | 
| 63 62 |  | 
| 64 63 | 
             
                # overriding hash to use uri.hash
         | 
| 65 64 | 
             
                # needed for array.uniq
         | 
| 66 | 
            -
                def hash
         | 
| 67 | 
            -
                  uri.hash
         | 
| 68 | 
            -
                end
         | 
| 65 | 
            +
                def hash; uri.hash; end
         | 
| 69 66 |  | 
| 70 67 | 
             
                # overriding sort based on uri
         | 
| 71 | 
            -
                def <=>(other)
         | 
| 72 | 
            -
             | 
| 68 | 
            +
                def <=>(other); uri <=> other.uri; end
         | 
| 69 | 
            +
                def to_ntriple; "<#{uri}>"; end
         | 
| 70 | 
            +
                def self.to_ntriple; "<#{class_uri.uri}>"; end
         | 
| 71 | 
            +
             | 
| 72 | 
            +
                def to_xml
         | 
| 73 | 
            +
                  base = Namespace.expand(Namespace.prefix(self),'').chop
         | 
| 74 | 
            +
             | 
| 75 | 
            +
                  xml = "<?xml version=\"1.0\"?>\n"
         | 
| 76 | 
            +
                  xml += "<rdf:RDF xmlns=\"#{base}\#\"\n"
         | 
| 77 | 
            +
                  Namespace.abbreviations.each { |p| uri = Namespace.expand(p,''); xml += "  xmlns:#{p.to_s}=\"#{uri}\"\n" if uri != base + '#' }
         | 
| 78 | 
            +
                  xml += "  xml:base=\"#{base}\">\n"
         | 
| 79 | 
            +
             | 
| 80 | 
            +
                  xml += "<rdf:Description rdf:about=\"\##{localname}\">\n"
         | 
| 81 | 
            +
                  direct_predicates.each do |p|
         | 
| 82 | 
            +
                    objects = Query.new.distinct(:o).where(self, p, :o).execute
         | 
| 83 | 
            +
                    objects.each do |obj|
         | 
| 84 | 
            +
                      prefix, localname = Namespace.prefix(p), Namespace.localname(p)
         | 
| 85 | 
            +
                      pred_xml = if prefix
         | 
| 86 | 
            +
                                   "%s:%s" % [prefix, localname]
         | 
| 87 | 
            +
                                 else
         | 
| 88 | 
            +
                                   p.uri
         | 
| 89 | 
            +
                                 end
         | 
| 90 | 
            +
             | 
| 91 | 
            +
                      case obj
         | 
| 92 | 
            +
                      when RDFS::Resource
         | 
| 93 | 
            +
                        xml += "  <#{pred_xml} rdf:resource=\"#{obj.uri}\"/>\n"
         | 
| 94 | 
            +
                      when LocalizedString
         | 
| 95 | 
            +
                        xml += "  <#{pred_xml} xml:lang=\"#{obj.lang}\">#{obj}</#{pred_xml}>\n"
         | 
| 96 | 
            +
                      else
         | 
| 97 | 
            +
                        xml += "  <#{pred_xml} rdf:datatype=\"#{obj.xsd_type.uri}\">#{obj}</#{pred_xml}>\n"
         | 
| 98 | 
            +
                      end
         | 
| 99 | 
            +
                    end
         | 
| 100 | 
            +
                  end
         | 
| 101 | 
            +
                  xml += "</rdf:Description>\n"
         | 
| 102 | 
            +
                  xml += "</rdf:RDF>"
         | 
| 73 103 | 
             
                end
         | 
| 74 104 |  | 
| 75 105 | 
             
                #####                   	#####
         | 
| @@ -217,7 +247,11 @@ module RDFS | |
| 217 247 |  | 
| 218 248 | 
             
            			# check possibility (5)
         | 
| 219 249 | 
             
            			if @predicates.include?(methodname)
         | 
| 220 | 
            -
             | 
| 250 | 
            +
                    if update
         | 
| 251 | 
            +
                      return set_predicate(@predicates[methodname], args)
         | 
| 252 | 
            +
                    else
         | 
| 253 | 
            +
                      return get_predicate(@predicates[methodname])
         | 
| 254 | 
            +
                    end
         | 
| 221 255 | 
             
            			end
         | 
| 222 256 |  | 
| 223 257 | 
             
            			# check possibility (6)
         | 
| @@ -229,16 +263,18 @@ module RDFS | |
| 229 263 |  | 
| 230 264 | 
             
                    # catch the invocation on the namespace
         | 
| 231 265 | 
             
                    class <<namespace
         | 
| 232 | 
            -
                      def method_missing(localname, * | 
| 233 | 
            -
                         | 
| 234 | 
            -
                        if  | 
| 235 | 
            -
             | 
| 236 | 
            -
             | 
| 237 | 
            -
             | 
| 266 | 
            +
                      def method_missing(localname, *values)
         | 
| 267 | 
            +
                        update = localname.to_s[-1..-1] == '='
         | 
| 268 | 
            +
                        predicate = if update 
         | 
| 269 | 
            +
                                      Namespace.lookup(@@uri, localname.to_s[0..-2])
         | 
| 270 | 
            +
                                    else
         | 
| 271 | 
            +
                                      Namespace.lookup(@@uri, localname)
         | 
| 272 | 
            +
                                    end
         | 
| 273 | 
            +
                        
         | 
| 274 | 
            +
                        if update
         | 
| 275 | 
            +
                          @@subject.set_predicate(predicate, values)
         | 
| 238 276 | 
             
                        else
         | 
| 239 | 
            -
                           | 
| 240 | 
            -
                          predicate = Namespace.lookup(@@uri, localname)
         | 
| 241 | 
            -
                          Query.new.distinct(:o).where(@@subject, predicate, :o).execute(:flatten => @@flatten)
         | 
| 277 | 
            +
                          @@subject.get_predicate(predicate, @@flatten)
         | 
| 242 278 | 
             
                        end
         | 
| 243 279 | 
             
                      end
         | 
| 244 280 | 
             
                      private(:type)
         | 
| @@ -255,7 +291,11 @@ module RDFS | |
| 255 291 | 
             
            			# checking possibility (1) and (3)
         | 
| 256 292 | 
             
            			candidates.each do |pred|
         | 
| 257 293 | 
             
            				if Namespace.localname(pred) == methodname
         | 
| 258 | 
            -
             | 
| 294 | 
            +
                      if update
         | 
| 295 | 
            +
                        return set_predicate(pred, args)
         | 
| 296 | 
            +
                      else
         | 
| 297 | 
            +
                        return get_predicate(pred, flatten)
         | 
| 298 | 
            +
                      end
         | 
| 259 299 | 
             
            				end
         | 
| 260 300 | 
             
            			end
         | 
| 261 301 |  | 
| @@ -357,12 +397,10 @@ module RDFS | |
| 357 397 | 
             
            		# returns all predicates that are directly defined for this resource
         | 
| 358 398 | 
             
            		def direct_predicates(distinct = true)
         | 
| 359 399 | 
             
            			if distinct
         | 
| 360 | 
            -
            				 | 
| 400 | 
            +
            				Query.new.distinct(:p).where(self, :p, :o).execute
         | 
| 361 401 | 
             
            			else
         | 
| 362 | 
            -
            				 | 
| 402 | 
            +
            				Query.new.select(:p).where(self, :p, :o).execute
         | 
| 363 403 | 
             
            			end
         | 
| 364 | 
            -
            			q.where(self,:p, :o).execute
         | 
| 365 | 
            -
            			#return (direct + direct.collect {|d| ancestors(d)}).flatten.uniq
         | 
| 366 404 | 
             
            		end
         | 
| 367 405 |  | 
| 368 406 | 
             
            		def property_accessors
         | 
| @@ -378,28 +416,44 @@ module RDFS | |
| 378 416 | 
             
            			"<#{uri}>"
         | 
| 379 417 | 
             
            		end
         | 
| 380 418 |  | 
| 381 | 
            -
             | 
| 382 | 
            -
             | 
| 383 | 
            -
             | 
| 384 | 
            -
             | 
| 419 | 
            +
            		def set_predicate(predicate, values)
         | 
| 420 | 
            +
                  FederationManager.delete(self, predicate)
         | 
| 421 | 
            +
                  values.flatten.each {|v| FederationManager.add(self, predicate, v) }
         | 
| 422 | 
            +
                  values
         | 
| 423 | 
            +
                end
         | 
| 385 424 |  | 
| 386 | 
            -
             | 
| 425 | 
            +
                def get_predicate(predicate, flatten=false)
         | 
| 426 | 
            +
                  values = Query.new.distinct(:o).where(self, predicate, :o).execute(:flatten => flatten)
         | 
| 427 | 
            +
             | 
| 428 | 
            +
                  # TODO: fix '<<' for Fixnum values etc (we cannot use values.instance_eval 
         | 
| 429 | 
            +
                  # because Fixnum cannot do instace_eval, they're not normal classes)
         | 
| 430 | 
            +
                  if values.is_a?(RDFS::Resource) and !values.nil?
         | 
| 431 | 
            +
                    # prepare returned values for accepting << later, eg. in
         | 
| 432 | 
            +
                    # eyal.foaf::knows << knud
         | 
| 433 | 
            +
                    #
         | 
| 434 | 
            +
                    # store @subject, @predicate in returned values
         | 
| 435 | 
            +
                    values.instance_exec(self, predicate) do |s,p|
         | 
| 436 | 
            +
                      @subj = s
         | 
| 437 | 
            +
                      @pred = p
         | 
| 438 | 
            +
                    end
         | 
| 387 439 |  | 
| 440 | 
            +
                    # overwrite << to add triple to db
         | 
| 441 | 
            +
                    values.instance_eval do
         | 
| 442 | 
            +
                      def <<(value)
         | 
| 443 | 
            +
                        FederationManager.add(@subj, @pred, value)
         | 
| 444 | 
            +
                      end
         | 
| 445 | 
            +
                    end
         | 
| 446 | 
            +
                  end
         | 
| 447 | 
            +
             | 
| 448 | 
            +
                  values
         | 
| 449 | 
            +
                end
         | 
| 450 | 
            +
             | 
| 451 | 
            +
            		private
         | 
| 388 452 | 
             
            #		def ancestors(predicate)
         | 
| 389 453 | 
             
            #			subproperty = Namespace.lookup(:rdfs,:subPropertyOf)
         | 
| 390 454 | 
             
            #			Query.new.distinct(:p).where(predicate, subproperty, :p).execute
         | 
| 391 455 | 
             
            #		end
         | 
| 392 456 |  | 
| 393 | 
            -
            		def predicate_invocation(predicate, args, update, flatten)
         | 
| 394 | 
            -
            			if update
         | 
| 395 | 
            -
            				args.each do |value|
         | 
| 396 | 
            -
            					FederationManager.add(self, predicate, value)
         | 
| 397 | 
            -
            				end
         | 
| 398 | 
            -
            				args
         | 
| 399 | 
            -
            			else
         | 
| 400 | 
            -
                    Query.new.distinct(:o).where(self, predicate, :o).execute(:flatten => flatten)
         | 
| 401 | 
            -
            			end
         | 
| 402 | 
            -
            		end
         | 
| 403 457 |  | 
| 404 458 | 
             
            		# returns all rdf:types of this resource but without a conversion to 
         | 
| 405 459 | 
             
            		# Ruby classes (it returns an array of RDFS::Resources)
         | 
| @@ -519,6 +573,6 @@ class DynamicFinderProxy | |
| 519 573 | 
             
                # the initialize method so all return values are ignored, instead the proxy 
         | 
| 520 574 | 
             
                # itself is returned)
         | 
| 521 575 | 
             
                @value = query.execute
         | 
| 522 | 
            -
                return value
         | 
| 576 | 
            +
                return @value
         | 
| 523 577 | 
             
              end
         | 
| 524 578 | 
             
            end
         | 
| @@ -7,6 +7,24 @@ require 'strscan' | |
| 7 7 |  | 
| 8 8 | 
             
            # ntriples parser
         | 
| 9 9 | 
             
            class NTriplesParser
         | 
| 10 | 
            +
              def self.parse_node input
         | 
| 11 | 
            +
                case input
         | 
| 12 | 
            +
                when MatchBNode
         | 
| 13 | 
            +
                  RDFS::Resource.new("http://www.activerdf.org/bnode/#{UUID.random_create}/#$1")
         | 
| 14 | 
            +
                when MatchLiteral
         | 
| 15 | 
            +
                  value = fix_unicode($1)
         | 
| 16 | 
            +
                  if $2
         | 
| 17 | 
            +
                    Literal.typed(value, RDFS::Resource.new($2))
         | 
| 18 | 
            +
                  else
         | 
| 19 | 
            +
                    value
         | 
| 20 | 
            +
                  end
         | 
| 21 | 
            +
                when MatchResource
         | 
| 22 | 
            +
                  RDFS::Resource.new($1)
         | 
| 23 | 
            +
                else
         | 
| 24 | 
            +
                  nil
         | 
| 25 | 
            +
                end
         | 
| 26 | 
            +
              end
         | 
| 27 | 
            +
             | 
| 10 28 | 
             
              # parses an input string of ntriples and returns a nested array of [s, p, o] 
         | 
| 11 29 | 
             
              # (which are in turn ActiveRDF objects)
         | 
| 12 30 | 
             
              def self.parse(input)
         | 
| @@ -19,31 +37,36 @@ class NTriplesParser | |
| 19 37 | 
             
                  scanner = StringScanner.new(triple)
         | 
| 20 38 | 
             
                  scanner.skip(/\s+/)
         | 
| 21 39 | 
             
                  while not scanner.eos?
         | 
| 22 | 
            -
                    nodes << scanner.scan( | 
| 40 | 
            +
                    nodes << scanner.scan(MatchNode)
         | 
| 23 41 | 
             
                    scanner.skip(/\s+/)
         | 
| 24 42 | 
             
                    scanner.terminate if nodes.size == 3 
         | 
| 25 43 | 
             
                  end
         | 
| 26 44 |  | 
| 27 45 | 
             
            			# handle bnodes if necessary (bnodes need to have uri generated)
         | 
| 28 46 | 
             
            			subject = case nodes[0]
         | 
| 29 | 
            -
            								when  | 
| 47 | 
            +
            								when MatchBNode
         | 
| 30 48 | 
             
            									RDFS::Resource.new("http://www.activerdf.org/bnode/#{uuid}/#$1")
         | 
| 31 | 
            -
                            when  | 
| 49 | 
            +
                            when MatchResource
         | 
| 32 50 | 
             
            									RDFS::Resource.new($1)
         | 
| 33 51 | 
             
            								end
         | 
| 34 52 |  | 
| 35 53 | 
             
                  predicate = case nodes[1]
         | 
| 36 | 
            -
                              when  | 
| 54 | 
            +
                              when MatchResource
         | 
| 37 55 | 
             
                                RDFS::Resource.new($1)
         | 
| 38 56 | 
             
                              end
         | 
| 39 57 |  | 
| 40 58 | 
             
            			# handle bnodes and literals if necessary (literals need unicode fixing)
         | 
| 41 59 | 
             
            			object = case nodes[2]
         | 
| 42 | 
            -
            							 when  | 
| 60 | 
            +
            							 when MatchBNode
         | 
| 43 61 | 
             
            								 RDFS::Resource.new("http://www.activerdf.org/bnode/#{uuid}/#$1")
         | 
| 44 | 
            -
            							 when  | 
| 45 | 
            -
             | 
| 46 | 
            -
             | 
| 62 | 
            +
            							 when MatchLiteral
         | 
| 63 | 
            +
                             value = fix_unicode($1)
         | 
| 64 | 
            +
                             if $2
         | 
| 65 | 
            +
                               Literal.typed(value, RDFS::Resource.new($2))
         | 
| 66 | 
            +
                             else
         | 
| 67 | 
            +
                               value
         | 
| 68 | 
            +
                             end
         | 
| 69 | 
            +
                           when MatchResource
         | 
| 47 70 | 
             
            								 RDFS::Resource.new($1)
         | 
| 48 71 | 
             
            							 end
         | 
| 49 72 |  | 
| @@ -54,10 +77,10 @@ class NTriplesParser | |
| 54 77 |  | 
| 55 78 | 
             
            	private
         | 
| 56 79 | 
             
            	# constants for extracting resources/literals from sql results
         | 
| 57 | 
            -
            	 | 
| 58 | 
            -
            	 | 
| 59 | 
            -
            	 | 
| 60 | 
            -
            	 | 
| 80 | 
            +
            	MatchNode = Regexp.union(/"(?:\\"|[^"])*"(?:\^\^\S+)?/,/_:\S*/,/<[^>]*>/)
         | 
| 81 | 
            +
            	MatchBNode = /_:(\S*)/
         | 
| 82 | 
            +
            	MatchResource = /<([^>]*)>/
         | 
| 83 | 
            +
            	MatchLiteral = /"((?:\\"|[^"])*)"(?:\^\^<(\S+)>)?/
         | 
| 61 84 |  | 
| 62 85 | 
             
            	# fixes unicode characters in literals (because we parse them wrongly somehow)
         | 
| 63 86 | 
             
            	def self.fix_unicode(str)
         | 
| @@ -57,15 +57,10 @@ class Query2SPARQL | |
| 57 57 | 
             
              end
         | 
| 58 58 |  | 
| 59 59 | 
             
            	def self.construct_clause(term)
         | 
| 60 | 
            -
                if term. | 
| 61 | 
            -
                  term | 
| 60 | 
            +
                if term.is_a?(Symbol)
         | 
| 61 | 
            +
                  "?#{term}"
         | 
| 62 62 | 
             
                else
         | 
| 63 | 
            -
                   | 
| 64 | 
            -
                  when Symbol
         | 
| 65 | 
            -
                    '?' + term.to_s
         | 
| 66 | 
            -
                  else
         | 
| 67 | 
            -
                    term.to_s
         | 
| 68 | 
            -
                  end
         | 
| 63 | 
            +
                  term.to_ntriple
         | 
| 69 64 | 
             
                end
         | 
| 70 65 | 
             
            	end
         | 
| 71 66 |  | 
| @@ -16,38 +16,37 @@ class TestLiteral < Test::Unit::TestCase | |
| 16 16 | 
             
              end
         | 
| 17 17 |  | 
| 18 18 | 
             
              def test_xsd_string
         | 
| 19 | 
            -
                 | 
| 20 | 
            -
                 | 
| 21 | 
            -
                assert_equal '"test"^^<http://www.w3.org/2001/XMLSchema#string>', test.to_s
         | 
| 19 | 
            +
                test = Literal.typed('test', XSD::string)
         | 
| 20 | 
            +
                assert_equal '"test"^^<http://www.w3.org/2001/XMLSchema#string>', test.to_ntriple
         | 
| 22 21 | 
             
              end
         | 
| 23 22 |  | 
| 24 23 | 
             
              def test_automatic_conversion
         | 
| 25 24 | 
             
                # infer string
         | 
| 26 | 
            -
                test =  | 
| 27 | 
            -
                assert_equal '"test"^^<http://www.w3.org/2001/XMLSchema#string>', test. | 
| 25 | 
            +
                test = 'test'
         | 
| 26 | 
            +
                assert_equal '"test"^^<http://www.w3.org/2001/XMLSchema#string>', test.to_ntriple
         | 
| 28 27 |  | 
| 29 28 | 
             
                # infer integer
         | 
| 30 | 
            -
                test =  | 
| 31 | 
            -
                assert_equal '"18"^^<http://www.w3.org/2001/XMLSchema#integer>', test. | 
| 29 | 
            +
                test = 18
         | 
| 30 | 
            +
                assert_equal '"18"^^<http://www.w3.org/2001/XMLSchema#integer>', test.to_ntriple
         | 
| 32 31 |  | 
| 33 32 | 
             
                # infer boolean
         | 
| 34 | 
            -
                test =  | 
| 35 | 
            -
                assert_equal '"true"^^<http://www.w3.org/2001/XMLSchema#boolean>', test. | 
| 33 | 
            +
                test = true
         | 
| 34 | 
            +
                assert_equal '"true"^^<http://www.w3.org/2001/XMLSchema#boolean>', test.to_ntriple
         | 
| 36 35 | 
             
              end
         | 
| 37 36 |  | 
| 38 37 | 
             
              def test_equality
         | 
| 39 | 
            -
                test1 =  | 
| 40 | 
            -
                test2 = Literal. | 
| 41 | 
            -
                assert_equal test2. | 
| 38 | 
            +
                test1 = 'test'
         | 
| 39 | 
            +
                test2 = Literal.typed('test', XSD::string)  
         | 
| 40 | 
            +
                assert_equal test2.to_ntriple, test1.to_ntriple
         | 
| 42 41 | 
             
              end
         | 
| 43 42 |  | 
| 44 43 | 
             
              def test_language_tag
         | 
| 45 | 
            -
                cat =  | 
| 46 | 
            -
                cat_en =  | 
| 47 | 
            -
                assert_equal '"cat"@en', cat_en. | 
| 48 | 
            -
                assert_not_equal cat. | 
| 44 | 
            +
                cat = 'cat'
         | 
| 45 | 
            +
                cat_en = LocalizedString.new('cat', '@en')
         | 
| 46 | 
            +
                assert_equal '"cat"@en', cat_en.to_ntriple
         | 
| 47 | 
            +
                assert_not_equal cat.to_ntriple, cat_en.to_ntriple
         | 
| 49 48 |  | 
| 50 | 
            -
                assert_equal '"dog"@en-GB',  | 
| 51 | 
            -
                assert_equal '"dog"@en@test',  | 
| 49 | 
            +
                assert_equal '"dog"@en-GB', LocalizedString.new('dog', '@en-GB').to_ntriple
         | 
| 50 | 
            +
                assert_equal '"dog"@en@test', LocalizedString.new('dog', '@en@test').to_ntriple
         | 
| 52 51 | 
             
              end
         | 
| 53 52 | 
             
            end
         | 
| @@ -65,4 +65,30 @@ class TestObjectManager < Test::Unit::TestCase | |
| 65 65 | 
             
                assert_equal TEST::Person, RDFS::Resource.new('http://activerdf.org/test/Person')
         | 
| 66 66 | 
             
                assert_equal RDFS::Resource.new('http://activerdf.org/test/Person'), TEST::Person
         | 
| 67 67 | 
             
              end
         | 
| 68 | 
            +
             | 
| 69 | 
            +
              def test_to_xml
         | 
| 70 | 
            +
                get_adapter.load "#{File.dirname(__FILE__)}/../test_person_data.nt"
         | 
| 71 | 
            +
                Namespace.register(:test, 'http://activerdf.org/test/')
         | 
| 72 | 
            +
             | 
| 73 | 
            +
                eyal = RDFS::Resource.new 'http://activerdf.org/test/eyal'
         | 
| 74 | 
            +
                eyal.age = 29
         | 
| 75 | 
            +
                assert_equal 29, eyal.age
         | 
| 76 | 
            +
                snippet =
         | 
| 77 | 
            +
            '<rdf:Description rdf:about="#eyal">
         | 
| 78 | 
            +
              <test:age rdf:datatype="http://www.w3.org/2001/XMLSchema#integer">29</test:age>
         | 
| 79 | 
            +
              <test:eye rdf:datatype="http://www.w3.org/2001/XMLSchema#string">blue</test:eye>
         | 
| 80 | 
            +
              <rdf:type rdf:resource="http://activerdf.org/test/Person"/>
         | 
| 81 | 
            +
              <rdf:type rdf:resource="http://www.w3.org/2000/01/rdf-schema#Resource"/>
         | 
| 82 | 
            +
            </rdf:Description>
         | 
| 83 | 
            +
            </rdf:RDF>'
         | 
| 84 | 
            +
                assert eyal.to_xml.include?(snippet)
         | 
| 85 | 
            +
             | 
| 86 | 
            +
             | 
| 87 | 
            +
                url = 'http://gollem.swi.psy.uva.nl/cgi-bin/rdf-parser'
         | 
| 88 | 
            +
                uri = URI.parse(url)
         | 
| 89 | 
            +
                req = Net::HTTP::Post.new(url)
         | 
| 90 | 
            +
                req.set_form_data('rdf' => eyal.to_xml)
         | 
| 91 | 
            +
                res = Net::HTTP.new(uri.host, uri.port).start { |http| http.request(req) }
         | 
| 92 | 
            +
                assert_match /RDF statement parsed successfully/, res.body, "SWI-Prolog failed to parse XML output"
         | 
| 93 | 
            +
              end
         | 
| 68 94 | 
             
            end
         | 
| @@ -53,9 +53,9 @@ class TestResourceReading < Test::Unit::TestCase | |
| 53 53 |  | 
| 54 54 | 
             
              def test_eyal_age
         | 
| 55 55 | 
             
                # triple exists '<eyal> age 27'
         | 
| 56 | 
            -
                assert_equal  | 
| 57 | 
            -
                assert_equal  | 
| 58 | 
            -
                assert_equal [ | 
| 56 | 
            +
                assert_equal 27, @eyal.age
         | 
| 57 | 
            +
                assert_equal 27, @eyal.test::age
         | 
| 58 | 
            +
                assert_equal [27], @eyal.all_age
         | 
| 59 59 |  | 
| 60 60 | 
             
                # Person has property car, but eyal has no value for it
         | 
| 61 61 | 
             
                assert_equal nil, @eyal.car
         | 
| @@ -19,12 +19,16 @@ class TestResourceWriting < Test::Unit::TestCase | |
| 19 19 | 
             
                eyal = RDFS::Resource.new 'http://activerdf.org/test/eyal'
         | 
| 20 20 | 
             
                assert_raises(ActiveRdfError) { eyal.age = 18 }
         | 
| 21 21 |  | 
| 22 | 
            -
                 | 
| 23 | 
            -
                assert_equal  | 
| 24 | 
            -
                assert_equal [ | 
| 22 | 
            +
                eyal.ar::age = 100
         | 
| 23 | 
            +
                assert_equal 100, eyal.ar::age
         | 
| 24 | 
            +
                assert_equal [100], eyal.all_ar::age
         | 
| 25 25 |  | 
| 26 | 
            -
                 | 
| 27 | 
            -
                 | 
| 28 | 
            -
                 | 
| 26 | 
            +
                # << fails on Fixnums , because Ruby doesn't allow us to change behaviour of 
         | 
| 27 | 
            +
                # << on Fixnums 
         | 
| 28 | 
            +
                eyal.age << 18
         | 
| 29 | 
            +
                assert_equal 100, eyal.age
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                eyal.ar::age = [100, 80]
         | 
| 32 | 
            +
                assert_equal [100, 80], eyal.ar::age
         | 
| 29 33 | 
             
              end
         | 
| 30 34 | 
             
            end
         | 
| @@ -51,6 +51,21 @@ EOF | |
| 51 51 | 
             
                triples = NTriplesParser.parse(string)
         | 
| 52 52 |  | 
| 53 53 | 
             
                assert_equal 1, triples.size
         | 
| 54 | 
            -
                assert_equal literal, triples.first[2] | 
| 54 | 
            +
                assert_equal literal, triples.first[2]
         | 
| 55 | 
            +
              end
         | 
| 56 | 
            +
             | 
| 57 | 
            +
              def test_datatypes
         | 
| 58 | 
            +
                string =<<EOF
         | 
| 59 | 
            +
            <s> <p> "blue" .
         | 
| 60 | 
            +
            <s> <p> "29"^^<http://www.w3.org/2001/XMLSchema#integer> .
         | 
| 61 | 
            +
            <s> <p> "false"^^<http://www.w3.org/2001/XMLSchema#boolean> .
         | 
| 62 | 
            +
            <s> <p> "2002-10-10T00:00:00+13"^^<http://www.w3.org/2001/XMLSchema#date> .
         | 
| 63 | 
            +
            EOF
         | 
| 64 | 
            +
                triples = NTriplesParser.parse(string)
         | 
| 65 | 
            +
                assert_equal 4, triples.size
         | 
| 66 | 
            +
                assert_equal 'blue', triples[0][2]
         | 
| 67 | 
            +
                assert_equal 29, triples[1][2]
         | 
| 68 | 
            +
                assert_equal triples[2][2], false
         | 
| 69 | 
            +
                assert_equal triples[3][2], DateTime.parse('2002-10-10T00:00:00+13')
         | 
| 55 70 | 
             
              end
         | 
| 56 71 | 
             
            end
         | 
| @@ -8,22 +8,18 @@ require 'queryengine/query2sparql' | |
| 8 8 | 
             
            require "#{File.dirname(__FILE__)}/../common"
         | 
| 9 9 |  | 
| 10 10 | 
             
            class TestQuery2Sparql < Test::Unit::TestCase
         | 
| 11 | 
            -
              def setup
         | 
| 12 | 
            -
              end
         | 
| 13 | 
            -
             | 
| 14 | 
            -
              def teardown
         | 
| 15 | 
            -
              end
         | 
| 11 | 
            +
              def setup; end
         | 
| 12 | 
            +
              def teardown; end
         | 
| 16 13 |  | 
| 17 14 | 
             
              def test_sparql_generation
         | 
| 18 | 
            -
             | 
| 19 15 | 
             
                # TODO: write tests for distinct, ask
         | 
| 20 16 |  | 
| 21 17 | 
             
                query = Query.new
         | 
| 22 18 | 
             
                query.select(:s)
         | 
| 23 | 
            -
                query.where(:s, RDFS::Resource.new('predicate'),  | 
| 19 | 
            +
                query.where(:s, RDFS::Resource.new('predicate'), 30)
         | 
| 24 20 |  | 
| 25 21 | 
             
                generated = Query2SPARQL.translate(query)
         | 
| 26 | 
            -
                expected = "SELECT ?s WHERE { ?s <predicate> \"30\" . } "
         | 
| 22 | 
            +
                expected = "SELECT ?s WHERE { ?s <predicate> \"30\"^^<http://www.w3.org/2001/XMLSchema#integer> . } "
         | 
| 27 23 | 
             
                assert_equal expected, generated
         | 
| 28 24 |  | 
| 29 25 | 
             
                query = Query.new
         | 
| @@ -33,13 +29,15 @@ class TestQuery2Sparql < Test::Unit::TestCase | |
| 33 29 | 
             
                generated = Query2SPARQL.translate(query)
         | 
| 34 30 | 
             
                expected = "SELECT ?s WHERE { ?s <foaf:age> ?a . ?a <rdf:type> <xsd:int> . } "
         | 
| 35 31 | 
             
                assert_equal expected, generated
         | 
| 32 | 
            +
              end
         | 
| 36 33 |  | 
| 37 | 
            -
             | 
| 38 | 
            -
                 | 
| 39 | 
            -
                 | 
| 40 | 
            -
                 | 
| 41 | 
            -
                 | 
| 42 | 
            -
                 | 
| 34 | 
            +
            	def test_sparql_distinct
         | 
| 35 | 
            +
                query = Query.new
         | 
| 36 | 
            +
                query.distinct(:s)
         | 
| 37 | 
            +
                query.where(:s, RDFS::Resource.new('foaf:age'), :a)
         | 
| 38 | 
            +
                generated = Query2SPARQL.translate(query)
         | 
| 39 | 
            +
                expected = "SELECT DISTINCT ?s WHERE { ?s <foaf:age> ?a . } "
         | 
| 40 | 
            +
                assert_equal expected, generated
         | 
| 43 41 | 
             
              end
         | 
| 44 42 |  | 
| 45 43 | 
             
              def test_query_omnipotent
         | 
| @@ -21,10 +21,10 @@ class TestQueryEngine < Test::Unit::TestCase | |
| 21 21 |  | 
| 22 22 | 
             
                query = Query.new
         | 
| 23 23 | 
             
                query.select(:s)
         | 
| 24 | 
            -
                query.where(:s, RDFS::Resource.new('predicate'),  | 
| 24 | 
            +
                query.where(:s, RDFS::Resource.new('predicate'), 30)
         | 
| 25 25 |  | 
| 26 26 | 
             
                generated = Query2SPARQL.translate(query)
         | 
| 27 | 
            -
                expected = "SELECT ?s WHERE { ?s <predicate> \"30\" . } "
         | 
| 27 | 
            +
                expected = "SELECT ?s WHERE { ?s <predicate> \"30\"^^<http://www.w3.org/2001/XMLSchema#integer> . } "
         | 
| 28 28 | 
             
                assert_equal expected, generated
         | 
| 29 29 |  | 
| 30 30 | 
             
                query = Query.new
         | 
    
        data/test/test_adapters.rb
    CHANGED
    
    | @@ -42,11 +42,18 @@ class TestAdapter < Test::Unit::TestCase | |
| 42 42 | 
             
                Namespace.register(:test, 'http://activerdf.org/test/')
         | 
| 43 43 | 
             
                eyal = Namespace.lookup(:test, :eyal)
         | 
| 44 44 |  | 
| 45 | 
            -
                assert_equal  | 
| 46 | 
            -
                eyal.age | 
| 47 | 
            -
             | 
| 48 | 
            -
                 | 
| 49 | 
            -
                 | 
| 45 | 
            +
                assert_equal 1, eyal.all_age.size
         | 
| 46 | 
            +
                assert_equal 27, eyal.age
         | 
| 47 | 
            +
             | 
| 48 | 
            +
                # << doesn't work on Fixnums
         | 
| 49 | 
            +
                eyal.age << 30
         | 
| 50 | 
            +
                assert_equal 1, eyal.all_age.size
         | 
| 51 | 
            +
                assert !eyal.all_age.include?(30)
         | 
| 52 | 
            +
                assert eyal.all_age.include?(27)
         | 
| 53 | 
            +
             | 
| 54 | 
            +
                eyal.age = 40
         | 
| 55 | 
            +
                assert_equal 1, eyal.all_age.size
         | 
| 56 | 
            +
                assert eyal.age == 40
         | 
| 50 57 | 
             
              end
         | 
| 51 58 | 
             
            end
         | 
| 52 59 |  | 
    
        data/test/test_person_data.nt
    CHANGED
    
    | @@ -1,9 +1,9 @@ | |
| 1 1 | 
             
            <http://activerdf.org/test/Person> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2000/01/rdf-schema#Class> .
         | 
| 2 2 | 
             
            <http://activerdf.org/test/Person> <http://www.w3.org/2000/01/rdf-schema#subClassOf> <http://www.w3.org/2000/01/rdf-schema#Resource> .
         | 
| 3 3 | 
             
            <http://activerdf.org/test/eyal> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://activerdf.org/test/Person> .
         | 
| 4 | 
            -
            <http://activerdf.org/test/eyal> <http://activerdf.org/test/age> "27" .
         | 
| 4 | 
            +
            <http://activerdf.org/test/eyal> <http://activerdf.org/test/age> "27"^^<http://www.w3.org/2001/XMLSchema#integer> .
         | 
| 5 5 | 
             
            <http://activerdf.org/test/other> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://activerdf.org/test/Person> .
         | 
| 6 | 
            -
            <http://activerdf.org/test/other> <http://activerdf.org/test/age> "21" | 
| 6 | 
            +
            <http://activerdf.org/test/other> <http://activerdf.org/test/age> "21"^^<http://www.w3.org/2001/XMLSchema#integer>  .
         | 
| 7 7 | 
             
            <http://activerdf.org/test/eyal> <http://activerdf.org/test/eye> "blue" .
         | 
| 8 8 | 
             
            <http://activerdf.org/test/age> <http://www.w3.org/2000/01/rdf-schema#domain> <http://www.w3.org/2000/01/rdf-schema#Resource> .
         | 
| 9 9 | 
             
            <http://activerdf.org/test/eye> <http://www.w3.org/2000/01/rdf-schema#domain> <http://www.w3.org/2000/01/rdf-schema#Resource> .
         | 
    
        metadata
    CHANGED
    
    | @@ -3,8 +3,8 @@ rubygems_version: 0.9.4 | |
| 3 3 | 
             
            specification_version: 1
         | 
| 4 4 | 
             
            name: activerdf
         | 
| 5 5 | 
             
            version: !ruby/object:Gem::Version 
         | 
| 6 | 
            -
              version: 1.6. | 
| 7 | 
            -
            date:  | 
| 6 | 
            +
              version: 1.6.9
         | 
| 7 | 
            +
            date: 2008-02-11 00:00:00 +01:00
         | 
| 8 8 | 
             
            summary: Offers object-oriented access to RDF (with adapters to several datastores).
         | 
| 9 9 | 
             
            require_paths: 
         | 
| 10 10 | 
             
            - lib
         | 
| @@ -32,42 +32,41 @@ files: | |
| 32 32 | 
             
            - LICENSE
         | 
| 33 33 | 
             
            - README
         | 
| 34 34 | 
             
            - CHANGELOG
         | 
| 35 | 
            +
            - test/small-two.nt
         | 
| 36 | 
            +
            - test/queryengine
         | 
| 37 | 
            +
            - test/queryengine/test_query_engine.rb
         | 
| 38 | 
            +
            - test/queryengine/test_ntriples_parser.rb
         | 
| 39 | 
            +
            - test/queryengine/test_query2sparql.rb
         | 
| 40 | 
            +
            - test/test_person_data.nt
         | 
| 35 41 | 
             
            - test/federation
         | 
| 36 | 
            -
            - test/federation/test_federation_manager.rb
         | 
| 37 42 | 
             
            - test/federation/test_connection_pool.rb
         | 
| 43 | 
            +
            - test/federation/test_federation_manager.rb
         | 
| 44 | 
            +
            - test/small-one.nt
         | 
| 45 | 
            +
            - test/test_adapters.rb
         | 
| 46 | 
            +
            - test/common.rb
         | 
| 38 47 | 
             
            - test/objectmanager
         | 
| 39 | 
            -
            - test/objectmanager/test_resource_reading.rb
         | 
| 40 48 | 
             
            - test/objectmanager/test_literal.rb
         | 
| 41 | 
            -
            - test/objectmanager/test_namespace.rb
         | 
| 42 49 | 
             
            - test/objectmanager/test_object_manager.rb
         | 
| 50 | 
            +
            - test/objectmanager/test_resource_reading.rb
         | 
| 43 51 | 
             
            - test/objectmanager/test_resource_writing.rb
         | 
| 44 | 
            -
            - test/ | 
| 45 | 
            -
            - test/queryengine/test_ntriples_parser.rb
         | 
| 46 | 
            -
            - test/queryengine/test_query.rb
         | 
| 47 | 
            -
            - test/queryengine/test_query2jars2.rb
         | 
| 48 | 
            -
            - test/queryengine/test_query2sparql.rb
         | 
| 49 | 
            -
            - test/queryengine/test_query_engine.rb
         | 
| 50 | 
            -
            - test/common.rb
         | 
| 51 | 
            -
            - test/test_adapters.rb
         | 
| 52 | 
            -
            - test/test_person_data.nt
         | 
| 53 | 
            -
            - test/small-one.nt
         | 
| 54 | 
            -
            - test/small-two.nt
         | 
| 52 | 
            +
            - test/objectmanager/test_namespace.rb
         | 
| 55 53 | 
             
            - lib/active_rdf
         | 
| 54 | 
            +
            - lib/active_rdf/queryengine
         | 
| 55 | 
            +
            - lib/active_rdf/queryengine/ntriples_parser.rb
         | 
| 56 | 
            +
            - lib/active_rdf/queryengine/query.rb
         | 
| 57 | 
            +
            - lib/active_rdf/queryengine/query2sparql.rb
         | 
| 58 | 
            +
            - lib/active_rdf/queryengine/query2jars2.rb
         | 
| 56 59 | 
             
            - lib/active_rdf/federation
         | 
| 60 | 
            +
            - lib/active_rdf/federation/active_rdf_adapter.rb
         | 
| 57 61 | 
             
            - lib/active_rdf/federation/connection_pool.rb
         | 
| 58 62 | 
             
            - lib/active_rdf/federation/federation_manager.rb
         | 
| 59 | 
            -
            - lib/active_rdf/ | 
| 63 | 
            +
            - lib/active_rdf/instance_exec.rb
         | 
| 60 64 | 
             
            - lib/active_rdf/objectmanager
         | 
| 61 65 | 
             
            - lib/active_rdf/objectmanager/resource.rb
         | 
| 62 | 
            -
            - lib/active_rdf/objectmanager/namespace.rb
         | 
| 63 66 | 
             
            - lib/active_rdf/objectmanager/literal.rb
         | 
| 64 | 
            -
            - lib/active_rdf/objectmanager/object_manager.rb
         | 
| 65 67 | 
             
            - lib/active_rdf/objectmanager/bnode.rb
         | 
| 66 | 
            -
            - lib/active_rdf/ | 
| 67 | 
            -
            - lib/active_rdf/ | 
| 68 | 
            -
            - lib/active_rdf/queryengine/query2sparql.rb
         | 
| 69 | 
            -
            - lib/active_rdf/queryengine/ntriples_parser.rb
         | 
| 70 | 
            -
            - lib/active_rdf/queryengine/query2jars2.rb
         | 
| 68 | 
            +
            - lib/active_rdf/objectmanager/namespace.rb
         | 
| 69 | 
            +
            - lib/active_rdf/objectmanager/object_manager.rb
         | 
| 71 70 | 
             
            - lib/active_rdf.rb
         | 
| 72 71 | 
             
            - lib/active_rdf_log.rb
         | 
| 73 72 | 
             
            - lib/active_rdf_helpers.rb
         | 
| @@ -1,55 +0,0 @@ | |
| 1 | 
            -
            # Author:: Eyal Oren
         | 
| 2 | 
            -
            # Copyright:: (c) 2005-2006
         | 
| 3 | 
            -
            # License:: LGPL
         | 
| 4 | 
            -
             | 
| 5 | 
            -
            require 'test/unit'
         | 
| 6 | 
            -
            require 'active_rdf'
         | 
| 7 | 
            -
            require 'queryengine/query'
         | 
| 8 | 
            -
            require "#{File.dirname(__FILE__)}/../common"
         | 
| 9 | 
            -
             | 
| 10 | 
            -
            class TestQuery < Test::Unit::TestCase
         | 
| 11 | 
            -
              def setup
         | 
| 12 | 
            -
              end
         | 
| 13 | 
            -
             | 
| 14 | 
            -
              def teardown
         | 
| 15 | 
            -
              end
         | 
| 16 | 
            -
             | 
| 17 | 
            -
              def test_sparql_generation
         | 
| 18 | 
            -
                query = Query.new
         | 
| 19 | 
            -
                query.select(:s)
         | 
| 20 | 
            -
                query.where(:s, RDFS::Resource.new('predicate'), '30')
         | 
| 21 | 
            -
                generated = Query2SPARQL.translate(query)
         | 
| 22 | 
            -
                expected = "SELECT ?s WHERE { ?s <predicate> \"30\" . } "
         | 
| 23 | 
            -
                assert_equal expected, generated
         | 
| 24 | 
            -
             | 
| 25 | 
            -
                query = Query.new
         | 
| 26 | 
            -
                query.select(:s)
         | 
| 27 | 
            -
                query.where(:s, RDFS::Resource.new('foaf:age'), :a)
         | 
| 28 | 
            -
                query.where(:a, RDFS::Resource.new('rdf:type'), RDFS::Resource.new('xsd:int'))
         | 
| 29 | 
            -
                generated = Query2SPARQL.translate(query)
         | 
| 30 | 
            -
                expected = "SELECT ?s WHERE { ?s <foaf:age> ?a . ?a <rdf:type> <xsd:int> . } "
         | 
| 31 | 
            -
                assert_equal expected, generated
         | 
| 32 | 
            -
            	end
         | 
| 33 | 
            -
             | 
| 34 | 
            -
            	def test_sparql_distinct
         | 
| 35 | 
            -
                query = Query.new
         | 
| 36 | 
            -
                query.distinct(:s)
         | 
| 37 | 
            -
                query.where(:s, RDFS::Resource.new('foaf:age'), :a)
         | 
| 38 | 
            -
                generated = Query2SPARQL.translate(query)
         | 
| 39 | 
            -
                expected = "SELECT DISTINCT ?s WHERE { ?s <foaf:age> ?a . } "
         | 
| 40 | 
            -
                assert_equal expected, generated
         | 
| 41 | 
            -
              end
         | 
| 42 | 
            -
             | 
| 43 | 
            -
              def test_query_omnipotent
         | 
| 44 | 
            -
                # can define multiple select clauses at once or separately
         | 
| 45 | 
            -
                q1 = Query.new.select(:s,:a)
         | 
| 46 | 
            -
                q2 = Query.new.select(:s).select(:a)
         | 
| 47 | 
            -
                assert_equal Query2SPARQL.translate(q1),Query2SPARQL.translate(q2)
         | 
| 48 | 
            -
              end
         | 
| 49 | 
            -
             | 
| 50 | 
            -
            	def test_query_refuses_string_in_where_clause_subject_or_predicate
         | 
| 51 | 
            -
                assert_raises(ActiveRdfError)do
         | 
| 52 | 
            -
                  Query.new.select(:s).where("http://test.org/uri",:p, :o).execute
         | 
| 53 | 
            -
                end
         | 
| 54 | 
            -
              end
         | 
| 55 | 
            -
            end
         | 
| @@ -1,51 +0,0 @@ | |
| 1 | 
            -
            # Author:: Eyal Oren
         | 
| 2 | 
            -
            # Copyright:: (c) 2005-2006
         | 
| 3 | 
            -
            # License:: LGPL
         | 
| 4 | 
            -
             | 
| 5 | 
            -
            require 'test/unit'
         | 
| 6 | 
            -
            require 'active_rdf'
         | 
| 7 | 
            -
            require 'queryengine/query2jars2'
         | 
| 8 | 
            -
            require "#{File.dirname(__FILE__)}/../common"
         | 
| 9 | 
            -
             | 
| 10 | 
            -
            class TestQuery2Jars2 < Test::Unit::TestCase
         | 
| 11 | 
            -
              def setup
         | 
| 12 | 
            -
              end
         | 
| 13 | 
            -
             | 
| 14 | 
            -
              def teardown
         | 
| 15 | 
            -
              end
         | 
| 16 | 
            -
             | 
| 17 | 
            -
              def test_sparql_generation
         | 
| 18 | 
            -
             | 
| 19 | 
            -
                # TODO: write tests for distinct, ask
         | 
| 20 | 
            -
             | 
| 21 | 
            -
                query = Query.new
         | 
| 22 | 
            -
                query.select(:s)
         | 
| 23 | 
            -
                query.where(:s, RDFS::Resource.new('predicate'), '30')
         | 
| 24 | 
            -
             | 
| 25 | 
            -
                generated = Query2SPARQL.translate(query)
         | 
| 26 | 
            -
                expected = "SELECT ?s WHERE { ?s <predicate> \"30\" . } "
         | 
| 27 | 
            -
                assert_equal expected, generated
         | 
| 28 | 
            -
             | 
| 29 | 
            -
                query = Query.new
         | 
| 30 | 
            -
                query.select(:s)
         | 
| 31 | 
            -
                query.where(:s, RDFS::Resource.new('foaf:age'), :a)
         | 
| 32 | 
            -
                query.where(:a, RDFS::Resource.new('rdf:type'), RDFS::Resource.new('xsd:int'))
         | 
| 33 | 
            -
                generated = Query2SPARQL.translate(query)
         | 
| 34 | 
            -
                expected = "SELECT ?s WHERE { ?s <foaf:age> ?a . ?a <rdf:type> <xsd:int> . } "
         | 
| 35 | 
            -
                assert_equal expected, generated
         | 
| 36 | 
            -
             | 
| 37 | 
            -
                #		query = Query.new
         | 
| 38 | 
            -
                #		query.select(:s).select(:a)
         | 
| 39 | 
            -
                #		query.where(:s, 'foaf:age', :a)
         | 
| 40 | 
            -
                #		generated = Query2SPARQL.translate(query)
         | 
| 41 | 
            -
                #		expected = "SELECT DISTINCT ?s ?a WHERE { ?s foaf:age ?a .}"
         | 
| 42 | 
            -
                #		assert_equal expected, generated
         | 
| 43 | 
            -
              end
         | 
| 44 | 
            -
             | 
| 45 | 
            -
              def test_query_omnipotent
         | 
| 46 | 
            -
                # can define multiple select clauses at once or separately
         | 
| 47 | 
            -
                q1 = Query.new.select(:s,:a)
         | 
| 48 | 
            -
                q2 = Query.new.select(:s).select(:a)
         | 
| 49 | 
            -
                assert_equal Query2SPARQL.translate(q1),Query2SPARQL.translate(q2)
         | 
| 50 | 
            -
              end
         | 
| 51 | 
            -
            end
         |