Skip to content

Commit 832643a

Browse files
committed
Merge branch 'master' of github.com:FCO/Red into create-to-one
2 parents 3ed6576 + df848ff commit 832643a

37 files changed

+394
-179
lines changed

.coverage

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
57
1+
58

Changes

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
Revision history for Red
22

33
{{$NEXT}}
4+
- Separate the Model generation for changing attributes
5+
- Make join on update use subselect
6+
- Teaching AST new dance moves (.replace)
47

58
0.1.52 2021-10-22T21:33:53+01:00
69
- Fix usage of parameterized roles

META6.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
"MetamodelX::Red::Populatable": "lib/MetamodelX/Red/Populatable.pm6",
2828
"MetamodelX::Red::Refreshable": "lib/MetamodelX/Red/Refreshable.pm6",
2929
"MetamodelX::Red::Relationship": "lib/MetamodelX/Red/Relationship.pm6",
30+
"MetamodelX::Red::Specialisable": "lib/MetamodelX/Red/Specialisable.pm6",
3031
"MetamodelX::Red::Supply": "lib/MetamodelX/Red/Supply.pm6",
3132
"Red": "lib/Red.pm6",
3233
"Red::AST": "lib/Red/AST.pm6",

docs/api/Red/AST.md

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,26 @@ method Bool() returns Bool
2121

2222
If inside of a block for ResultSeq mothods throws a control exception and populates all possibilities
2323

24+
### method transpose-first
25+
26+
```raku
27+
method transpose-first(
28+
&func
29+
) returns Mu
30+
```
31+
32+
Find the first AST node folowing the rule
33+
34+
### method transpose-grep
35+
36+
```raku
37+
method transpose-grep(
38+
&func
39+
) returns Mu
40+
```
41+
42+
Find AST nodes folowing the rule
43+
2444
### method transpose
2545

2646
```raku

docs/api/Red/Driver/Pg.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
class submethod BUILD (Red::Driver::Pg: DB::Pg :$!dbh, Str :$!user, Str :$!password, Str :$!host = "127.0.0.1", Int :$!port = 5432, Str :$!dbname, *%_) { #`(Submethod|139752632623312) ... }
1+
class submethod BUILD (Red::Driver::Pg: DB::Pg :$!dbh, Str :$!user, Str :$!password, Str :$!host = "127.0.0.1", Int :$!port = 5432, Str :$!dbname, *%_) { #`(Submethod|139986655638544) ... }
22
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
33

44
Data accepted by the Pg driver constructor: dbh : DB::Pg object user : User to be used to connect to the database password: Password to be used to connect to the database host : To be connected to port : What port to connect dbname : Database name

docs/api/Red/Driver/SQLite.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
class submethod BUILD (Red::Driver::SQLite: DBDish::SQLite::Connection :$!dbh, Str :$!database = ":memory:", *%_) { #`(Submethod|140401313076160) ... }
1+
class submethod BUILD (Red::Driver::SQLite: DBDish::SQLite::Connection :$!dbh, Str :$!database = ":memory:", *%_) { #`(Submethod|140316593993440) ... }
22
-------------------------------------------------------------------------------------------------------------------------------------------------------
33

44
Data accepted by the SQLite driver constructor: dbh : DBDish::SQLite object database: File name or C<:memory:> to a in memory DB (default)

docs/coverage/report-data/MetamodelX-Red-Model.html

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ <h1>MetamodelX::Red::Model 78.8%</h1>
7575
<span class="coverage-no">use MetamodelX::Red::OnDB;</span>
7676
<span class="coverage-no">use MetamodelX::Red::Id;</span>
7777
<span class="coverage-no">use MetamodelX::Red::Populatable;</span>
78+
<span class="coverage-no">use MetamodelX::Red::Specialisable;</span>
7879
<span class="coverage-no">use Red::Formatter;</span>
7980
<span class="coverage-no">use X::Red::Exceptions;</span>
8081
<span class="coverage-no">use Red::Phaser;</span>
@@ -92,6 +93,7 @@ <h1>MetamodelX::Red::Model 78.8%</h1>
9293
<span class="coverage-no">also does MetamodelX::Red::OnDB;</span>
9394
<span class="coverage-no">also does MetamodelX::Red::Id;</span>
9495
<span class="coverage-no">also does MetamodelX::Red::Populatable;</span>
96+
<span class="coverage-no">also does MetamodelX::Red::Specialisable;</span>
9597
<span class="coverage-no">also does Red::Formatter;</span>
9698
<span class="coverage-no"></span>
9799
<span class="coverage-no">has Attribute @!columns;</span>
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8">
5+
<title>RaCoCo result: MetamodelX::Red::Specialisable</title>
6+
<link rel="stylesheet"
7+
href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css"
8+
integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh"
9+
crossorigin="anonymous">
10+
<style>
11+
pre.code::before {
12+
counter-reset: listing;
13+
}
14+
15+
pre.code span {
16+
counter-increment: listing;
17+
}
18+
19+
pre.code span::before {
20+
content: counter(listing) ". ";
21+
}
22+
23+
.coverage-green {
24+
background-color: #32CD32;
25+
/*color-blind
26+
background-color: #00CED1;
27+
/**/
28+
}
29+
30+
.coverage-red {
31+
background-color: #fa8072;
32+
}
33+
34+
.coverage-purple {
35+
background-color: #9370DB;
36+
}
37+
</style>
38+
</head>
39+
<body>
40+
<div class="container">
41+
<div class="row mt-5 mb-3">
42+
<div class="col-12">
43+
<div class="page-header">
44+
<h1>MetamodelX::Red::Specialisable 92.3%</h1>
45+
</div>
46+
</div>
47+
</div>
48+
<div class="row justify-content-md-center">
49+
<div class="col-md-10">
50+
<pre class="code">
51+
<span class="coverage-green">use Red::AST::MultiSelect;</span>
52+
<span class="coverage-no">use Red::Column;</span>
53+
<span class="coverage-no">use Red::Attr::Column;</span>
54+
<span class="coverage-no">use Red::HiddenFromSQLCommenting;</span>
55+
<span class="coverage-no"></span>
56+
<span class="coverage-green">unit role MetamodelX::Red::Specialisable;</span>
57+
<span class="coverage-no"></span>
58+
<span class="coverage-green">multi method specialise($self, +@ret where .all ~~ Red::AST) is hidden-from-sql-commenting {</span>
59+
<span class="coverage-green"> my \Meta = $self.^orig.HOW.WHAT;</span>
60+
<span class="coverage-green"> my \model = Meta.new(:table($self.^table)).new_type: :name($self.^name);</span>
61+
<span class="coverage-green"> model.HOW.^attributes.first(*.name eq '$!table').set_value: model.HOW, $self.^table;</span>
62+
<span class="coverage-green"> my $attr-name = 'data_0';</span>
63+
<span class="coverage-green"> my @attrs = do for @ret {</span>
64+
<span class="coverage-green"> @*table-list.push: |.tables if @*table-list.defined;</span>
65+
<span class="coverage-green"> my $name = $self.^all.filter ~~ Red::AST::MultiSelect ?? .attr.name.substr(2) !! ++$attr-name;</span>
66+
<span class="coverage-green"> my $col-name = $_ ~~ Red::Column ?? .name !! $name;</span>
67+
<span class="coverage-green"> my $attr = Attribute.new:</span>
68+
<span class="coverage-no"> :name(&quot;\$!$name&quot;),</span>
69+
<span class="coverage-no"> :package(model),</span>
70+
<span class="coverage-no"> :type(.returns ~~ Any &amp;&amp; .returns !~~ Nil ?? .returns !! Any),</span>
71+
<span class="coverage-no"> :has_accessor,</span>
72+
<span class="coverage-no"> :build(.returns),</span>
73+
<span class="coverage-no"> ;</span>
74+
<span class="coverage-green"> my %data = %(</span>
75+
<span class="coverage-no"> :name-alias($col-name),</span>
76+
<span class="coverage-no"> :name($col-name),</span>
77+
<span class="coverage-no"> :attr-name($name),</span>
78+
<span class="coverage-no"> :type(.returns.^name),</span>
79+
<span class="coverage-no"> :$attr,</span>
80+
<span class="coverage-no"> :model(.tables.head),</span>
81+
<span class="coverage-no"> :class(model),</span>
82+
<span class="coverage-green"> |(do if $_ ~~ Red::Column {</span>
83+
<span class="coverage-green"> :inflate(.inflate),</span>
84+
<span class="coverage-no"> :deflate(.deflate),</span>
85+
<span class="coverage-red"> } else {</span>
86+
<span class="coverage-green"> :computation($_)</span>
87+
<span class="coverage-no"> })</span>
88+
<span class="coverage-no"> );</span>
89+
<span class="coverage-green"> $attr does Red::Attr::Column(%data);</span>
90+
<span class="coverage-green"> model.^add_attribute: $attr;</span>
91+
<span class="coverage-green"> model.^add_multi_method: $name, my method (Mu:D:) { $self.^all.get_value: &quot;\$!$name&quot; }</span>
92+
<span class="coverage-red"> $attr</span>
93+
<span class="coverage-no"> }</span>
94+
<span class="coverage-green"> model.^add_method: &quot;no-table&quot;, my method no-table { True }</span>
95+
<span class="coverage-green"> model.^add_method: &quot;orig-result-seq&quot;, my method orig-result-seq { $self.^all }</span>
96+
<span class="coverage-green"> model.^compose;</span>
97+
<span class="coverage-green"> model.^add-column: $_ for @attrs;</span>
98+
<span class="coverage-green"> model</span>
99+
<span class="coverage-no">}</span>
100+
</pre>
101+
</div>
102+
</div>
103+
</div>
104+
</body>
105+
</html>

docs/coverage/report-data/Red-AST-Divisable.html

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
<div class="row mt-5 mb-3">
4242
<div class="col-12">
4343
<div class="page-header">
44-
<h1>Red::AST::Divisable 16.6%</h1>
44+
<h1>Red::AST::Divisable 41.6%</h1>
4545
</div>
4646
</div>
4747
</div>
@@ -62,9 +62,9 @@ <h1>Red::AST::Divisable 16.6%</h1>
6262
<span class="coverage-no"></span>
6363
<span class="coverage-red">method should-validate {}</span>
6464
<span class="coverage-no"></span>
65-
<span class="coverage-red">method find-column-name {</span>
66-
<span class="coverage-red"> for self.args {</span>
67-
<span class="coverage-red"> .return with .?find-column-name</span>
65+
<span class="coverage-green">method find-column-name {</span>
66+
<span class="coverage-green"> for self.args {</span>
67+
<span class="coverage-green"> .return with .?find-column-name</span>
6868
<span class="coverage-no"> }</span>
6969
<span class="coverage-no">}</span>
7070
<span class="coverage-no"></span>

docs/coverage/report-data/Red-AST-Infix.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
<div class="row mt-5 mb-3">
4242
<div class="col-12">
4343
<div class="page-header">
44-
<h1>Red::AST::Infix 81.8%</h1>
44+
<h1>Red::AST::Infix 90.9%</h1>
4545
</div>
4646
</div>
4747
</div>
@@ -76,7 +76,7 @@ <h1>Red::AST::Infix 81.8%</h1>
7676
<span class="coverage-no">}</span>
7777
<span class="coverage-no"></span>
7878
<span class="coverage-green">method args { $!left, $!right }</span>
79-
<span class="coverage-red">method not { Red::AST::Not.new: self }</span>
79+
<span class="coverage-green">method not { Red::AST::Not.new: self }</span>
8080
<span class="coverage-green">method find-column-name { ($_ with $.left.find-column-name), ($_ with $.right.find-column-name) }</span>
8181
</pre>
8282
</div>

docs/coverage/report-data/Red-AST-Infixes.html

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
<div class="row mt-5 mb-3">
4242
<div class="col-12">
4343
<div class="page-header">
44-
<h1>Red::AST::Infixes 37%</h1>
44+
<h1>Red::AST::Infixes 37.6%</h1>
4545
</div>
4646
</div>
4747
</div>
@@ -78,9 +78,9 @@ <h1>Red::AST::Infixes 37%</h1>
7878
<span class="coverage-no"></span>
7979
<span class="coverage-red"> method should-validate {}</span>
8080
<span class="coverage-no"></span>
81-
<span class="coverage-red"> method find-column-name {</span>
82-
<span class="coverage-red"> gather for self.args {</span>
83-
<span class="coverage-red"> .take for .?find-column-name</span>
81+
<span class="coverage-green"> method find-column-name {</span>
82+
<span class="coverage-green"> gather for self.args {</span>
83+
<span class="coverage-green"> .take for .?find-column-name</span>
8484
<span class="coverage-no"> }</span>
8585
<span class="coverage-no"> }</span>
8686
<span class="coverage-no"></span>
@@ -395,8 +395,8 @@ <h1>Red::AST::Infixes 37%</h1>
395395
<span class="coverage-no"></span>
396396
<span class="coverage-red"> method should-validate {}</span>
397397
<span class="coverage-no"></span>
398-
<span class="coverage-green"> method not {</span>
399-
<span class="coverage-green"> Red::AST::In.new: $!left, $!right;</span>
398+
<span class="coverage-red"> method not {</span>
399+
<span class="coverage-red"> Red::AST::In.new: $!left, $!right;</span>
400400
<span class="coverage-no"> }</span>
401401
<span class="coverage-no">}</span>
402402
<span class="coverage-no"></span>

docs/coverage/report-data/Red-AST-Intersect.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ <h1>Red::AST::Intersect 53.3%</h1>
6565
<span class="coverage-red">method args { flat @!selects&gt;&gt;.args }</span>
6666
<span class="coverage-no"></span>
6767
<span class="coverage-red">method tables(::?CLASS:D:) {</span>
68-
<span class="coverage-red"> (flat @!selects&gt;&gt;.tables).unique</span>
68+
<span class="coverage-red"> (flat @!selects».?tables).grep(-&gt; \v { v !=:= Nil }).unique</span>
6969
<span class="coverage-no">}</span>
7070
<span class="coverage-red">method find-column-name {}</span>
7171
<span class="coverage-no"></span>

docs/coverage/report-data/Red-AST-Minus.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ <h1>Red::AST::Minus 53.3%</h1>
6565
<span class="coverage-red">method args { flat @!selects&gt;&gt;.args }</span>
6666
<span class="coverage-no"></span>
6767
<span class="coverage-red">method tables(::?CLASS:D:) {</span>
68-
<span class="coverage-red"> (flat @!selects&gt;&gt;.tables).unique</span>
68+
<span class="coverage-red"> (flat @!selects».?tables).grep(-&gt; \v { v !=:= Nil }).unique</span>
6969
<span class="coverage-no">}</span>
7070
<span class="coverage-red">method find-column-name {}</span>
7171
<span class="coverage-no"></span>

docs/coverage/report-data/Red-AST-Select.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ <h1>Red::AST::Select 76.6%</h1>
8383
<span class="coverage-no">}</span>
8484
<span class="coverage-no"></span>
8585
<span class="coverage-green">method tables(::?CLASS:D:) {</span>
86-
<span class="coverage-green"> |(|@!table-list, |(.tables with $!filter), callsame).grep(-&gt; \v { v !=:= Nil }).unique</span>
86+
<span class="coverage-green"> |(|@!table-list, |(.?tables with $!filter), callsame).grep(-&gt; \v { v !=:= Nil }).unique</span>
8787
<span class="coverage-no">}</span>
8888
<span class="coverage-green">method find-column-name {}</span>
8989
<span class="coverage-no"></span>

docs/coverage/report-data/Red-AST-Union.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ <h1>Red::AST::Union 53.3%</h1>
6363
<span class="coverage-red">method args { flat @!selects&gt;&gt;.args }</span>
6464
<span class="coverage-no"></span>
6565
<span class="coverage-red">method tables(::?CLASS:D:) {</span>
66-
<span class="coverage-red"> (flat @!selects&gt;&gt;.tables).unique</span>
66+
<span class="coverage-red"> (flat @!selects».?tables).grep(-&gt; \v { v !=:= Nil }).unique</span>
6767
<span class="coverage-no">}</span>
6868
<span class="coverage-red">method find-column-name {}</span>
6969
<span class="coverage-no"></span>

docs/coverage/report-data/Red-AST-Update.html

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
<div class="row mt-5 mb-3">
4242
<div class="col-12">
4343
<div class="page-header">
44-
<h1>Red::AST::Update 71.4%</h1>
44+
<h1>Red::AST::Update 73.3%</h1>
4545
</div>
4646
</div>
4747
</div>
@@ -57,9 +57,10 @@ <h1>Red::AST::Update 71.4%</h1>
5757
<span class="coverage-no">#| Represents an update operation</span>
5858
<span class="coverage-green">unit class Red::AST::Update does Red::AST;</span>
5959
<span class="coverage-no"></span>
60-
<span class="coverage-no">has Str $.into;</span>
61-
<span class="coverage-no">has Pair @.values;</span>
62-
<span class="coverage-red">has Red::AST $.filter;</span>
60+
<span class="coverage-no">has Red::Model $.model;</span>
61+
<span class="coverage-green">has Str $.into = $!model.^table;</span>
62+
<span class="coverage-no">has Pair @.values;</span>
63+
<span class="coverage-red">has Red::AST $.filter;</span>
6364
<span class="coverage-no"></span>
6465
<span class="coverage-red">method returns { Nil }</span>
6566
<span class="coverage-red">method args { |@!values, $.filter }</span>
@@ -74,7 +75,7 @@ <h1>Red::AST::Update 71.4%</h1>
7475
<span class="coverage-green"> X::Red::UpdateNoId.new.throw without $filter;</span>
7576
<span class="coverage-no"></span>
7677
<span class="coverage-green"> self.bless:</span>
77-
<span class="coverage-no"> :into(.^table),</span>
78+
<span class="coverage-no"> :model($_),</span>
7879
<span class="coverage-no"> :$filter,</span>
7980
<span class="coverage-no"> :@values</span>
8081
<span class="coverage-no"> }</span>

docs/coverage/report-data/Red-AST.html

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
<div class="row mt-5 mb-3">
4242
<div class="col-12">
4343
<div class="page-header">
44-
<h1>Red::AST 74%</h1>
44+
<h1>Red::AST 59.4%</h1>
4545
</div>
4646
</div>
4747
</div>
@@ -84,24 +84,44 @@ <h1>Red::AST 74%</h1>
8484
<span class="coverage-no"></span>
8585
<span class="coverage-green">method Str { self }</span>
8686
<span class="coverage-no"></span>
87+
<span class="coverage-no">#| Find the first AST node folowing the rule</span>
88+
<span class="coverage-red">method transpose-first(::?CLASS:D: &amp;func) {</span>
89+
<span class="coverage-red"> self.transpose-grep(&amp;func).head</span>
90+
<span class="coverage-no">}</span>
91+
<span class="coverage-no"></span>
92+
<span class="coverage-no">#| Find AST nodes folowing the rule</span>
93+
<span class="coverage-green">method transpose-grep(::?CLASS:D: &amp;func) {</span>
94+
<span class="coverage-green"> gather {</span>
95+
<span class="coverage-green"> self.transpose: -&gt; $node {</span>
96+
<span class="coverage-green"> take $node if func $node;</span>
97+
<span class="coverage-red"> True</span>
98+
<span class="coverage-no"> }</span>
99+
<span class="coverage-no"> }</span>
100+
<span class="coverage-no">}</span>
101+
<span class="coverage-no"></span>
87102
<span class="coverage-no">#| Transposes the AST tree running the function.</span>
88103
<span class="coverage-green">method transpose(::?CLASS:D: &amp;func) {</span>
104+
<span class="coverage-green"> return unless func self;</span>
89105
<span class="coverage-green"> die self unless self.^can: &quot;args&quot;;</span>
90106
<span class="coverage-green"> for self.args.grep: Red::AST -&gt; $arg {</span>
91-
<span class="coverage-green"> .transpose: &amp;func with $arg</span>
107+
<span class="coverage-green"> next without $arg;</span>
108+
<span class="coverage-green"> .transpose: &amp;func with $arg;</span>
92109
<span class="coverage-no"> }</span>
93-
<span class="coverage-green"> func self;</span>
94110
<span class="coverage-no">}</span>
95111
<span class="coverage-no"></span>
96112
<span class="coverage-no">#| Returns a list with all the tables used on the AST</span>
97113
<span class="coverage-green">method tables(::?CLASS:D:) {</span>
98-
<span class="coverage-no"> my @tables;</span>
99-
<span class="coverage-green"> self.transpose: {</span>
100-
<span class="coverage-green"> if .^name eq &quot;Red::Column&quot; {</span>
101-
<span class="coverage-green"> @tables.push: .class</span>
102-
<span class="coverage-no"> }</span>
103-
<span class="coverage-no"> }</span>
104-
<span class="coverage-green"> |@tables.grep(-&gt; \v { v !=:= Nil }).unique</span>
114+
<span class="coverage-green"> |self.transpose-grep({ .^name eq &quot;Red::Column&quot; })».class.grep(-&gt; \v { v !=:= Nil }).unique;</span>
115+
<span class="coverage-no">}</span>
116+
<span class="coverage-no"></span>
117+
<span class="coverage-red">method replace(::?CLASS:D: Red::AST \n, Red::AST $s) {</span>
118+
<span class="coverage-red"> self eqv n</span>
119+
<span class="coverage-no"> ?? $s</span>
120+
<span class="coverage-no"> !! self.clone:</span>
121+
<span class="coverage-red"> |self.^attributes.map({</span>
122+
<span class="coverage-red"> my \val = .get_value(self);</span>
123+
<span class="coverage-red"> .name.substr(2) =&gt; val ~~ Red::AST &amp;&amp; val.DEFINITE ?? (val.?replace(n, $s) // val) !! val</span>
124+
<span class="coverage-no"> }).Hash</span>
105125
<span class="coverage-no">}</span>
106126
<span class="coverage-no"></span>
107127
<span class="coverage-green">multi method WHICH(::?CLASS:D:) {</span>

0 commit comments

Comments
 (0)