Class: ActiveFacts::CQL::Compiler::SetConstraint

Inherits:
Constraint show all
Defined in:
lib/activefacts/cql/compiler/constraint.rb

Direct Known Subclasses

SetComparisonConstraint, SubsetConstraint

Instance Attribute Summary

Attributes inherited from Definition

#constellation, #tree, #vocabulary

Instance Method Summary collapse

Methods inherited from Constraint

#bind_clauses, #common_bindings, #compile, #loose_bind, #loose_bind_wherever_possible, #loose_binding, #to_s

Methods inherited from Definition

#all_bindings_in_clauses, #build_all_steps, #build_steps, #build_variables, #compile, #source, #to_s

Constructor Details

#initialize(context_note, enforcement, clauses_lists) ⇒ SetConstraint

Returns a new instance of SetConstraint.



260
261
262
# File 'lib/activefacts/cql/compiler/constraint.rb', line 260

def initialize context_note, enforcement, clauses_lists
  super context_note, enforcement, clauses_lists
end

Instance Method Details

#role_sequences_for_common_bindings(ignore_trailing_steps = false) ⇒ Object



268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
# File 'lib/activefacts/cql/compiler/constraint.rb', line 268

def role_sequences_for_common_bindings ignore_trailing_steps = false
  @clauses_lists.
      zip(@bindings_by_list).
      map do |clauses_list, bindings|
    # Does this clauses_list involve a query?
    if clauses_list.size > 1 or
      clauses_list.detect do |clause|
		clause.refs.detect{|ref| ref.nested_clauses } or
		clause.includes_literals
	      end

      debug :query, "Building query for #{clauses_list.inspect}" do
        debug :query, "Constrained bindings are #{@common_bindings.inspect}"
        # Every Binding in these clauses becomes a Variable,
        # and every clause becomes a Step (and a RoleSequence).
        # The returned RoleSequences contains the RoleRefs for the common_bindings.

        # Create a query with a variable for every binding and all steps:
        query = build_variables(clauses_list)
        roles_by_binding = build_all_steps(clauses_list)
        query.validate

        # Create the projected RoleSequence for the constraint:
        role_sequence = @constellation.RoleSequence(:new)
        @common_bindings.each do |binding|
          role, play = *roles_by_binding[binding]
          @constellation.RoleRef(role_sequence, role_sequence.all_role_ref.size, :role => role, :play => play)
        end

        role_sequence
      end
    else
      # There's no query in this clauses_list, just create a role_sequence
      role_sequence = @constellation.RoleSequence(:new)
      query_bindings = bindings-@common_bindings
      unless query_bindings.empty? or ignore_trailing_steps && query_bindings.size <= 1
        debug :constraint, "REVISIT: #{self.class}: Ignoring query from #{@common_bindings.inspect} to #{query_bindings.inspect} in #{clauses_list.inspect}"
      end
      @common_bindings.each do |binding|
        roles = clauses_list.
          map do |clause|
            clause.refs.detect{|vr| vr.binding == binding }
          end.
          compact.  # A query clause will probably not have the common binding
          map do |ref|
            ref.role_ref && ref.role_ref.role or ref.role
          end.
          compact
        # REVISIT: Should use clause side effects to preserve residual adjectives here.
        @constellation.RoleRef(role_sequence, role_sequence.all_role_ref.size, :role => roles[0])
      end
      role_sequence
    end
  end
end

#warn_ignored_queriesObject



264
265
266
# File 'lib/activefacts/cql/compiler/constraint.rb', line 264

def warn_ignored_queries
  # No warnings needed here any more
end