Class: PuppetDB::ASTNode

Inherits:
Object
  • Object
show all
Defined in:
lib/puppetdb/astnode.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(type, value, children = []) ⇒ ASTNode

Returns a new instance of ASTNode.



4
5
6
7
8
# File 'lib/puppetdb/astnode.rb', line 4

def initialize(type, value, children=[])
  @type = type
  @value = value
  @children = children
end

Instance Attribute Details

#childrenObject

Returns the value of attribute children.



2
3
4
# File 'lib/puppetdb/astnode.rb', line 2

def children
  @children
end

#typeObject

Returns the value of attribute type.



2
3
4
# File 'lib/puppetdb/astnode.rb', line 2

def type
  @type
end

#valueObject

Returns the value of attribute value.



2
3
4
# File 'lib/puppetdb/astnode.rb', line 2

def value
  @value
end

Instance Method Details

#capitalize!Object



10
11
12
13
14
# File 'lib/puppetdb/astnode.rb', line 10

def capitalize!
  @value=@value.to_s.split("::").collect { |s| s.capitalize }.join("::")
  @children.each { |c| c.capitalize! }
  return self
end

#evaluate(mode = :nodes) ⇒ Array

Evalutate the node and all children

Parameters:

  • mode (Symbol) (defaults to: :nodes)

    The query mode we are evaluating for

Returns:

  • (Array)

    the resulting PuppetDB query



57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# File 'lib/puppetdb/astnode.rb', line 57

def evaluate(mode = :nodes)
  case @type
  when :booleanop
    return [@value.to_s, *evaluate_children(mode)]
  when :subquery
    return subquery(mode, @value, *evaluate_children(@value))
  when :exp
    case @value
    when :equals      then op = '='
    when :greaterthan then op = '>'
    when :lessthan    then op = '<'
    when :match       then op = '~'
    end

    case mode
    when :nodes,:facts # Do a subquery to match nodes matching the facts
      return subquery(mode, :facts, ['and', ['=', 'name', @children[0].evaluate(mode)], [op, 'value', @children[1].evaluate(mode)]])
    when :resources
      return [op, ['parameter', @children[0].evaluate(mode)], @children[1].evaluate(mode)]
    end
  when :string
    return @value.to_s
  when :number
    return @value
  when :boolean
    return @value
  when :resourcetitle
    return [@value, 'title', @children[0].evaluate(mode)]
  when :resourcetype
    return ['=', 'type', @value]
  when :resexported
    return ['=', 'exported', @value]
  end
end

#evaluate_children(mode) ⇒ Array

Evaluate all children nodes

Returns:

  • (Array)

    The evaluate results of the children nodes



95
96
97
# File 'lib/puppetdb/astnode.rb', line 95

def evaluate_children(mode)
  return children.collect { |c| c.evaluate mode }
end

#optimizeObject

Go through the AST and optimize boolean expressions into triplets etc Changes the AST in place

Returns:

  • The optimized AST



39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/puppetdb/astnode.rb', line 39

def optimize
  case @type
  when :booleanop
    @children.each do |c|
      if c.type == :booleanop and c.value == @value
        c.children.each { |cc| @children << cc }
        @children.delete c
      end
    end
  end
  @children.each { |c| c.optimize }
  return self
end

#subquery(from_mode, to_mode, query) ⇒ Array

Generate the the query code for a subquery

As a special case, the from_mode of :none will not wrap the subquery at all, returning it as is.

Parameters:

  • from_mode (Symbol)

    the mode you want to subquery from

  • to_mode (Symbol)

    the mode you want to subquery to

  • query

    the query inside the subquery

Returns:

  • (Array)

    the resulting subquery



25
26
27
28
29
30
31
32
33
# File 'lib/puppetdb/astnode.rb', line 25

def subquery(from_mode, to_mode, query)
  if from_mode == :none
    return query
  else
    return ['in', (from_mode == :nodes) ? 'name' : 'certname',
      ['extract', (to_mode == :nodes) ? 'name' : 'certname',
        ["select-#{to_mode.to_s}", query]]]
  end
end