Class: Lutaml::UmlRepository::QueryDSL::QueryBuilder

Inherits:
Object
  • Object
show all
Defined in:
lib/lutaml/uml_repository/query_dsl/query_builder.rb

Overview

Fluent query builder for advanced queries against UML repositories

Provides a domain-specific language for building complex queries with method chaining, lazy evaluation, and composable filters.

Examples:

Basic class query

results = repo.query do |q|
  q.classes.where(stereotype: 'featureType')
end.all

Complex query with chaining

results = repo.query do |q|
  q.classes
    .in_package('ModelRoot::i-UR', recursive: true)
    .where { |c| c.attributes&.size.to_i > 10 }
    .order_by(:name, direction: :desc)
    .limit(5)
end.execute

Instance Method Summary collapse

Constructor Details

#initialize(repository) ⇒ QueryBuilder

Initialize a new query builder

Parameters:



34
35
36
37
38
39
40
41
# File 'lib/lutaml/uml_repository/query_dsl/query_builder.rb', line 34

def initialize(repository)
  @repository = repository
  @conditions = []
  @scope = nil
  @order = nil
  @limit = nil
  @includes = []
end

Instance Method Details

#allArray

Alias for execute

Examples:

results = builder.classes.all

Returns:

  • (Array)

    The query results



169
170
171
# File 'lib/lutaml/uml_repository/query_dsl/query_builder.rb', line 169

def all
  execute
end

#any?Boolean

Check if any results exist

Examples:

has_results = builder.classes.with_stereotype('featureType').any?

Returns:

  • (Boolean)

    true if results exist, false otherwise



205
206
207
# File 'lib/lutaml/uml_repository/query_dsl/query_builder.rb', line 205

def any?
  execute.any?
end

#classesQueryBuilder

Start a class query

Examples:

builder.classes.where(stereotype: 'featureType')

Returns:



48
49
50
51
# File 'lib/lutaml/uml_repository/query_dsl/query_builder.rb', line 48

def classes
  @scope = :classes
  self
end

#countInteger

Count the number of results

Examples:

count = builder.classes.with_stereotype('featureType').count

Returns:

  • (Integer)

    The count of matching results



196
197
198
# File 'lib/lutaml/uml_repository/query_dsl/query_builder.rb', line 196

def count
  execute.size
end

#empty?Boolean

Check if no results exist

Examples:

is_empty = builder.classes.with_stereotype('nonexistent').empty?

Returns:

  • (Boolean)

    true if no results exist, false otherwise



214
215
216
# File 'lib/lutaml/uml_repository/query_dsl/query_builder.rb', line 214

def empty?
  execute.empty?
end

#executeArray

Execute the query and return all results

Examples:

results = builder.classes.where(stereotype: 'featureType').execute

Returns:

  • (Array)

    The query results



155
156
157
158
159
160
161
162
# File 'lib/lutaml/uml_repository/query_dsl/query_builder.rb', line 155

def execute
  results = fetch_base_results
  results = apply_conditions(results)
  results = apply_order(results) if @order
  results = apply_limit(results) if @limit
  results = apply_includes(results) if @includes.any?
  results
end

#firstObject?

Get the first result

Examples:

first_class = builder.classes.with_stereotype('featureType').first

Returns:

  • (Object, nil)

    The first result or nil if none



178
179
180
# File 'lib/lutaml/uml_repository/query_dsl/query_builder.rb', line 178

def first
  limit(1).execute.first
end

#in_package(package_path, recursive: false) ⇒ QueryBuilder

Filter by package membership

Examples:

Non-recursive

builder.in_package('ModelRoot::i-UR')

Recursive

builder.in_package('ModelRoot::i-UR', recursive: true)

Parameters:

  • package_path (String, PackagePath)

    The package path

  • recursive (Boolean) (defaults to: false)

    Include descendants (default: false)

Returns:



107
108
109
110
111
# File 'lib/lutaml/uml_repository/query_dsl/query_builder.rb', line 107

def in_package(package_path, recursive: false)
  @conditions << Conditions::PackageCondition.new(package_path,
                                                  recursive: recursive)
  self
end

#includes(*relations) ⇒ QueryBuilder

Specify related data to include (placeholder for future enhancement)

Examples:

builder.includes(:attributes, :associations)

Parameters:

  • relations (Array<Symbol>)

    Relations to eager load

Returns:



145
146
147
148
# File 'lib/lutaml/uml_repository/query_dsl/query_builder.rb', line 145

def includes(*relations)
  @includes.concat(relations)
  self
end

#lastObject?

Get the last result

Examples:

last_class = builder.classes.order_by(:name).last

Returns:

  • (Object, nil)

    The last result or nil if none



187
188
189
# File 'lib/lutaml/uml_repository/query_dsl/query_builder.rb', line 187

def last
  execute.last
end

#limit(count) ⇒ QueryBuilder

Limit the number of results

Examples:

builder.limit(10)

Parameters:

  • count (Integer)

    Maximum number of results

Returns:



134
135
136
137
# File 'lib/lutaml/uml_repository/query_dsl/query_builder.rb', line 134

def limit(count)
  @limit = count
  self
end

#order_by(field, direction: :asc) ⇒ QueryBuilder

Order results by a field

Examples:

Ascending

builder.order_by(:name)

Descending

builder.order_by(:name, direction: :desc)

Parameters:

  • field (Symbol, String)

    The field to order by

  • direction (Symbol) (defaults to: :asc)

    The direction (:asc or :desc)

Returns:



123
124
125
126
# File 'lib/lutaml/uml_repository/query_dsl/query_builder.rb', line 123

def order_by(field, direction: :asc)
  @order = Order.new(field, direction)
  self
end

#packagesQueryBuilder

Start a package query

Examples:

builder.packages.in_package('ModelRoot')

Returns:



58
59
60
61
# File 'lib/lutaml/uml_repository/query_dsl/query_builder.rb', line 58

def packages
  @scope = :packages
  self
end

#where(conditions = nil, &block) ⇒ QueryBuilder

Add a condition to the query

Supports both hash-based and block-based conditions.

Examples:

Hash condition

builder.where(stereotype: 'featureType')

Block condition

builder.where { |c| c.attributes.size > 10 }

Regex matching

builder.where(name: /^Building/)

Parameters:

  • conditions (Hash, nil) (defaults to: nil)

    Hash of attribute-value pairs to match

  • block (Proc)

    Block for custom filtering logic

Returns:



78
79
80
81
82
83
84
85
# File 'lib/lutaml/uml_repository/query_dsl/query_builder.rb', line 78

def where(conditions = nil, &block)
  if conditions
    @conditions << Conditions::HashCondition.new(conditions)
  elsif block
    @conditions << Conditions::BlockCondition.new(&block)
  end
  self
end

#with_stereotype(stereotype) ⇒ QueryBuilder

Filter by stereotype

Examples:

builder.with_stereotype('featureType')

Parameters:

  • stereotype (String)

    The stereotype to filter by

Returns:



93
94
95
# File 'lib/lutaml/uml_repository/query_dsl/query_builder.rb', line 93

def with_stereotype(stereotype)
  where(stereotype: stereotype)
end