Red.git | docs/coverage/report-data/ | Red-Attr-Relationship.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>RaCoCo result: Red::Attr::Relationship</title>
<link rel="stylesheet"
href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css"
integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh"
crossorigin="anonymous">
<style>
pre.code::before {
counter-reset: listing;
}
pre.code span {
counter-increment: listing;
}
pre.code span::before {
content: counter(listing) ". ";
}
.coverage-green {
background-color: #32CD32;
/*color-blind
background-color: #00CED1;
/**/
}
.coverage-red {
background-color: #fa8072;
}
.coverage-purple {
background-color: #9370DB;
}
</style>
</head>
<body>
<div class="container">
<div class="row mt-5 mb-3">
<div class="col-12">
<div class="page-header">
<h1>Red::Attr::Relationship 86.7%</h1>
</div>
</div>
</div>
<div class="row justify-content-md-center">
<div class="col-md-10">
<pre class="code">
<span class="coverage-green">use Red::AST::Infixes;</span>
<span class="coverage-no">use Red::AST::Value;</span>
<span class="coverage-no">use Red::HiddenFromSQLCommenting;</span>
<span class="coverage-no">use X::Red::Exceptions;</span>
<span class="coverage-no">use Red::Model;</span>
<span class="coverage-no"></span>
<span class="coverage-green">unit role Red::Attr::Relationship[</span>
<span class="coverage-no"> &rel1,</span>
<span class="coverage-no"> &rel2?,</span>
<span class="coverage-no"> Str :$model,</span>
<span class="coverage-green"> Str :$require = $model,</span>
<span class="coverage-no"> Bool :$optional,</span>
<span class="coverage-no"> Bool :$no-prefetch,</span>
<span class="coverage-no"> Bool :$has-one,</span>
<span class="coverage-no"> Red::Model :$model-type,</span>
<span class="coverage-no">];</span>
<span class="coverage-no"></span>
<span class="coverage-no">has Mu:U $!type;</span>
<span class="coverage-no"></span>
<span class="coverage-green">has Bool $.has-lazy-relationship = ?$model;</span>
<span class="coverage-no"></span>
<span class="coverage-no">has Mu:U $!relationship-model;</span>
<span class="coverage-no"></span>
<span class="coverage-no">has Bool $!loaded-model = False;</span>
<span class="coverage-no"></span>
<span class="coverage-green">has Bool $!optional = $optional;</span>
<span class="coverage-no"></span>
<span class="coverage-green">has Bool $.has-one = $has-one;</span>
<span class="coverage-no"></span>
<span class="coverage-green">has Bool $.no-prefetch = $!has-one // $no-prefetch;</span>
<span class="coverage-no"></span>
<span class="coverage-no">has Str $.rel-name is rw;</span>
<span class="coverage-no"></span>
<span class="coverage-green">has $!model-type = $model-type;</span>
<span class="coverage-no"></span>
<span class="coverage-green">submethod TWEAK(|) {</span>
<span class="coverage-green"> if $!model-type !=== Red::Model {</span>
<span class="coverage-green"> $!has-lazy-relationship = True;</span>
<span class="coverage-green"> $!relationship-model := $!model-type;</span>
<span class="coverage-green"> $!loaded-model = True</span>
<span class="coverage-no"> }</span>
<span class="coverage-no">}</span>
<span class="coverage-no"></span>
<span class="coverage-green">method transfer(Mu:U $package) {</span>
<span class="coverage-green"> my $attr = Attribute.new: :$package, :$.name, :$.type;</span>
<span class="coverage-green"> $attr but Red::Attr::Relationship[&rel1, &rel2, :$model, :$require]</span>
<span class="coverage-no">}</span>
<span class="coverage-no"></span>
<span class="coverage-green">method !to-use-with-rel {</span>
<span class="coverage-green"> do if self.has-one || self.type ~~ Positional {</span>
<span class="coverage-green"> do if $!relationship-model<> =:= Mu {</span>
<span class="coverage-green"> self.type.of</span>
<span class="coverage-red"> } else {</span>
<span class="coverage-green"> $!relationship-model<></span>
<span class="coverage-no"> }</span>
<span class="coverage-red"> } else {</span>
<span class="coverage-green"> self.package</span>
<span class="coverage-no"> }</span>
<span class="coverage-no">}</span>
<span class="coverage-no"></span>
<span class="coverage-green">method rel {</span>
<span class="coverage-green"> my $*RED-INTERNAL = True;</span>
<span class="coverage-green"> my \type = self!to-use-with-rel;</span>
<span class="coverage-green"> say type.^name;</span>
<span class="coverage-green"> rel1 type</span>
<span class="coverage-no">}</span>
<span class="coverage-no"></span>
<span class="coverage-green">method relationship-model(--> Mu:U) is hidden-from-sql-commenting {</span>
<span class="coverage-green"> return self.type if !$model.DEFINITE && !$!loaded-model;</span>
<span class="coverage-green"> unless $!loaded-model {</span>
<span class="coverage-green"> my $t = ::($model);</span>
<span class="coverage-green"> if !$t && $t ~~ Failure {</span>
<span class="coverage-green"> require ::($require);</span>
<span class="coverage-green"> $t = ::($model);</span>
<span class="coverage-no"> }</span>
<span class="coverage-green"> $!relationship-model := $t;</span>
<span class="coverage-green"> $!loaded-model = True;</span>
<span class="coverage-no"> }</span>
<span class="coverage-green"> $!relationship-model</span>
<span class="coverage-no">}</span>
<span class="coverage-no"></span>
<span class="coverage-green">method set-data(\instance, Mu $value) is hidden-from-sql-commenting {</span>
<span class="coverage-green"> do given $.rel {</span>
<span class="coverage-green"> my $attr = .attr;</span>
<span class="coverage-green"> my $ref = .ref;</span>
<span class="coverage-green"> $attr.set_value: instance, $ref.attr.get_value: $value;</span>
<span class="coverage-green"> instance.^set-dirty: $attr;</span>
<span class="coverage-no"> }</span>
<span class="coverage-no">}</span>
<span class="coverage-no"></span>
<span class="coverage-green">method build-relationship(\instance) is hidden-from-sql-commenting {</span>
<span class="coverage-green"> my \type = self.type;</span>
<span class="coverage-red"> my \attr = self;</span>
<span class="coverage-green"> my \rel-model = $model ?? self.relationship-model !! type ~~ Positional ?? type.of !! type;</span>
<span class="coverage-no"> use nqp;</span>
<span class="coverage-green"> nqp::bindattr(nqp::decont(instance), $.package, $.name, Proxy.new:</span>
<span class="coverage-green"> FETCH => method () {</span>
<span class="coverage-green"> my $*RED-INTERNAL = True;</span>
<span class="coverage-green"> my \ret = do if type ~~ Positional || attr.has-one {</span>
<span class="coverage-green"> rel-model.^rs.where: rel1(rel-model).map(-> $rel {</span>
<span class="coverage-green"> X::Red::RelationshipNotColumn.new(:relationship(attr), :points-to($rel)).throw unless $rel ~~ Red::Column;</span>
<span class="coverage-green"> my $ref = $rel.ref;</span>
<span class="coverage-green"> X::Red::RelationshipNotRelated.new(:relationship(attr), :points-to($rel)).throw unless $ref.DEFINITE;</span>
<span class="coverage-green"> my $val = do given $ref.attr but role :: {</span>
<span class="coverage-red"> method package {</span>
<span class="coverage-red"> instance.WHAT</span>
<span class="coverage-no"> }</span>
<span class="coverage-purple"> } {</span>
<span class="coverage-green"> instance.^get-attr: .name.substr: 2</span>
<span class="coverage-no"> }</span>
<span class="coverage-green"> my \value = ast-value $val;</span>
<span class="coverage-green"> Red::AST::Eq.new: $rel, value, :bind-right</span>
<span class="coverage-green"> }).reduce: -> $left, $right {</span>
<span class="coverage-green"> Red::AST::AND.new: $left, $right</span>
<span class="coverage-no"> }</span>
<span class="coverage-green"> } else {</span>
<span class="coverage-green"> my @models = rel1(instance.WHAT).map(-> $rel {</span>
<span class="coverage-green"> my $val = $rel.attr.get_value: instance;</span>
<span class="coverage-green"> do with $val {</span>
<span class="coverage-green"> my \value = ast-value $val;</span>
<span class="coverage-green"> Red::AST::Eq.new: $rel.ref, value, :bind-right</span>
<span class="coverage-no"> }</span>
<span class="coverage-no"> }).grep(*.defined);</span>
<span class="coverage-green"> return rel-model unless @models;</span>
<span class="coverage-green"> rel-model.^rs.where(@models.reduce(-> $left, $right {</span>
<span class="coverage-red"> Red::AST::AND.new: $left, $right</span>
<span class="coverage-no"> }))</span>
<span class="coverage-no"> }</span>
<span class="coverage-green"> return ret.head if type !~~ Positional || attr.has-one;</span>
<span class="coverage-green"> ret</span>
<span class="coverage-no"> },</span>
<span class="coverage-red"> STORE => method ($value where type) {</span>
<span class="coverage-red"> my $*RED-INTERNAL = True;</span>
<span class="coverage-red"> die X::Assignment::RO.new(value => attr.type) unless attr.rw;</span>
<span class="coverage-red"> if type !~~ Positional {</span>
<span class="coverage-red"> attr.set-data: instance, $value</span>
<span class="coverage-red"> } else {</span>
<span class="coverage-red"> die "NYI Couldnt set value"</span>
<span class="coverage-no"> }</span>
<span class="coverage-no"> }</span>
<span class="coverage-no"> );</span>
<span class="coverage-green"> return</span>
<span class="coverage-no">}</span>
<span class="coverage-no"></span>
<span class="coverage-green">method relationship-argument-type {</span>
<span class="coverage-green"> do if self.type ~~ Positional || self.has-one {</span>
<span class="coverage-green"> $model ?? self.relationship-model !! self.type ~~ Positional ?? self.type.of !! self.type</span>
<span class="coverage-red"> } else {</span>
<span class="coverage-green"> self.package</span>
<span class="coverage-no"> }</span>
<span class="coverage-no">}</span>
<span class="coverage-no"></span>
<span class="coverage-green">method relationship-ast($type = Nil) is hidden-from-sql-commenting {</span>
<span class="coverage-green"> my $*RED-INTERNAL = True;</span>
<span class="coverage-green"> my \type = self.relationship-argument-type;</span>
<span class="coverage-green"> my @col1 = |rel1 type;</span>
<span class="coverage-green"> @col1.map({</span>
<span class="coverage-green"> Red::AST::Eq.new: $_, .ref: $type</span>
<span class="coverage-green"> }).reduce: -> $agg, $i {</span>
<span class="coverage-green"> Red::AST::AND.new: $agg, $i</span>
<span class="coverage-no"> }</span>
<span class="coverage-no">}</span>
<span class="coverage-no"></span>
<span class="coverage-green">method join-type {</span>
<span class="coverage-green"> my $*RED-INTERNAL = True;</span>
<span class="coverage-green"> with $!optional {</span>
<span class="coverage-red"> return $!optional</span>
<span class="coverage-no"> ?? :left</span>
<span class="coverage-no"> !! :inner</span>
<span class="coverage-no"> }</span>
<span class="coverage-green"> do given rel1 self.relationship-argument-type {</span>
<span class="coverage-green"> when .?nullable {</span>
<span class="coverage-green"> :left</span>
<span class="coverage-no"> }</span>
<span class="coverage-green"> default {</span>
<span class="coverage-green"> :inner</span>
<span class="coverage-no"> }</span>
<span class="coverage-no"> }</span>
<span class="coverage-no">}</span>
</pre>
</div>
</div>
</div>
</body>
</html>