Sha256: a437949cd435261f1bd02274513b677b17c8b8e1871393202a4d37a728ac90a3

Contents?: true

Size: 1.32 KB

Versions: 21

Compression:

Stored size: 1.32 KB

Contents

module JMESPath
  # @api private
  module Nodes
    class Subexpression < Node
      def initialize(left, right)
        @left = left
        @right = right
      end

      def visit(value)
        @right.visit(@left.visit(value))
      end

      def optimize
        Chain.new(flatten).optimize
      end

      protected

      attr_reader :left, :right

      def flatten
        nodes = [@left, @right]
        until nodes.none? { |node| node.is_a?(Subexpression) }
          nodes = nodes.flat_map do |node|
            if node.is_a?(Subexpression)
              [node.left, node.right]
            else
              [node]
            end
          end
        end
        nodes.map(&:optimize)
      end
    end

    class Chain
      def initialize(children)
        @children = children
      end

      def visit(value)
        @children.reduce(value) do |v, child|
          child.visit(v)
        end
      end

      def optimize
        children = @children.map(&:optimize)
        index = 0
        while index < children.size - 1
          if children[index].chains_with?(children[index + 1])
            children[index] = children[index].chain(children[index + 1])
            children.delete_at(index + 1)
          else
            index += 1
          end
        end
        Chain.new(children)
      end
    end
  end
end

Version data entries

21 entries across 21 versions & 3 rubygems

Version Path
jmespath-1.6.1 lib/jmespath/nodes/subexpression.rb
jmespath-1.6.0 lib/jmespath/nodes/subexpression.rb
jmespath-1.5.0 lib/jmespath/nodes/subexpression.rb
jmespath-1.4.0 lib/jmespath/nodes/subexpression.rb
ivanvc-logstash-input-s3-3.1.1.4 vendor/local/gems/jmespath-1.3.1/lib/jmespath/nodes/subexpression.rb
ivanvc-logstash-input-s3-3.1.1.3 vendor/local/gems/jmespath-1.3.1/lib/jmespath/nodes/subexpression.rb
ivanvc-logstash-input-s3-3.1.1.2 vendor/local/gems/jmespath-1.3.1/lib/jmespath/nodes/subexpression.rb
jmespath-1.3.1 lib/jmespath/nodes/subexpression.rb
jmespath-1.3.0 lib/jmespath/nodes/subexpression.rb
jmespath-1.2.4 lib/jmespath/nodes/subexpression.rb
jmespath-1.2.3 lib/jmespath/nodes/subexpression.rb
jmespath-1.2.2 lib/jmespath/nodes/subexpression.rb
jmespath-1.2.1 lib/jmespath/nodes/subexpression.rb
jmespath-1.2 lib/jmespath/nodes/subexpression.rb
burtpath-1.1.2 lib/jmespath/nodes/subexpression.rb
burtpath-1.1.1 lib/jmespath/nodes/subexpression.rb
jmespath-1.1.3 lib/jmespath/nodes/subexpression.rb
jmespath-1.1.2 lib/jmespath/nodes/subexpression.rb
jmespath-1.1.1 lib/jmespath/nodes/subexpression.rb
jmespath-1.1.0 lib/jmespath/nodes/subexpression.rb