Red.git | docs/coverage/report-data/ | Red-Column.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>RaCoCo result: Red::Column</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::Column 88.2%</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::Utils;</span>
<span class="coverage-no">use Red::Model;</span>
<span class="coverage-no">use Red::AST;</span>
<span class="coverage-no">use Red::AST::Unary;</span>
<span class="coverage-no">use Red::AST::IsDefined;</span>
<span class="coverage-no">use Red::Formatter;</span>
<span class="coverage-no"></span>
<span class="coverage-no">=head2 Red::Column</span>
<span class="coverage-no"></span>
<span class="coverage-no">#| Represents a database column</span>
<span class="coverage-green">unit class Red::Column does Red::AST;</span>
<span class="coverage-no">also does Red::Formatter;</span>
<span class="coverage-no"></span>
<span class="coverage-green">sub inflator($attr) {</span>
<span class="coverage-green"> do with $attr.type.?inflator {</span>
<span class="coverage-red"> $_</span>
<span class="coverage-green"> } else {</span>
<span class="coverage-green"> do if $attr.type ~~ Enumeration {</span>
<span class="coverage-green"> -> $value, $type { $type.($value) }</span>
<span class="coverage-no"> } else {</span>
<span class="coverage-green"> -> $_ { .?"{ $attr.type.^name }"() // .self }</span>
<span class="coverage-no"> }</span>
<span class="coverage-no"> }</span>
<span class="coverage-no">}</span>
<span class="coverage-green">sub deflator($_) {</span>
<span class="coverage-green"> do with .type.?deflator {</span>
<span class="coverage-red"> $_</span>
<span class="coverage-green"> } else {</span>
<span class="coverage-green"> do if .type ~~ Enumeration {</span>
<span class="coverage-green"> *.value</span>
<span class="coverage-no"> } else {</span>
<span class="coverage-green"> *.self</span>
<span class="coverage-no"> }</span>
<span class="coverage-no"> }</span>
<span class="coverage-no">}</span>
<span class="coverage-no"></span>
<span class="coverage-no">has Attribute $.attr is required;</span>
<span class="coverage-green">has $.model = $!attr.package;</span>
<span class="coverage-green">has Str $.attr-name = $!attr.name.substr: 2;</span>
<span class="coverage-no">has Bool $.id = False;</span>
<span class="coverage-no">has Bool $.auto-increment = False;</span>
<span class="coverage-no">has &.references;</span>
<span class="coverage-no">has &!actual-references;</span>
<span class="coverage-no">has $!ref;</span>
<span class="coverage-green">has Bool $.nullable = $!attr.package.HOW.?default-nullable($!attr.package) // False;</span>
<span class="coverage-green">has Str $.name = ::?CLASS.column-formatter: self.attr.name.substr: 2;</span>
<span class="coverage-green">has Str $.name-alias = $!name;</span>
<span class="coverage-no">has Str $.type;</span>
<span class="coverage-green">has &.inflate = $!attr.&inflator;</span>
<span class="coverage-green">has &.deflate = $!attr.&deflator;</span>
<span class="coverage-no">has $.computation;</span>
<span class="coverage-no">has Str $.model-name;</span>
<span class="coverage-no">has Red::Model $.model-type;</span>
<span class="coverage-no">has Str $.column-name;</span>
<span class="coverage-green">has Str $.require = $!model-name;</span>
<span class="coverage-green">has Mu $.class = $!attr.package;</span>
<span class="coverage-no">has @.unique-groups;</span>
<span class="coverage-no"></span>
<span class="coverage-no">#multi method WHICH(::?CLASS:D:) {</span>
<span class="coverage-no"># ValueObjAt.new: self.^name ~ "|" ~ self.migration-hash.pairs.sort.map(-> (:$key, :$value) {</span>
<span class="coverage-no"># "$key|$value"</span>
<span class="coverage-no"># }).join: "|"</span>
<span class="coverage-no">#}</span>
<span class="coverage-no"></span>
<span class="coverage-green">multi method WHICH(::?CLASS:D:) {</span>
<span class="coverage-green"> ValueObjAt.new: self.gist</span>
<span class="coverage-no">}</span>
<span class="coverage-no"></span>
<span class="coverage-green">multi method perl(::?CLASS:D:) {</span>
<span class="coverage-green"> "{ self.^name }.new({</span>
<span class="coverage-green"> self.Hash.pairs.sort.map(-> (:$key, :$value) {</span>
<span class="coverage-green"> next if $key eq <inflate deflate>.one;</span>
<span class="coverage-green"> "$key.Str() => $value.perl()"</span>
<span class="coverage-no"> }).join: ", "</span>
<span class="coverage-no"> })"</span>
<span class="coverage-no">}</span>
<span class="coverage-no"></span>
<span class="coverage-green">method Hash(--> Hash()) {</span>
<span class="coverage-green"> %(</span>
<span class="coverage-green"> |(:attr($_) with $!attr ),</span>
<span class="coverage-green"> |(:attr-name($_) with $!attr-name ),</span>
<span class="coverage-green"> |(:id($_) with $!id ),</span>
<span class="coverage-green"> |(:auto-increment($_) with $!auto-increment ),</span>
<span class="coverage-green"> |(:references($_) with &!references ),</span>
<span class="coverage-green"> |(:actual-references($_) with &!actual-references),</span>
<span class="coverage-red"> |(:ref($_) with $!ref ),</span>
<span class="coverage-green"> |(:nullable($_) with $!nullable ),</span>
<span class="coverage-green"> |(:name($_) with $!name ),</span>
<span class="coverage-green"> |(:name-alias($_) with $!name-alias ),</span>
<span class="coverage-red"> |(:type($_) with $!type ),</span>
<span class="coverage-green"> |(:inflate($_) with &!inflate ),</span>
<span class="coverage-green"> |(:deflate($_) with &!deflate ),</span>
<span class="coverage-red"> |(:computation($_) with $!computation ),</span>
<span class="coverage-green"> |(:model-name($_) with $!model-name ),</span>
<span class="coverage-green"> |(:column-name($_) with $!column-name ),</span>
<span class="coverage-green"> |(:require($_) with $!require ),</span>
<span class="coverage-no"> )</span>
<span class="coverage-no">}</span>
<span class="coverage-no"></span>
<span class="coverage-no">#| Returns a Hash that represents the column for migration purposes</span>
<span class="coverage-green">method migration-hash(--> Hash()) {</span>
<span class="coverage-green"> |(:name($_) with $!name ),</span>
<span class="coverage-green"> |(:type(.type.^name) with $!attr ),</span>
<span class="coverage-green"> |(:references-table(.attr.package.^table) with $.ref ),</span>
<span class="coverage-green"> |(:references-column(.column-name) with $.ref ),</span>
<span class="coverage-green"> |(:is-id($_) with $!id ),</span>
<span class="coverage-green"> |(:is-auto-increment($_) with $!auto-increment ),</span>
<span class="coverage-green"> |(:is-nullable($_) with $!nullable ),</span>
<span class="coverage-no">}</span>
<span class="coverage-no"></span>
<span class="coverage-no">#| Subclass used to lazy evaluation of parameter types</span>
<span class="coverage-green">class ReferencesProxy does Callable {</span>
<span class="coverage-no"> has Str $.model-name is required;</span>
<span class="coverage-no"> has Str $.column-name;</span>
<span class="coverage-red"> has Str $.require = $!model-name;</span>
<span class="coverage-no"> has $.model;</span>
<span class="coverage-no"> has &.references;</span>
<span class="coverage-red"> has Bool $!tried-model = False;</span>
<span class="coverage-no"></span>
<span class="coverage-green"> method model($alias = Nil --> Mu:U) {</span>
<span class="coverage-green"> if !$!tried-model {</span>
<span class="coverage-green"> my $model = ::($!model-name);</span>
<span class="coverage-green"> if !$model && $model ~~ Failure {</span>
<span class="coverage-green"> require ::($!require);</span>
<span class="coverage-green"> $model = ::($!model-name);</span>
<span class="coverage-no"> }</span>
<span class="coverage-green"> $!model = $model;</span>
<span class="coverage-green"> $!tried-model = True;</span>
<span class="coverage-no"> }</span>
<span class="coverage-green"> do if $alias !=== Nil {</span>
<span class="coverage-green"> do if $alias.^table eq $!model.^table {</span>
<span class="coverage-red"> $alias</span>
<span class="coverage-no"> } else {</span>
<span class="coverage-red"> die "$alias.^name() isn't an alias for the table $!model.^table()"</span>
<span class="coverage-no"> }</span>
<span class="coverage-no"> } else {</span>
<span class="coverage-red"> $!model</span>
<span class="coverage-no"> }</span>
<span class="coverage-no"> }</span>
<span class="coverage-no"></span>
<span class="coverage-green"> method CALL-ME($alias = Nil) {</span>
<span class="coverage-green"> my $*RED-INTERNAL = True;</span>
<span class="coverage-green"> if &!references {</span>
<span class="coverage-green"> my $model = self.model($alias);</span>
<span class="coverage-green"> my $ret = &!references.($model);</span>
<span class="coverage-green"> if $ret ~~ Red::Column && $ret.class.^name eq '$?CLASS' {</span>
<span class="coverage-green"> $ret .= clone: :class($model)</span>
<span class="coverage-no"> }</span>
<span class="coverage-green"> $ret</span>
<span class="coverage-no"> }</span>
<span class="coverage-no"> else {</span>
<span class="coverage-green"> self.model($alias).^columns.first(*.column.attr-name eq $!column-name).column</span>
<span class="coverage-no"> }</span>
<span class="coverage-no"> }</span>
<span class="coverage-no">}</span>
<span class="coverage-no"></span>
<span class="coverage-no">#| Returns the class that column is part of.</span>
<span class="coverage-no">#method class { self.attr.package }</span>
<span class="coverage-no"></span>
<span class="coverage-no">#| Method that returns the comment for the column</span>
<span class="coverage-green">method comment { .Str with self.attr.WHY }</span>
<span class="coverage-no"></span>
<span class="coverage-no">#| Returns a function that will return a column that is referenced by this column</span>
<span class="coverage-green">method references(--> Callable) is rw {</span>
<span class="coverage-green"> &!actual-references //= do {</span>
<span class="coverage-green"> if &!references {</span>
<span class="coverage-green"> if $!model-name {</span>
<span class="coverage-green"> ReferencesProxy.new(:&!references, :$!model-name, :$!require, :$!model-type);</span>
<span class="coverage-no"> }</span>
<span class="coverage-no"> else {</span>
<span class="coverage-green"> &!references;</span>
<span class="coverage-no"> }</span>
<span class="coverage-no"> }</span>
<span class="coverage-no"> elsif $!model-name && $!column-name {</span>
<span class="coverage-green"> ReferencesProxy.new(:$!model-name, :$!column-name, :$!require, :$!model-type);</span>
<span class="coverage-no"> }</span>
<span class="coverage-no"> else {</span>
<span class="coverage-red"> Callable</span>
<span class="coverage-no"> }</span>
<span class="coverage-no"> }</span>
<span class="coverage-no">}</span>
<span class="coverage-no"></span>
<span class="coverage-no">#| Returns the column that is referenced by this one.</span>
<span class="coverage-green">method ref($model = $!model-type !=== Red::Model ?? $!model-type !! Nil) {</span>
<span class="coverage-green"> my $*RED-INTERNAL = True;</span>
<span class="coverage-green"> .($model) with self.references</span>
<span class="coverage-no">}</span>
<span class="coverage-no"></span>
<span class="coverage-no">#| Required by the Red::AST role</span>
<span class="coverage-green">method returns { $!attr.type }</span>
<span class="coverage-no"></span>
<span class="coverage-green">method transpose(&func) { func self }</span>
<span class="coverage-no"></span>
<span class="coverage-green">method gist { "{$!attr.package.HOW.^can("as") ?? $!attr.package.^as !! "({ $!attr.package.^name })"}.{$!name-alias}" }</span>
<span class="coverage-no"></span>
<span class="coverage-green">method cast(Str $type) {</span>
<span class="coverage-green"> Red::AST::Cast.new: self, $type</span>
<span class="coverage-no">}</span>
<span class="coverage-no"></span>
<span class="coverage-green">method find-column-name {</span>
<span class="coverage-green"> $!attr-name</span>
<span class="coverage-no">}</span>
<span class="coverage-no"></span>
<span class="coverage-no">#| Returns an alias of that column</span>
<span class="coverage-red">method alias(Str $name) {</span>
<span class="coverage-red"> self.clone: name-alias => $name</span>
<span class="coverage-no">}</span>
<span class="coverage-no"></span>
<span class="coverage-no">#| Returns a clone using a different name</span>
<span class="coverage-green">method as(Str $name, :$nullable = True) {</span>
<span class="coverage-green"> self.clone: attr-name => $name, :$name, id => False, :$nullable, attr => Attribute</span>
<span class="coverage-no">}</span>
<span class="coverage-no"></span>
<span class="coverage-green">submethod TWEAK(:$unique) {</span>
<span class="coverage-green"> with $unique {</span>
<span class="coverage-green"> when Bool {</span>
<span class="coverage-green"> $!attr.package.^add-unique-constraint: { self }</span>
<span class="coverage-no"> }</span>
<span class="coverage-green"> when Positional {</span>
<span class="coverage-green"> self.unique-groups.append: |$unique</span>
<span class="coverage-no"> }</span>
<span class="coverage-green"> default {</span>
<span class="coverage-green"> self.unique-groups.push: $unique</span>
<span class="coverage-no"> }</span>
<span class="coverage-no"> }</span>
<span class="coverage-no">}</span>
<span class="coverage-no"></span>
<span class="coverage-no">#| Do not test definedness, but returns a new Red::AST::IsDefined.</span>
<span class="coverage-no">#| It's used to test `IS NULL` on the given column. It's also used</span>
<span class="coverage-no">#| by any construction that naturally uses `.defined`.</span>
<span class="coverage-no"></span>
<span class="coverage-green">method defined {</span>
<span class="coverage-green"> Red::AST::IsDefined.new: self</span>
<span class="coverage-no">}</span>
<span class="coverage-no"></span>
<span class="coverage-red">method args {}</span>
<span class="coverage-no"></span>
<span class="coverage-green">method not { Red::AST::Not.new: self }</span>
</pre>
</div>
</div>
</div>
</body>
</html>