Skip to content

Commit a600763

Browse files
committed
Replace multiple use of %w(...).include? with whitelist to reduce allocations.
1 parent b5df59c commit a600763

File tree

5 files changed

+26
-15
lines changed

5 files changed

+26
-15
lines changed

lib/json/ld/compact.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ def compact(element, property: nil)
5858
expanded_value = element[expanded_property]
5959
#log_debug("") {"#{expanded_property}: #{expanded_value.inspect}"}
6060

61-
if %w(@id @type).include?(expanded_property)
61+
if expanded_property == '@id' || expanded_property == '@type'
6262
compacted_value = [expanded_value].flatten.compact.map do |expanded_type|
6363
context.compact_iri(expanded_type, vocab: (expanded_property == '@type'), log_depth: @options[:log_depth])
6464
end
@@ -118,7 +118,7 @@ def compact(element, property: nil)
118118
end
119119

120120
# Otherwise, if expanded property is @index, @value, or @language:
121-
if %w(@index @value @language).include?(expanded_property)
121+
if expanded_property == '@index' || expanded_property == '@value' || expanded_property == '@language'
122122
al = context.compact_iri(expanded_property, vocab: true, quiet: true)
123123
#log_debug(expanded_property) {"#{al} => #{expanded_value.inspect}"}
124124
result[al] = expanded_value
@@ -181,7 +181,7 @@ def compact(element, property: nil)
181181
end
182182
end
183183

184-
if %w(@language @index @id @type).include?(container)
184+
if container == '@language' || container == '@index' || container == '@id' || container == '@type'
185185
map_object = nest_result[item_active_property] ||= {}
186186
compacted_item = case container
187187
when '@id'

lib/json/ld/context.rb

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
# frozen_string_literal: true
33
require 'json'
44
require 'bigdecimal'
5+
require 'set'
56

67
module JSON::LD
78
class Context
@@ -554,7 +555,7 @@ def create_term_definition(local_context, term, defined)
554555
end
555556

556557
# Since keywords cannot be overridden, term must not be a keyword. Otherwise, an invalid value has been detected, which is an error.
557-
if KEYWORDS.include?(term) && !%w(@vocab @language @version).include?(term)
558+
if KEYWORDS.include?(term) && (term != '@vocab' && term != '@language' && term != '@version')
558559
raise JsonLdError::KeywordRedefinition, "term must not be a keyword: #{term.inspect}" if
559560
@options[:validate]
560561
elsif !term_valid?(term) && @options[:validate]
@@ -606,7 +607,7 @@ def create_term_definition(local_context, term, defined)
606607
else
607608
:error
608609
end
609-
unless %w(@id @vocab).include?(type) || type.is_a?(RDF::URI) && type.absolute?
610+
unless (type == '@id' || type == '@vocab') || type.is_a?(RDF::URI) && type.absolute?
610611
raise JsonLdError::InvalidTypeMapping, "unknown mapping for '@type': #{type.inspect} on term #{term.inspect}"
611612
end
612613
#log_debug("") {"type_mapping: #{type.inspect}"}
@@ -633,7 +634,7 @@ def create_term_definition(local_context, term, defined)
633634
container = value['@container']
634635
raise JsonLdError::InvalidReverseProperty,
635636
"unknown mapping for '@container' to #{container.inspect} on term #{term.inspect}" unless
636-
container.is_a?(String) && ['@set', '@index'].include?(container)
637+
container.is_a?(String) && (container == '@set' || container == '@index')
637638
definition.container_mapping = check_container(container, local_context, defined, term)
638639
end
639640
definition.reverse_property = true
@@ -791,7 +792,7 @@ def from_vocabulary(graph)
791792
(statements[statement.subject] ||= []) << statement
792793

793794
# Keep track of predicate ranges
794-
if [RDF::RDFS.range, RDF::SCHEMA.rangeIncludes].include?(statement.predicate)
795+
if [RDF::RDFS.range, RDF::SCHEMA.rangeIncludes].include?(statement.predicate)
795796
(ranges[statement.subject] ||= []) << statement.object
796797
end
797798
end
@@ -886,7 +887,7 @@ def container(term)
886887
# @param [Term, #to_s] term in unexpanded form
887888
# @return [Boolean]
888889
def as_array?(term)
889-
return true if %w(@graph @list).include?(term)
890+
return true if term == '@graph' || term == '@list'
890891
term = find_definition(term)
891892
term && (term.as_set || term.container_mapping == '@list')
892893
end
@@ -1138,7 +1139,7 @@ def compact_iri(iri, value: nil, vocab: nil, reverse: false, quiet: false, **opt
11381139
tl_value ||= '@null'
11391140
preferred_values = []
11401141
preferred_values << '@reverse' if tl_value == '@reverse'
1141-
if %w(@id @reverse).include?(tl_value) && value.is_a?(Hash) && value.has_key?('@id')
1142+
if (tl_value == '@id' || tl_value == '@reverse') && value.is_a?(Hash) && value.has_key?('@id')
11421143
t_iri = compact_iri(value['@id'], vocab: true, document_relative: true)
11431144
if (r_td = term_definitions[t_iri]) && r_td.id == value['@id']
11441145
preferred_values.concat(%w(@vocab @id @none))
@@ -1204,6 +1205,8 @@ def compact_iri(iri, value: nil, vocab: nil, reverse: false, quiet: false, **opt
12041205
end
12051206
end
12061207

1208+
RDF_LITERAL_NATIVE_TYPES = Set.new([RDF::XSD.boolean, RDF::XSD.integer, RDF::XSD.double]).freeze
1209+
12071210
##
12081211
# If active property has a type mapping in the active context set to @id or @vocab, a JSON object with a single member @id whose value is the result of using the IRI Expansion algorithm on value is returned.
12091212
#
@@ -1246,7 +1249,7 @@ def expand_value(property, value, useNativeTypes: false, **options)
12461249
when RDF::Literal
12471250
#log_debug("Literal") {"datatype: #{value.datatype.inspect}"}
12481251
res = {}
1249-
if useNativeTypes && [RDF::XSD.boolean, RDF::XSD.integer, RDF::XSD.double].include?(value.datatype)
1252+
if useNativeTypes && RDF_LITERAL_NATIVE_TYPES.include?(value.datatype)
12501253
res['@value'] = value.object
12511254
res['@type'] = uri(coerce(property)) if coerce(property)
12521255
else
@@ -1407,7 +1410,7 @@ def dup
14071410
def coerce(property)
14081411
# Map property, if it's not an RDF::Value
14091412
# @type is always is an IRI
1410-
return '@id' if [RDF.type, '@type'].include?(property)
1413+
return '@id' if property == RDF.type || property == '@type'
14111414
term_definitions[property] && term_definitions[property].type_mapping
14121415
end
14131416

lib/json/ld/expand.rb

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
# -*- encoding: utf-8 -*-
22
# frozen_string_literal: true
3+
require 'set'
4+
35
module JSON::LD
46
##
57
# Expand module, used as part of API
@@ -125,6 +127,8 @@ def expand(input, active_property, context, ordered: true)
125127
end
126128

127129
private
130+
CONTAINER_MAPPING_INDEX_ID_TYPE = Set.new(%w(@index @id @type)).freeze
131+
128132
# Expand each key and value of element adding them to result
129133
def expand_object(input, active_property, context, output_object, ordered: false)
130134
framing = @options[:processingMode].include?("expand-frame")
@@ -366,7 +370,7 @@ def expand_object(input, active_property, context, output_object, ordered: false
366370
end
367371

368372
ary
369-
elsif %w(@index @id @type).include?(container) && value.is_a?(Hash)
373+
elsif CONTAINER_MAPPING_INDEX_ID_TYPE.include?(container) && value.is_a?(Hash)
370374
# Otherwise, if key's container mapping in active context is @index, @id, @type, an IRI or Blank Node and value is a JSON object then value is expanded from an index map as follows:
371375

372376
# Set ary to an empty array.

lib/json/ld/frame.rb

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
# -*- encoding: utf-8 -*-
22
# frozen_string_literal: true
3+
require 'set'
4+
35
module JSON::LD
46
module Frame
57
include Utils
@@ -96,7 +98,7 @@ def frame(state, subjects, frame, **options)
9698
recurse, subframe = (state[:graph] != '@merged'), {}
9799
else
98100
subframe = frame['@graph'].first
99-
recurse = !%w(@merged @default).include?(id)
101+
recurse = !(id == '@merged' || id == '@default')
100102
subframe = {} unless subframe.is_a?(Hash)
101103
end
102104

@@ -267,6 +269,8 @@ def filter_subjects(state, subjects, frame, flags)
267269
end
268270
end
269271

272+
EXCLUDED_FRAMING_KEYWORDS = Set.new(%w(@default @embed @explicit @omitDefault @requireAll)).freeze
273+
270274
##
271275
# Returns true if the given node matches the given frame.
272276
#
@@ -320,7 +324,7 @@ def filter_subject(subject, frame, state, flags)
320324
validate_frame(v)
321325
has_default = v.has_key?('@default')
322326
# Exclude framing keywords
323-
v = v.dup.delete_if {|kk,vv| %w(@default @embed @explicit @omitDefault @requireAll).include?(kk)}
327+
v = v.dup.delete_if {|kk,vv| EXCLUDED_FRAMING_KEYWORDS.include?(kk)}
324328
end
325329

326330

lib/json/ld/resource.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ def update_obj(obj, reference_map)
188188

189189
#$logger.debug "resolve(0): #{attributes.inspect}"
190190
@attributes.each do |k, v|
191-
next if %w(id type).include?(k)
191+
next if k == 'id' || k == 'type'
192192
@attributes[k] = update_obj(@attributes[k], reference_map)
193193
end
194194
#$logger.debug "resolve(1): #{attributes.inspect}"

0 commit comments

Comments
 (0)