Class: ElasticGraph::SchemaDefinition::JSONSchemaPruner

Inherits:
Object
  • Object
show all
Defined in:
lib/elastic_graph/schema_definition/json_schema_pruner.rb

Overview

Prunes unused type definitions from a given JSON schema.

Class Method Summary collapse

Class Method Details

.collect_ref_names(hash) ⇒ Object



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/elastic_graph/schema_definition/json_schema_pruner.rb', line 41

def self.collect_ref_names(hash)
  hash.flat_map do |key, value|
    case value
    when ::Hash
      collect_ref_names(value)
    when ::Array
      value.grep(::Hash).flat_map { |subhash| collect_ref_names(subhash) }
    when ::String
      if key == "$ref" && (type = value[%r{\A#/\$defs/(.+)\z}, 1])
        [type]
      else
        []
      end
    else
      []
    end
  end
end

.prune(original_json_schema) ⇒ Object



17
18
19
20
21
22
23
24
25
26
27
# File 'lib/elastic_graph/schema_definition/json_schema_pruner.rb', line 17

def self.prune(original_json_schema)
  initial_type_names = [EVENT_ENVELOPE_JSON_SCHEMA_NAME] + original_json_schema
    .dig("$defs", EVENT_ENVELOPE_JSON_SCHEMA_NAME, "properties", "type", "enum")

  types_to_keep = referenced_type_names(initial_type_names, original_json_schema["$defs"])

  # The .select will preserve the sort order of the original hash
  pruned_defs = original_json_schema["$defs"].select { |k, _v| types_to_keep.include?(k) }

  original_json_schema.merge("$defs" => pruned_defs)
end

.referenced_type_names(source_type_names, original_defs) ⇒ Object



31
32
33
34
35
36
37
38
# File 'lib/elastic_graph/schema_definition/json_schema_pruner.rb', line 31

def self.referenced_type_names(source_type_names, original_defs)
  return Set.new if source_type_names.empty?

  referenced_type_defs = original_defs.select { |k, _| source_type_names.include?(k) }
  ref_names = collect_ref_names(referenced_type_defs)

  referenced_type_names(ref_names, original_defs) + source_type_names
end