Skip to content

Commit c0860c9

Browse files
committed
Finish 1.1.1.
Performance update for toRDF.
2 parents 62a69d9 + 1b37668 commit c0860c9

File tree

15 files changed

+143
-204
lines changed

15 files changed

+143
-204
lines changed

.gemspec

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -38,15 +38,5 @@ Gem::Specification.new do |gem|
3838
gem.add_development_dependency 'rdf-isomorphic'
3939
gem.add_development_dependency 'rdf-xsd'
4040

41-
# Rubinius has it's own dependencies
42-
if RUBY_ENGINE == "rbx" && RUBY_VERSION >= "2.1.0"
43-
#gem.add_runtime_dependency "rubysl-bigdecimal"
44-
gem.add_development_dependency "rubysl-base64"
45-
gem.add_development_dependency "rubysl-open-uri"
46-
gem.add_development_dependency "rubysl-prettyprint"
47-
gem.add_development_dependency "rubysl-rexml"
48-
gem.add_development_dependency "racc"
49-
end
50-
5141
gem.post_install_message = nil
5242
end

.travis.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,4 @@ rvm:
88
- 2.0.0
99
- jruby-19mode
1010
- rbx
11+
cache: bundler

Gemfile

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,8 @@ group :debug do
1414
gem "wirble"
1515
gem "debugger", :platforms => [:mri_19, :mri_20]
1616
end
17+
18+
platforms :rbx do
19+
gem 'rubysl', '~> 2.0'
20+
gem 'rubinius', '~> 2.0'
21+
end

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1.1.0
1+
1.1.1

lib/json/ld.rb

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
$:.unshift(File.expand_path(File.join(File.dirname(__FILE__), '..')))
22
require 'rdf' # @see http://rubygems.org/gems/rdf
3-
require 'backports' if RUBY_VERSION < "1.9"
43

54
module JSON
65
##

lib/json/ld/api.rb

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,6 @@ def initialize(input, context, options = {}, &block)
8080
@options[:documentLoader] ||= self.class.method(:documentLoader)
8181
options[:rename_bnodes] ||= true
8282
@namer = options[:rename_bnodes] ? BlankNodeNamer.new("b") : BlankNodeMapper.new
83-
content_type = nil
8483
@value = case input
8584
when Array, Hash then input.dup
8685
when IO, StringIO
@@ -219,8 +218,7 @@ def self.flatten(input, context, options = {})
219218
debug(".flatten") {"expanded input: #{value.to_json(JSON_STATE)}"}
220219

221220
# Initialize node map to a JSON object consisting of a single member whose key is @default and whose value is an empty JSON object.
222-
node_map = Hash.ordered
223-
node_map['@default'] = Hash.ordered
221+
node_map = {'@default' => {}}
224222
self.generate_node_map(value, node_map)
225223

226224
default_graph = node_map['@default']
@@ -281,7 +279,6 @@ def self.flatten(input, context, options = {})
281279
# @see http://json-ld.org/spec/latest/json-ld-api/#framing-algorithm
282280
def self.frame(input, frame, options = {})
283281
result = nil
284-
match_limit = 0
285282
framing_state = {
286283
:embed => true,
287284
:explicit => false,
@@ -319,7 +316,7 @@ def self.frame(input, frame, options = {})
319316
debug(".frame") {"expanded input: #{value.to_json(JSON_STATE)}"}
320317

321318
# Get framing nodes from expanded input, replacing Blank Node identifiers as necessary
322-
all_nodes = Hash.ordered
319+
all_nodes = {}
323320
old_dbg, @options[:debug] = @options[:debug], nil
324321
depth do
325322
generate_node_map(value, all_nodes)
@@ -360,24 +357,28 @@ def self.frame(input, frame, options = {})
360357
# @option options [Boolean] :produceGeneralizedRdf (false)
361358
# If true, output will include statements having blank node predicates, otherwise they are dropped.
362359
# @raise [JsonLdError]
363-
# @return [Array<RDF::Statement>] if no block given
364360
# @yield statement
365361
# @yieldparam [RDF::Statement] statement
366362
def self.toRdf(input, options = {}, &block)
367-
results = []
368-
results.extend(RDF::Enumerable)
363+
unless block_given?
364+
results = []
365+
results.extend(RDF::Enumerable)
366+
self.toRdf(input, options) do |stmt|
367+
results << stmt
368+
end
369+
return results
370+
end
369371

370372
# Expand input to simplify processing
371-
expanded_input = API.expand(input, options)
373+
expanded_input = API.expand(input, options.merge(:ordered => false))
372374

373375
API.new(expanded_input, nil, options) do
374376
# 1) Perform the Expansion Algorithm on the JSON-LD input.
375377
# This removes any existing context to allow the given context to be cleanly applied.
376378
debug(".toRdf") {"expanded input: #{expanded_input.to_json(JSON_STATE)}"}
377379

378380
# Generate _nodeMap_
379-
node_map = Hash.ordered
380-
node_map['@default'] = Hash.ordered
381+
node_map = {'@default' => {}}
381382
generate_node_map(expanded_input, node_map)
382383
debug(".toRdf") {"node map: #{node_map.to_json(JSON_STATE)}"}
383384

@@ -390,7 +391,7 @@ def self.toRdf(input, options = {}, &block)
390391
debug(".toRdf") {"drop relative graph_name: #{statement.to_ntriples}"}
391392
next
392393
end
393-
graph_to_rdf(graph).each do |statement|
394+
graph_to_rdf(graph) do |statement|
394395
next if statement.predicate.node? && !options[:produceGeneralizedRdf]
395396
# Drop results with relative IRIs
396397
relative = statement.to_a.any? do |r|

lib/json/ld/compact.rb

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -156,9 +156,7 @@ def compact(element, property = nil)
156156
end
157157

158158
# Re-order result keys
159-
r = Hash.ordered
160-
result.keys.kw_sort.each {|kk| r[kk] = result[kk]}
161-
r
159+
result.keys.kw_sort.inject({}) {|map, kk| map[kk] = result[kk]; map}
162160
else
163161
# For other types, the compacted value is the element value
164162
debug("compact") {element.class.to_s}

lib/json/ld/expand.rb

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,11 @@ module Expand
1111
# @param [String] active_property
1212
# @param [Context] context
1313
# @param [Hash{Symbol => Object}] options
14+
# @option options [Boolean] :ordered (true)
15+
# Ensure output objects have keys ordered properly
1416
# @return [Array, Hash]
1517
def expand(input, active_property, context, options = {})
18+
options = {:ordered => true}.merge(options)
1619
debug("expand") {"input: #{input.inspect}, active_property: #{active_property.inspect}, context: #{context.inspect}"}
1720
result = case input
1821
when Array
@@ -40,9 +43,10 @@ def expand(input, active_property, context, options = {})
4043
end
4144

4245
depth do
43-
output_object = Hash.ordered
46+
output_object = {}
4447
# Then, proceed and process each property and value in element as follows:
45-
input.keys.kw_sort.each do |key|
48+
keys = options[:ordered] ? input.keys.kw_sort : input.keys
49+
keys.each do |key|
4650
# For each key and value in element, ordered lexicographically by key:
4751
value = input[key]
4852
expanded_property = context.expand_iri(key, :vocab => true, :depth => @depth)
@@ -199,7 +203,8 @@ def expand(input, active_property, context, options = {})
199203
ary = []
200204

201205
# For each key-value pair language-language value in value, ordered lexicographically by language
202-
value.keys.sort.each do |k|
206+
keys = options[:ordered] ? value.keys.sort : value.keys
207+
keys.each do |k|
203208
[value[k]].flatten.each do |item|
204209
# item must be a string, otherwise an invalid language map value error has been detected and processing is aborted.
205210
raise JsonLdError::InvalidLanguageMapValue,
@@ -221,7 +226,8 @@ def expand(input, active_property, context, options = {})
221226
ary = []
222227

223228
# For each key-value in the object:
224-
value.keys.sort.each do |k|
229+
keys = options[:ordered] ? value.keys.sort : value.keys
230+
keys.each do |k|
225231
# Initialize index value to the result of using this algorithm recursively, passing active context, key as active property, and index value as element.
226232
index_value = depth { expand([value[k]].flatten, key, context, options) }
227233
index_value.each do |item|
@@ -322,10 +328,12 @@ def expand(input, active_property, context, options = {})
322328
return nil
323329
end
324330

325-
# Re-order result keys
326-
r = Hash.ordered
327-
output_object.keys.kw_sort.each {|k| r[k] = output_object[k]}
328-
r
331+
# Re-order result keys if ordering
332+
if options[:ordered]
333+
output_object.keys.kw_sort.inject({}) {|map, kk| map[kk] = output_object[kk]; map}
334+
else
335+
output_object
336+
end
329337
end
330338
else
331339
# Otherwise, unless the value is a number, expand the value according to the Value Expansion rules, passing active property.

lib/json/ld/extensions.rb

Lines changed: 0 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -66,82 +66,3 @@ def term_sort
6666
end
6767
end
6868
end
69-
70-
if RUBY_VERSION < "1.9"
71-
class InsertOrderPreservingHash < Hash
72-
include Enumerable
73-
74-
def initialize(*args, &block)
75-
super
76-
@ordered_keys = []
77-
end
78-
79-
def []=(key, val)
80-
@ordered_keys << key unless has_key? key
81-
super
82-
end
83-
84-
def each
85-
@ordered_keys.each {|k| yield(k, self[k])}
86-
end
87-
alias :each_pair :each
88-
89-
def each_value
90-
@ordered_keys.each {|k| yield(super[k])}
91-
end
92-
93-
def each_key
94-
@ordered_keys.each {|k| yield k}
95-
end
96-
97-
def keys
98-
@ordered_keys
99-
end
100-
101-
def clear
102-
@ordered_keys.clear
103-
super
104-
end
105-
106-
def delete(k, &block)
107-
@ordered_keys.delete(k)
108-
super
109-
end
110-
111-
def reject!
112-
del = []
113-
each_pair {|k,v| del << k if yield k,v}
114-
del.each {|k| delete k}
115-
del.empty? ? nil : self
116-
end
117-
118-
def delete_if(&block)
119-
reject!(&block)
120-
self
121-
end
122-
123-
def merge!(other)
124-
new_keys = other.instance_variable_get(:@ordered_keys) || other.keys
125-
new_keys -= @ordered_keys
126-
@ordered_keys += new_keys
127-
super
128-
self
129-
end
130-
131-
def merge(other)
132-
self.dup.merge!(other)
133-
end
134-
end
135-
136-
class Hash
137-
def self.ordered(obj = nil, &block)
138-
InsertOrderPreservingHash.new(obj, &block)
139-
end
140-
end
141-
else
142-
class Hash
143-
def self.ordered(obj = nil, &block)
144-
Hash.new(obj, &block)
145-
end
146-
end
147-
end

lib/json/ld/flatten.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,8 @@ def generate_node_map(element,
147147
end
148148

149149
# Finally, for each key-value pair property-value in element ordered by property perform the following steps:
150-
element.keys.sort.each do |property|
150+
# Note: Not ordering doesn't seem to affect results and is more performant
151+
element.keys.each do |property|
151152
value = element[property]
152153

153154
# If property is a blank node identifier, replace it with a newly generated blank node identifier passing property for identifier.

0 commit comments

Comments
 (0)