expressir 0.2.7-x86-mingw32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (183) hide show
  1. checksums.yaml +7 -0
  2. data/.cross_rubies +30 -0
  3. data/.github/workflows/rake.yml +45 -0
  4. data/.github/workflows/release.yml +84 -0
  5. data/.gitignore +17 -0
  6. data/.gitmodules +3 -0
  7. data/.rspec +2 -0
  8. data/.rubocop.yml +508 -0
  9. data/Gemfile +4 -0
  10. data/README.adoc +147 -0
  11. data/Rakefile +11 -0
  12. data/bin/console +12 -0
  13. data/bin/rspec +29 -0
  14. data/bin/setup +8 -0
  15. data/demo.rb +18 -0
  16. data/docs/development.md +90 -0
  17. data/exe/expressir +20 -0
  18. data/exe/generate-parser +48 -0
  19. data/expressir.gemspec +43 -0
  20. data/lib/expressir.rb +21 -0
  21. data/lib/expressir/cli.rb +27 -0
  22. data/lib/expressir/cli/ui.rb +36 -0
  23. data/lib/expressir/config.rb +23 -0
  24. data/lib/expressir/express.rb +11 -0
  25. data/lib/expressir/express/aggregate_dimension.rb +38 -0
  26. data/lib/expressir/express/attribute.rb +15 -0
  27. data/lib/expressir/express/comment.rb +7 -0
  28. data/lib/expressir/express/defined_type.rb +36 -0
  29. data/lib/expressir/express/derived.rb +65 -0
  30. data/lib/expressir/express/derived_aggregate.rb +43 -0
  31. data/lib/expressir/express/entity.rb +137 -0
  32. data/lib/expressir/express/explicit.rb +70 -0
  33. data/lib/expressir/express/explicit_aggregate.rb +46 -0
  34. data/lib/expressir/express/explicit_or_derived.rb +16 -0
  35. data/lib/expressir/express/global_rule.rb +44 -0
  36. data/lib/expressir/express/interface_specification.rb +51 -0
  37. data/lib/expressir/express/interfaced_item.rb +38 -0
  38. data/lib/expressir/express/inverse.rb +46 -0
  39. data/lib/expressir/express/inverse_aggregate.rb +37 -0
  40. data/lib/expressir/express/model_element.rb +7 -0
  41. data/lib/expressir/express/named_type.rb +19 -0
  42. data/lib/expressir/express/remark.rb +8 -0
  43. data/lib/expressir/express/repository.rb +306 -0
  44. data/lib/expressir/express/schema_definition.rb +96 -0
  45. data/lib/expressir/express/subtype_constraint.rb +14 -0
  46. data/lib/expressir/express/type.rb +26 -0
  47. data/lib/expressir/express/type_aggregate.rb +42 -0
  48. data/lib/expressir/express/type_enum.rb +29 -0
  49. data/lib/expressir/express/type_parser.rb +45 -0
  50. data/lib/expressir/express/type_select.rb +82 -0
  51. data/lib/expressir/express/unique_rule.rb +35 -0
  52. data/lib/expressir/express/where_rule.rb +32 -0
  53. data/lib/expressir/express_exp/2.4/express_parser.so +0 -0
  54. data/lib/expressir/express_exp/2.5/express_parser.so +0 -0
  55. data/lib/expressir/express_exp/2.6/express_parser.so +0 -0
  56. data/lib/expressir/express_exp/2.7/express_parser.so +0 -0
  57. data/lib/expressir/express_exp/3.0/express_parser.so +0 -0
  58. data/lib/expressir/express_exp/formatter.rb +1450 -0
  59. data/lib/expressir/express_exp/parser.rb +41 -0
  60. data/lib/expressir/express_exp/visitor.rb +2464 -0
  61. data/lib/expressir/express_parser.rb +30 -0
  62. data/lib/expressir/model.rb +65 -0
  63. data/lib/expressir/model/attribute.rb +27 -0
  64. data/lib/expressir/model/constant.rb +17 -0
  65. data/lib/expressir/model/entity.rb +46 -0
  66. data/lib/expressir/model/enumeration_item.rb +11 -0
  67. data/lib/expressir/model/expressions/aggregate_initializer.rb +13 -0
  68. data/lib/expressir/model/expressions/aggregate_item.rb +15 -0
  69. data/lib/expressir/model/expressions/attribute_reference.rb +15 -0
  70. data/lib/expressir/model/expressions/binary_expression.rb +40 -0
  71. data/lib/expressir/model/expressions/call.rb +15 -0
  72. data/lib/expressir/model/expressions/entity_constructor.rb +15 -0
  73. data/lib/expressir/model/expressions/group_reference.rb +15 -0
  74. data/lib/expressir/model/expressions/index_reference.rb +17 -0
  75. data/lib/expressir/model/expressions/interval.rb +21 -0
  76. data/lib/expressir/model/expressions/query_expression.rb +26 -0
  77. data/lib/expressir/model/expressions/simple_reference.rb +13 -0
  78. data/lib/expressir/model/expressions/unary_expression.rb +19 -0
  79. data/lib/expressir/model/function.rb +62 -0
  80. data/lib/expressir/model/identifier.rb +10 -0
  81. data/lib/expressir/model/interface.rb +18 -0
  82. data/lib/expressir/model/literals/binary.rb +13 -0
  83. data/lib/expressir/model/literals/integer.rb +13 -0
  84. data/lib/expressir/model/literals/logical.rb +17 -0
  85. data/lib/expressir/model/literals/real.rb +13 -0
  86. data/lib/expressir/model/literals/string.rb +15 -0
  87. data/lib/expressir/model/parameter.rb +17 -0
  88. data/lib/expressir/model/procedure.rb +60 -0
  89. data/lib/expressir/model/renamed_ref.rb +13 -0
  90. data/lib/expressir/model/repository.rb +19 -0
  91. data/lib/expressir/model/rule.rb +62 -0
  92. data/lib/expressir/model/schema.rb +67 -0
  93. data/lib/expressir/model/scope.rb +17 -0
  94. data/lib/expressir/model/statements/alias.rb +26 -0
  95. data/lib/expressir/model/statements/assignment.rb +15 -0
  96. data/lib/expressir/model/statements/call.rb +15 -0
  97. data/lib/expressir/model/statements/case.rb +17 -0
  98. data/lib/expressir/model/statements/case_action.rb +15 -0
  99. data/lib/expressir/model/statements/compound.rb +13 -0
  100. data/lib/expressir/model/statements/escape.rb +8 -0
  101. data/lib/expressir/model/statements/if.rb +17 -0
  102. data/lib/expressir/model/statements/null.rb +8 -0
  103. data/lib/expressir/model/statements/repeat.rb +34 -0
  104. data/lib/expressir/model/statements/return.rb +13 -0
  105. data/lib/expressir/model/statements/skip.rb +8 -0
  106. data/lib/expressir/model/subtype_constraint.rb +27 -0
  107. data/lib/expressir/model/type.rb +24 -0
  108. data/lib/expressir/model/types/aggregate.rb +17 -0
  109. data/lib/expressir/model/types/array.rb +21 -0
  110. data/lib/expressir/model/types/bag.rb +17 -0
  111. data/lib/expressir/model/types/binary.rb +15 -0
  112. data/lib/expressir/model/types/boolean.rb +8 -0
  113. data/lib/expressir/model/types/enumeration.rb +19 -0
  114. data/lib/expressir/model/types/generic.rb +13 -0
  115. data/lib/expressir/model/types/generic_entity.rb +13 -0
  116. data/lib/expressir/model/types/integer.rb +8 -0
  117. data/lib/expressir/model/types/list.rb +19 -0
  118. data/lib/expressir/model/types/logical.rb +8 -0
  119. data/lib/expressir/model/types/number.rb +8 -0
  120. data/lib/expressir/model/types/real.rb +13 -0
  121. data/lib/expressir/model/types/select.rb +21 -0
  122. data/lib/expressir/model/types/set.rb +17 -0
  123. data/lib/expressir/model/types/string.rb +15 -0
  124. data/lib/expressir/model/unique.rb +15 -0
  125. data/lib/expressir/model/variable.rb +17 -0
  126. data/lib/expressir/model/where.rb +15 -0
  127. data/lib/expressir/parser.rb +6 -0
  128. data/lib/expressir/parser/owl_parser.rb +8 -0
  129. data/lib/expressir/version.rb +3 -0
  130. data/original/examples/ap233/ap233e1_arm_lf_stepmod-2010-11-12.exp +9589 -0
  131. data/original/examples/ap233/ap233e1_arm_lf_stepmod-2010-11-12.owl +36619 -0
  132. data/original/examples/ap233/ap233e1_arm_lf_stepmod-2010-11-12.xml +13294 -0
  133. data/original/examples/employment/eclipse/.project +17 -0
  134. data/original/examples/employment/eclipse/Export/Employment.png +0 -0
  135. data/original/examples/employment/eclipse/Express/employment_schema.exp +33 -0
  136. data/original/examples/employment/eclipse/Express/employment_schema.xmi +77 -0
  137. data/original/examples/employment/eclipse/Express/employment_schema.xml +93 -0
  138. data/original/examples/employment/eclipse/Models/Employment.uml +4 -0
  139. data/original/examples/employment/eclipse/Models/Employment.umldi +240 -0
  140. data/original/examples/employment/eclipse/readme.txt +7 -0
  141. data/original/examples/employment/employment_schema.exp +33 -0
  142. data/original/examples/employment/employment_schema.rb +232 -0
  143. data/original/examples/employment/employment_schema.xml +93 -0
  144. data/original/examples/employment/employment_schema___module.rb +46 -0
  145. data/original/examples/employment/employment_schema___p28attr.rb +126 -0
  146. data/original/examples/employment/employment_schema___p28inst.rb +26 -0
  147. data/original/examples/employment/example_employment_data.xml +1 -0
  148. data/original/examples/employment/example_employment_data_copy.xml +1 -0
  149. data/original/examples/employment/example_employment_reader.rb +30 -0
  150. data/original/examples/employment/example_employment_writer.rb +51 -0
  151. data/original/examples/plcs/ap239e1_arm_lf_dexlib_2010-01-06.exp +3710 -0
  152. data/original/examples/plcs/ap239e1_arm_lf_dexlib_2010-01-06.owl +35880 -0
  153. data/original/examples/plcs/ap239e1_arm_lf_dexlib_2010-01-06.xmi +15357 -0
  154. data/original/examples/plcs/ap239e1_arm_lf_dexlib_2010-01-06.xml +9468 -0
  155. data/original/examples/plcs/ap239e2_arm_lf_stepmod-2010-01-25.exp +8404 -0
  156. data/original/examples/plcs/ap239e2_arm_lf_stepmod-2010-01-25.owl +43147 -0
  157. data/original/examples/plcs/ap239e2_arm_lf_stepmod-2010-01-25.xmi +18341 -0
  158. data/original/examples/plcs/ap239e2_arm_lf_stepmod-2010-01-25.xml +11632 -0
  159. data/original/examples/syntax/remark.exp +146 -0
  160. data/original/examples/syntax/remark_formatted.exp +175 -0
  161. data/original/examples/syntax/syntax.exp +311 -0
  162. data/original/examples/syntax/syntax_formatted.exp +1191 -0
  163. data/original/exp2ruby.rb +525 -0
  164. data/original/expsm.rb +34 -0
  165. data/original/mapping_owl.rb +1018 -0
  166. data/original/mapping_sysml.rb +2281 -0
  167. data/original/mapping_uml2.rb +599 -0
  168. data/original/mapping_uml2_eclipse.rb +433 -0
  169. data/original/reeper.rb +134 -0
  170. data/rakelib/cross-ruby.rake +308 -0
  171. data/spec/acceptance/express_to_owl_spec.rb +18 -0
  172. data/spec/acceptance/version_spec.rb +12 -0
  173. data/spec/expressir/express/repository_spec.rb +25 -0
  174. data/spec/expressir/express_exp/ap233_spec.rb +22 -0
  175. data/spec/expressir/express_exp/format_remark_spec.rb +28 -0
  176. data/spec/expressir/express_exp/format_syntax_spec.rb +28 -0
  177. data/spec/expressir/express_exp/parse_remark_spec.rb +346 -0
  178. data/spec/expressir/express_exp/parse_syntax_spec.rb +3003 -0
  179. data/spec/expressir/model/find_spec.rb +110 -0
  180. data/spec/expressr_spec.rb +5 -0
  181. data/spec/spec_helper.rb +17 -0
  182. data/spec/support/console_helper.rb +29 -0
  183. metadata +357 -0
@@ -0,0 +1,27 @@
1
+ require "thor"
2
+ require "expressir/cli/ui"
3
+ require "expressir/express_parser"
4
+
5
+ module Expressir
6
+ module Cli
7
+ def self.ui
8
+ Expressir::Cli::UI
9
+ end
10
+
11
+ def self.start(args)
12
+ Base.start(args)
13
+ end
14
+
15
+ class Base < Thor
16
+ desc "version", "The Expressir Version"
17
+ def version
18
+ Cli.ui.say("Version #{Expressir::VERSION}")
19
+ end
20
+
21
+ desc "express-to-owl FILE", "Express to OWL conversion"
22
+ def express_to_owl(file)
23
+ Cli.ui.say(ExpressParser.to_owl(file))
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,36 @@
1
+ require "thor"
2
+
3
+ module Expressir
4
+ module Cli
5
+ class UI < Thor
6
+ def self.ask(message)
7
+ new.ask(message)
8
+ end
9
+
10
+ def self.say(message)
11
+ new.say(message)
12
+ end
13
+
14
+ def self.error(message)
15
+ if log_types.include?("error")
16
+ new.error(message)
17
+ end
18
+ end
19
+
20
+ def self.info(message)
21
+ if log_types.include?("info")
22
+ new.say(message)
23
+ end
24
+ end
25
+
26
+ def self.run(command)
27
+ require "open3"
28
+ Open3.capture3(command)
29
+ end
30
+
31
+ def self.log_types
32
+ Expressir.configuration.logs.map(&:to_s) || []
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,23 @@
1
+ module Expressir
2
+ module Config
3
+ def configure
4
+ if block_given?
5
+ yield configuration
6
+ end
7
+ end
8
+
9
+ def configuration
10
+ @configuration ||= Configuration.new
11
+ end
12
+ end
13
+
14
+ class Configuration
15
+ attr_accessor :logs
16
+
17
+ def initialize
18
+ @logs ||= %i(error)
19
+ end
20
+ end
21
+
22
+ extend Config
23
+ end
@@ -0,0 +1,11 @@
1
+ require "nokogiri"
2
+ require "expressir/express/repository"
3
+ require "expressir/express/schema_definition"
4
+
5
+ module Expressir
6
+ module Express
7
+ def self.from_xml(file)
8
+ Expressir::Express::Repository.from_xml(file)
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,38 @@
1
+ module Expressir
2
+ module Express
3
+ class AggregateDimension
4
+ attr_accessor :aggrtype, :lower, :upper, :isUnique, :isOptionalArray
5
+
6
+ def initialize(options = {})
7
+ @aggrtype = "SET"
8
+ @lower = "0"
9
+ @upper = "?"
10
+ @isUnique = false
11
+ @isOptionalArray = false
12
+
13
+ @options = options
14
+ end
15
+
16
+ def parse
17
+ document = @options.fetch(:document, nil)
18
+ extract_attributes(document) if document
19
+
20
+ self
21
+ end
22
+
23
+ def self.parse(document)
24
+ new(document: document).parse
25
+ end
26
+
27
+ private
28
+
29
+ def extract_attributes(document)
30
+ @aggrtype = document.attributes["type"]
31
+ @lower = document.attributes["lower"]
32
+ @upper = document.attributes["upper"]
33
+ @isUnique = document.attributes["unique"] == "YES"
34
+ @isOptionalArray = document.attributes["optional"] == "YES"
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,15 @@
1
+ require "expressir/express/model_element"
2
+
3
+ module Expressir
4
+ module Express
5
+ class Attribute < ModelElement
6
+ attr_accessor :name, :entity, :domain, :redeclare_entity,
7
+ :redeclare_oldname
8
+
9
+ def initialize
10
+ @redeclare_entity = nil
11
+ @redeclare_oldname = nil
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,7 @@
1
+ module Expressir
2
+ module Express
3
+ class Comment
4
+ attr_accessor :comment, :ModelElement
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,36 @@
1
+ require "expressir/express/named_type"
2
+
3
+ module Expressir
4
+ module Express
5
+ class DefinedType < NamedType
6
+ def initialize(options = {})
7
+ @options = options
8
+ @schema = options.fetch(:schema)
9
+ end
10
+
11
+ def parse
12
+ document = @options.fetch(:document)
13
+ extract_type_attributes(document)
14
+
15
+ self
16
+ end
17
+
18
+ def self.parse(document, schema)
19
+ new(document: document, schema: schema).parse
20
+ end
21
+
22
+ private
23
+
24
+ def extract_type_attributes(document)
25
+ @name = document.attributes["name"].to_s
26
+ @wheres = extract_where_rules(document)
27
+ end
28
+
29
+ def extract_where_rules(document)
30
+ document.xpath("where").map do |where|
31
+ Express::WhereRule.parse(where)
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,65 @@
1
+ module Expressir
2
+ module Express
3
+ class Derived < ExplicitOrDerived
4
+ attr_accessor :expression
5
+
6
+ def initialize(options = {})
7
+ @options = options
8
+ @entity = options.fetch(:entity, nil)
9
+ end
10
+
11
+ def parse
12
+ document = @options.fetch(:document, nil)
13
+ extract_common_attributes(document)
14
+ extract_type_specific_attributes(document)
15
+
16
+ self
17
+ end
18
+
19
+ def self.parse(document, entity)
20
+ new(document: document, entity: entity).parse
21
+ end
22
+
23
+ private
24
+
25
+ def extract_type_specific_attributes(document); end
26
+
27
+ def extract_common_attributes(document)
28
+ @name = document.attributes["name"].to_s
29
+ @expression = document.attributes["expression"].to_s
30
+ @domain = extract_domain_name(document.xpath("typename"))
31
+
32
+ extract_builtintype_attributes(document)
33
+ extract_redeclaration_attributes(document)
34
+ end
35
+
36
+ def extract_domain_name(typename)
37
+ unless typename.empty?
38
+ typename.first.attributes["name"].to_s
39
+ end
40
+ end
41
+
42
+ def extract_redeclaration_attributes(document)
43
+ redeclaration = document.xpath("redeclaration").first
44
+
45
+ if redeclaration
46
+ @redeclare_entity = redeclaration.attributes["entity-ref"].to_s
47
+ old_name = redeclaration.attributes["old_name"]
48
+ @redeclare_oldname = old_name.to_s if old_name
49
+ end
50
+ end
51
+
52
+ def extract_builtintype_attributes(document)
53
+ builtin_type = document.xpath("builtintype").first
54
+
55
+ if builtin_type
56
+ @isBuiltin = true
57
+ @domain = builtin_type.attributes["type"].to_s
58
+ @width = builtin_type.attributes["width"].to_s
59
+ @fixed = builtin_type.attributes["fixed"] == "YES"
60
+ @precision = builtin_type.attributes["precision"].to_s
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,43 @@
1
+ module Expressir
2
+ module Express
3
+ class DerivedAggregate < Derived
4
+ attr_accessor :rank, :dimensions
5
+
6
+ def initialize(options = {})
7
+ @rank = 0
8
+ @dimensions = []
9
+
10
+ super(options)
11
+ end
12
+
13
+ private
14
+
15
+ def extract_type_specific_attributes(document)
16
+ @dimensions = document.xpath("aggregate").map do |aggregate|
17
+ Express::AggregateDimension.parse(aggregate)
18
+ end
19
+
20
+ @rank = @dimensions.size
21
+ extract_inverse_aggregate(document)
22
+ end
23
+
24
+ # @todo: Non existance attributes
25
+ #
26
+ # In the codebase, they are trying to add couple of aggregate
27
+ # dimensions related attributes that was never a part of the
28
+ # Explict class, but for consistency we are keeping those as
29
+ # it is for now. let's revist those later and fix it.
30
+ #
31
+ def extract_inverse_aggregate(document)
32
+ aggregates = document.xpath("inverse.aggregate")
33
+
34
+ if !aggregates.empty?
35
+ dimension = Express::AggregateDimension.parse(aggregates.first)
36
+ @aggrtype = dimension.aggrtype
37
+ @lower = dimension.lower
38
+ @upper = dimension.upper
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,137 @@
1
+ require "expressir/express/explicit"
2
+ require "expressir/express/inverse"
3
+ require "expressir/express/derived"
4
+ require "expressir/express/named_type"
5
+ require "expressir/express/where_rule"
6
+ require "expressir/express/unique_rule"
7
+
8
+ require "expressir/express/explicit_aggregate"
9
+ require "expressir/express/inverse_aggregate"
10
+ require "expressir/express/derived_aggregate"
11
+
12
+ module Expressir
13
+ module Express
14
+ class Entity < NamedType
15
+ attr_accessor :supertypes, :attributes, :isAbs, :superexpression,
16
+ :uniques, :subtypes_array, :supertypes_array, :attributes_all_array,
17
+ :supertypes_all
18
+
19
+ def initialize(document: nil, schema: nil, **options)
20
+ @isAbs = false
21
+ @attributes = []
22
+ @uniques = []
23
+ @wheres = []
24
+ @subtypes_array = []
25
+ @supertypes_array = []
26
+ @attributes_all_array = []
27
+ @supertypes = nil
28
+ @supertypes_all = nil
29
+ @superexpression = nil
30
+ @selectedBy = []
31
+
32
+ @schema = schema
33
+ @document = document
34
+ @options = options
35
+ end
36
+
37
+ def find_attr_by_name( attrname )
38
+ for attribute in attributes
39
+ if attrname == attribute.name
40
+ return attribute
41
+ end
42
+ end
43
+ return nil
44
+ end
45
+
46
+ def find_attr_by_name_full( attrname )
47
+ attr = find_attr_by_name( attrname )
48
+ if attr != nil
49
+ return attr
50
+ end
51
+ for supertype in supertypes_array
52
+ attr = supertype.find_attr_by_name_full (attrname)
53
+ if attr != nil
54
+ return attr
55
+ end
56
+ end
57
+ end
58
+
59
+ def parse
60
+ extract_attributes(@document, @schema)
61
+ self
62
+ end
63
+
64
+ def self.parse(document, schema)
65
+ new(document: document, schema: schema).parse
66
+ end
67
+
68
+ private
69
+
70
+ def extract_attributes(document, schema)
71
+ @name = document.attributes["name"].to_s
72
+ @supertypes = document.attributes["supertypes"]
73
+ @superexpression = document.attributes["super.expression"]
74
+
75
+ @wheres = extract_where_rules(document)
76
+ @uniques = extract_unique_rules(document)
77
+
78
+ @isAbs = document.attributes["supertypes"] == "YES" ||
79
+ document.attributes["abstract.entity"] == "YES"
80
+
81
+ @attributes = [
82
+ extract_eplicits(document),
83
+ extract_inverses(document),
84
+ extract_derivedes(document),
85
+ ].flatten
86
+ end
87
+
88
+ def extract_eplicits(document)
89
+ document.xpath("explicit").map do |explicit|
90
+ explicit_type = Express::Explicit
91
+
92
+ if !explicit.xpath("aggregate").empty?
93
+ explicit_type = Express::ExplicitAggregate
94
+ end
95
+
96
+ explicit_type.parse(explicit, self)
97
+ end
98
+ end
99
+
100
+ def extract_inverses(document)
101
+ document.xpath("inverse").map do |inverse|
102
+ inverse_type = Express::Inverse
103
+
104
+ if !inverse.xpath("inverse.aggregate").empty?
105
+ inverse_type = Express::InverseAggregate
106
+ end
107
+
108
+ inverse_type.parse(inverse, self)
109
+ end
110
+ end
111
+
112
+ def extract_derivedes(document)
113
+ document.xpath("derived").map do |derived|
114
+ derived_type = Express::Derived
115
+
116
+ if !derived.xpath("aggregate").empty?
117
+ derived_type = Express::DerivedAggregate
118
+ end
119
+
120
+ derived_type.parse(derived, self)
121
+ end
122
+ end
123
+
124
+ def extract_unique_rules(document)
125
+ document.xpath("unique").map do |unique|
126
+ Express::UniqueRule.parse(unique)
127
+ end
128
+ end
129
+
130
+ def extract_where_rules(document)
131
+ document.xpath("where").map do |where|
132
+ Express::WhereRule.parse(where)
133
+ end
134
+ end
135
+ end
136
+ end
137
+ end