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:



28
29
30
31
32
33
34
35
# File 'lib/lutaml/uml_repository/query_dsl/query_builder.rb', line 28

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



163
164
165
# File 'lib/lutaml/uml_repository/query_dsl/query_builder.rb', line 163

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



199
200
201
# File 'lib/lutaml/uml_repository/query_dsl/query_builder.rb', line 199

def any?
  execute.any?
end

#classesQueryBuilder

Start a class query

Examples:

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

Returns:



42
43
44
45
# File 'lib/lutaml/uml_repository/query_dsl/query_builder.rb', line 42

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



190
191
192
# File 'lib/lutaml/uml_repository/query_dsl/query_builder.rb', line 190

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



208
209
210
# File 'lib/lutaml/uml_repository/query_dsl/query_builder.rb', line 208

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



149
150
151
152
153
154
155
156
# File 'lib/lutaml/uml_repository/query_dsl/query_builder.rb', line 149

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



172
173
174
# File 'lib/lutaml/uml_repository/query_dsl/query_builder.rb', line 172

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:



101
102
103
104
105
# File 'lib/lutaml/uml_repository/query_dsl/query_builder.rb', line 101

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:



139
140
141
142
# File 'lib/lutaml/uml_repository/query_dsl/query_builder.rb', line 139

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



181
182
183
# File 'lib/lutaml/uml_repository/query_dsl/query_builder.rb', line 181

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:



128
129
130
131
# File 'lib/lutaml/uml_repository/query_dsl/query_builder.rb', line 128

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:



117
118
119
120
# File 'lib/lutaml/uml_repository/query_dsl/query_builder.rb', line 117

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:



52
53
54
55
# File 'lib/lutaml/uml_repository/query_dsl/query_builder.rb', line 52

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:



72
73
74
75
76
77
78
79
# File 'lib/lutaml/uml_repository/query_dsl/query_builder.rb', line 72

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:



87
88
89
# File 'lib/lutaml/uml_repository/query_dsl/query_builder.rb', line 87

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