Red.git | docs/coverage/report-data/ | Red.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>RaCoCo result: Red</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 66%</h1>
</div>
</div>
</div>
<div class="row justify-content-md-center">
<div class="col-md-10">
<pre class="code">
<span class="coverage-green">use v6;</span>
<span class="coverage-no">use Red::Do;</span>
<span class="coverage-no">use Red::Model;</span>
<span class="coverage-no">use Red::Attr::Column;</span>
<span class="coverage-no">use Red::Column;</span>
<span class="coverage-no">use Red::ColumnMethods;</span>
<span class="coverage-no">use Red::Utils;</span>
<span class="coverage-no">use Red::ResultSeq;</span>
<span class="coverage-no">use Red::DefaultResultSeq;</span>
<span class="coverage-no">use Red::Attr::Query;</span>
<span class="coverage-no">use Red::AST;</span>
<span class="coverage-no">use MetamodelX::Red::Model;</span>
<span class="coverage-no">use Red::Traits;</span>
<span class="coverage-no">use Red::Operators;</span>
<span class="coverage-no">use Red::Database;</span>
<span class="coverage-no">use Red::AST::Optimizer::AND;</span>
<span class="coverage-no">use Red::AST::Optimizer::OR;</span>
<span class="coverage-no">use Red::AST::Optimizer::Case;</span>
<span class="coverage-no">use Red::Class;</span>
<span class="coverage-no">use Red::DB;</span>
<span class="coverage-no">use Red::Schema;</span>
<span class="coverage-no">use Red::Formatter;</span>
<span class="coverage-no">use Red::AST::Infixes;</span>
<span class="coverage-no"></span>
<span class="coverage-green">class Red:ver<0.1.60>:api<2> {</span>
<span class="coverage-no"> our %experimentals;</span>
<span class="coverage-red"> our @experimental-roles;</span>
<span class="coverage-green"> method events { Red::Class.instance.events }</span>
<span class="coverage-green"> method emit(|c) { get-RED-DB.emit: |c }</span>
<span class="coverage-red"> method experimentals { %experimentals }</span>
<span class="coverage-red"> method ping {</span>
<span class="coverage-red"> do for (%GLOBAL::RED-DEFULT-DRIVERS || :default(get-RED-DB)).kv -> $key, $conn {</span>
<span class="coverage-red"> $key => $conn.ping</span>
<span class="coverage-no"> }.Map</span>
<span class="coverage-no"> }</span>
<span class="coverage-green"> method exports(@experimentals --> Map()) {</span>
<span class="coverage-green"> %Red::experimentals{$_} = True for @experimentals;</span>
<span class="coverage-green"> Red::Do::EXPORT::ALL::,</span>
<span class="coverage-no"> Red::Traits::EXPORT::ALL::,</span>
<span class="coverage-no"> Red::Operators::EXPORT::ALL::,</span>
<span class="coverage-no"> Red::Schema::EXPORT::ALL::,</span>
<span class="coverage-no"> ‘&database’ => &database,</span>
<span class="coverage-green"> |@experimentals.map(-> $feature { |experimental( $feature ) })</span>
<span class="coverage-no"> }</span>
<span class="coverage-no">}</span>
<span class="coverage-no"></span>
<span class="coverage-green">BEGIN {</span>
<span class="coverage-green"> Red::Column.^add_role: Red::ColumnMethods;</span>
<span class="coverage-green"> Red::Column.^compose;</span>
<span class="coverage-no"></span>
<span class="coverage-green"> for <AND OR Case> -> $infix {</span>
<span class="coverage-green"> ::("Red::AST::$infix").^add_role: ::("Red::AST::Optimizer::$infix");</span>
<span class="coverage-green"> ::("Red::AST::$infix").^compose;</span>
<span class="coverage-no"> }</span>
<span class="coverage-no">}</span>
<span class="coverage-no"></span>
<span class="coverage-green">my package EXPORTHOW {</span>
<span class="coverage-green"> package DECLARE {</span>
<span class="coverage-red"> constant model = MetamodelX::Red::Model;</span>
<span class="coverage-no"> }</span>
<span class="coverage-no">}</span>
<span class="coverage-no"></span>
<span class="coverage-green">proto experimental(Str) {*}</span>
<span class="coverage-no"></span>
<span class="coverage-green">multi experimental("shortname") {</span>
<span class="coverage-green"> MetamodelX::Red::Model.^add_method: "experimental-name", method (\model) { model.^shortname }</span>
<span class="coverage-green"> MetamodelX::Red::Model.^compose;</span>
<span class="coverage-red"> Empty</span>
<span class="coverage-no">}</span>
<span class="coverage-no"></span>
<span class="coverage-green">multi experimental("formatters") {</span>
<span class="coverage-green"> MetamodelX::Red::Model.^add_method: "experimental-formatter", method { True }</span>
<span class="coverage-green"> Red::Column.^add_method: "experimental-formatter", method { True }</span>
<span class="coverage-green"> MetamodelX::Red::Model.^compose;</span>
<span class="coverage-green"> Red::Column.^compose;</span>
<span class="coverage-red"> Empty</span>
<span class="coverage-no">}</span>
<span class="coverage-no"></span>
<span class="coverage-red">multi experimental($ where "experimental migrations" | "migrations") {</span>
<span class="coverage-red"> require ::('MetamodelX::Red::Migration');</span>
<span class="coverage-red"> @Red::experimental-roles.push: ::('MetamodelX::Red::Migration');</span>
<span class="coverage-no"></span>
<span class="coverage-red"> Empty</span>
<span class="coverage-no">}</span>
<span class="coverage-no"></span>
<span class="coverage-red">multi experimental("supply") {</span>
<span class="coverage-red"> require ::('MetamodelX::Red::Supply');</span>
<span class="coverage-red"> @Red::experimental-roles.push: ::('MetamodelX::Red::Supply');</span>
<span class="coverage-no"></span>
<span class="coverage-red"> Empty</span>
<span class="coverage-no">}</span>
<span class="coverage-no"></span>
<span class="coverage-green">multi experimental("is-handling") {</span>
<span class="coverage-green"> multi trait_mod:<is>(Mu:U $model, :$handling) {</span>
<span class="coverage-green"> for $handling<> {</span>
<span class="coverage-green"> my ($orig, $new) = $_ ~~ Pair ?? [.key, .value] !! [$_, $_];</span>
<span class="coverage-green"> $model.^add_method: $new, method (|c) { self.^all."$orig"(|c) }</span>
<span class="coverage-no"> }</span>
<span class="coverage-no"> }</span>
<span class="coverage-green"> Map(</span>
<span class="coverage-no"> '&trait_mod:<is>' => &trait_mod:<is></span>
<span class="coverage-no"> )</span>
<span class="coverage-no">}</span>
<span class="coverage-no"></span>
<span class="coverage-green">multi experimental("has-one") {</span>
<span class="coverage-red"> Empty</span>
<span class="coverage-no">}</span>
<span class="coverage-no"></span>
<span class="coverage-green">multi experimental("refreshable") {</span>
<span class="coverage-green"> require ::('MetamodelX::Red::Refreshable');</span>
<span class="coverage-green"> @Red::experimental-roles.push: ::('MetamodelX::Red::Refreshable');</span>
<span class="coverage-no"></span>
<span class="coverage-red"> Empty</span>
<span class="coverage-no">}</span>
<span class="coverage-no"></span>
<span class="coverage-red">multi experimental($feature) { die "Experimental feature '{ $feature }' not recognized." }</span>
<span class="coverage-no"></span>
<span class="coverage-green">multi EXPORT(+@experimentals) {</span>
<span class="coverage-no"> #my $no = "no-optimization";</span>
<span class="coverage-no"> #if @experimentals.none eq $no {</span>
<span class="coverage-no"> # require ::("Red::AST::Infixes");</span>
<span class="coverage-no"> # for <AND OR Case> -> $infix {</span>
<span class="coverage-no"> # ::("Red::AST::$infix").^add_role: ::("Red::AST::Optimizer::$infix");</span>
<span class="coverage-no"> # ::("Red::AST::$infix").^compose;</span>
<span class="coverage-no"> # }</span>
<span class="coverage-no"> #} else {</span>
<span class="coverage-no"> # @experimentals .= grep: { $_ ne $no }</span>
<span class="coverage-no"> #}</span>
<span class="coverage-green"> Red.exports(@experimentals)</span>
<span class="coverage-no">}</span>
<span class="coverage-no"></span>
<span class="coverage-no">=begin pod</span>
<span class="coverage-no"></span>
<span class="coverage-no">[](https://github.com/FCO/Red/actions)</span>
<span class="coverage-no">[](https://github.com/FCO/Red/actions)</span>
<span class="coverage-no">[](http://sparrowhub.io:2222)</span>
<span class="coverage-no"></span>
<span class="coverage-no">=begin head1</span>
<span class="coverage-no">Red</span>
<span class="coverage-no">=end head1</span>
<span class="coverage-no"></span>
<span class="coverage-no">Take a look at our Documentation: L<https://fco.github.io/Red/></span>
<span class="coverage-no"></span>
<span class="coverage-no">=head2 Red - A **WiP** ORM for Raku</span>
<span class="coverage-no"></span>
<span class="coverage-no">=head2 INSTALL</span>
<span class="coverage-no"></span>
<span class="coverage-no">Install with (you need **rakudo 2018.12-94-g495ac7c00** or **newer**):</span>
<span class="coverage-no"></span>
<span class="coverage-no"> zef install Red</span>
<span class="coverage-no"></span>
<span class="coverage-no">=head2 SYNOPSIS</span>
<span class="coverage-no"></span>
<span class="coverage-no">=begin code :lang<perl6></span>
<span class="coverage-no"></span>
<span class="coverage-no">use Red:api<2>;</span>
<span class="coverage-no"></span>
<span class="coverage-no">model Person {...}</span>
<span class="coverage-no"></span>
<span class="coverage-no">model Post is rw {</span>
<span class="coverage-no"> has Int $.id is serial;</span>
<span class="coverage-no"> has Int $!author-id is referencing( *.id, :model(Person) );</span>
<span class="coverage-no"> has Str $.title is column{ :unique };</span>
<span class="coverage-no"> has Str $.body is column;</span>
<span class="coverage-no"> has Person $.author is relationship{ .author-id };</span>
<span class="coverage-no"> has Bool $.deleted is column = False;</span>
<span class="coverage-no"> has DateTime $.created is column .= now;</span>
<span class="coverage-no"> has Set $.tags is column{</span>
<span class="coverage-no"> :type<string>,</span>
<span class="coverage-no"> :deflate{ .keys.join: "," },</span>
<span class="coverage-no"> :inflate{ set(.split: ",") }</span>
<span class="coverage-no"> } = set();</span>
<span class="coverage-no"> method delete { $!deleted = True; self.^save }</span>
<span class="coverage-no">}</span>
<span class="coverage-no"></span>
<span class="coverage-no">model Person is rw {</span>
<span class="coverage-no"> has Int $.id is serial;</span>
<span class="coverage-no"> has Str $.name is column;</span>
<span class="coverage-no"> has Post @.posts is relationship{ .author-id };</span>
<span class="coverage-no"> method active-posts { @!posts.grep: not *.deleted }</span>
<span class="coverage-no">}</span>
<span class="coverage-no"></span>
<span class="coverage-no">my $*RED-DB = database "SQLite";</span>
<span class="coverage-no"></span>
<span class="coverage-no">Person.^create-table;</span>
<span class="coverage-no">=end code</span>
<span class="coverage-no"></span>
<span class="coverage-no">=begin code :lang<sql></span>
<span class="coverage-no">-- Equivalent to the following query:</span>
<span class="coverage-no">CREATE TABLE person(</span>
<span class="coverage-no"> id integer NOT NULL primary key</span>
<span class="coverage-no"> AUTOINCREMENT,</span>
<span class="coverage-no"> name varchar(255) NOT NULL</span>
<span class="coverage-no">)</span>
<span class="coverage-no">=end code</span>
<span class="coverage-no"></span>
<span class="coverage-no">=begin code :lang<perl6></span>
<span class="coverage-no">Post.^create-table;</span>
<span class="coverage-no">=end code</span>
<span class="coverage-no"></span>
<span class="coverage-no">=begin code :lang<sql></span>
<span class="coverage-no">-- Equivalent to the following query:</span>
<span class="coverage-no">CREATE TABLE post(</span>
<span class="coverage-no"> id integer NOT NULL primary key AUTOINCREMENT,</span>
<span class="coverage-no"> author_id integer NULL references person(id),</span>
<span class="coverage-no"> title varchar(255) NOT NULL,</span>
<span class="coverage-no"> body varchar(255) NOT NULL,</span>
<span class="coverage-no"> deleted integer NOT NULL,</span>
<span class="coverage-no"> created varchar(32) NOT NULL,</span>
<span class="coverage-no"> tags varchar(255) NOT NULL,</span>
<span class="coverage-no"> UNIQUE (title)</span>
<span class="coverage-no">)</span>
<span class="coverage-no">=end code</span>
<span class="coverage-no"></span>
<span class="coverage-no">=begin code :lang<perl6></span>
<span class="coverage-no">my Post $post1 = Post.^load: :42id;</span>
<span class="coverage-no">=end code</span>
<span class="coverage-no"></span>
<span class="coverage-no">=begin code :lang<sql></span>
<span class="coverage-no">-- Equivalent to the following query:</span>
<span class="coverage-no">SELECT</span>
<span class="coverage-no"> post.id,</span>
<span class="coverage-no"> post.author_id as "author-id",</span>
<span class="coverage-no"> post.title,</span>
<span class="coverage-no"> post.body,</span>
<span class="coverage-no"> post.deleted,</span>
<span class="coverage-no"> post.created,</span>
<span class="coverage-no"> post.tags</span>
<span class="coverage-no">FROM</span>
<span class="coverage-no"> post</span>
<span class="coverage-no">WHERE</span>
<span class="coverage-no"> post.id = 42</span>
<span class="coverage-no">=end code</span>
<span class="coverage-no"></span>
<span class="coverage-no">=begin code :lang<perl6></span>
<span class="coverage-no">my Post $post1 = Post.^load: 42;</span>
<span class="coverage-no">=end code</span>
<span class="coverage-no"></span>
<span class="coverage-no">=begin code :lang<sql></span>
<span class="coverage-no">-- Equivalent to the following query:</span>
<span class="coverage-no">SELECT</span>
<span class="coverage-no"> post.id,</span>
<span class="coverage-no"> post.author_id as "author-id",</span>
<span class="coverage-no"> post.title,</span>
<span class="coverage-no"> post.body,</span>
<span class="coverage-no"> post.deleted,</span>
<span class="coverage-no"> post.created,</span>
<span class="coverage-no"> post.tags</span>
<span class="coverage-no">FROM</span>
<span class="coverage-no"> post</span>
<span class="coverage-no">WHERE</span>
<span class="coverage-no"> post.id = 42</span>
<span class="coverage-no">=end code</span>
<span class="coverage-no"></span>
<span class="coverage-no">=begin code :lang<perl6></span>
<span class="coverage-no">my Post $post1 = Post.^load: :title("my title");</span>
<span class="coverage-no">=end code</span>
<span class="coverage-no"></span>
<span class="coverage-no">=begin code :lang<sql></span>
<span class="coverage-no">-- Equivalent to the following query:</span>
<span class="coverage-no">SELECT</span>
<span class="coverage-no"> post.id,</span>
<span class="coverage-no"> post.author_id as "author-id",</span>
<span class="coverage-no"> post.title,</span>
<span class="coverage-no"> post.body,</span>
<span class="coverage-no"> post.deleted,</span>
<span class="coverage-no"> post.created,</span>
<span class="coverage-no"> post.tags</span>
<span class="coverage-no">FROM</span>
<span class="coverage-no"> post</span>
<span class="coverage-no">WHERE</span>
<span class="coverage-no"> post.title = ‘my title’</span>
<span class="coverage-no">=end code</span>
<span class="coverage-no"></span>
<span class="coverage-no">=begin code :lang<perl6></span>
<span class="coverage-no">my $person = Person.^create: :name<Fernando>;</span>
<span class="coverage-no">=end code</span>
<span class="coverage-no"></span>
<span class="coverage-no">=begin code :lang<sql></span>
<span class="coverage-no">-- Equivalent to the following query:</span>
<span class="coverage-no">INSERT INTO person(</span>
<span class="coverage-no"> name</span>
<span class="coverage-no">)</span>
<span class="coverage-no">VALUES(</span>
<span class="coverage-no"> ?</span>
<span class="coverage-no">)</span>
<span class="coverage-no">-- BIND: ["Fernando"]</span>
<span class="coverage-no"></span>
<span class="coverage-no">-- SQLite needs an extra select:</span>
<span class="coverage-no"></span>
<span class="coverage-no">SELECT</span>
<span class="coverage-no"> person.id,</span>
<span class="coverage-no"> person.name</span>
<span class="coverage-no">FROM</span>
<span class="coverage-no"> person</span>
<span class="coverage-no">WHERE</span>
<span class="coverage-no"> _rowid_ = last_insert_rowid()</span>
<span class="coverage-no">LIMIT 1</span>
<span class="coverage-no">=end code</span>
<span class="coverage-no"></span>
<span class="coverage-no">=begin code :lang<perl6></span>
<span class="coverage-no">RETURNS:</span>
<span class="coverage-no">Person.new(name => "Fernando")</span>
<span class="coverage-no">=end code</span>
<span class="coverage-no"></span>
<span class="coverage-no">=begin code :lang<perl6></span>
<span class="coverage-no"># Using Pg Driver for this block</span>
<span class="coverage-no">{</span>
<span class="coverage-no"> my $*RED-DB = database "Pg";</span>
<span class="coverage-no"> my $person = Person.^create: :name<Fernando>;</span>
<span class="coverage-no">}</span>
<span class="coverage-no">=end code</span>
<span class="coverage-no"></span>
<span class="coverage-no">=begin code :lang<sql></span>
<span class="coverage-no">-- Equivalent to the following query:</span>
<span class="coverage-no">INSERT INTO person(</span>
<span class="coverage-no"> name</span>
<span class="coverage-no">)</span>
<span class="coverage-no">VALUES(</span>
<span class="coverage-no"> $1</span>
<span class="coverage-no">) RETURNING *</span>
<span class="coverage-no">-- BIND: ["Fernando"]</span>
<span class="coverage-no">=end code</span>
<span class="coverage-no"></span>
<span class="coverage-no">=begin code :lang<perl6></span>
<span class="coverage-no">RETURNS:</span>
<span class="coverage-no">Person.new(name => "Fernando")</span>
<span class="coverage-no">=end code</span>
<span class="coverage-no"></span>
<span class="coverage-no">=begin code :lang<perl6></span>
<span class="coverage-no">say $person.posts;</span>
<span class="coverage-no">=end code</span>
<span class="coverage-no"></span>
<span class="coverage-no">=begin code :lang<sql></span>
<span class="coverage-no">-- Equivalent to the following query:</span>
<span class="coverage-no">SELECT</span>
<span class="coverage-no"> post.id,</span>
<span class="coverage-no"> post.author_id as "author-id",</span>
<span class="coverage-no"> post.title,</span>
<span class="coverage-no"> post.body,</span>
<span class="coverage-no"> post.deleted,</span>
<span class="coverage-no"> post.created,</span>
<span class="coverage-no"> post.tags</span>
<span class="coverage-no">FROM</span>
<span class="coverage-no"> post</span>
<span class="coverage-no">WHERE</span>
<span class="coverage-no"> post.author_id = ?</span>
<span class="coverage-no">-- BIND: [1]</span>
<span class="coverage-no">=end code</span>
<span class="coverage-no"></span>
<span class="coverage-no">=begin code :lang<perl6></span>
<span class="coverage-no">say Person.new(:2id)</span>
<span class="coverage-no"> .active-posts</span>
<span class="coverage-no"> .grep: { .created > now }</span>
<span class="coverage-no">=end code</span>
<span class="coverage-no"></span>
<span class="coverage-no">=begin code :lang<sql></span>
<span class="coverage-no">-- Equivalent to the following query:</span>
<span class="coverage-no">SELECT</span>
<span class="coverage-no"> post.id,</span>
<span class="coverage-no"> post.author_id as "author-id",</span>
<span class="coverage-no"> post.title,</span>
<span class="coverage-no"> post.body,</span>
<span class="coverage-no"> post.deleted,</span>
<span class="coverage-no"> post.created,</span>
<span class="coverage-no"> post.tags</span>
<span class="coverage-no">FROM</span>
<span class="coverage-no"> post</span>
<span class="coverage-no">WHERE</span>
<span class="coverage-no"> (</span>
<span class="coverage-no"> post.author_id = ?</span>
<span class="coverage-no"> AND (</span>
<span class="coverage-no"> post.deleted == 0</span>
<span class="coverage-no"> OR post.deleted IS NULL</span>
<span class="coverage-no"> )</span>
<span class="coverage-no"> )</span>
<span class="coverage-no"> AND post.created > 1554246698.448671</span>
<span class="coverage-no">-- BIND: [2]</span>
<span class="coverage-no">=end code</span>
<span class="coverage-no"></span>
<span class="coverage-no">=begin code :lang<perl6></span>
<span class="coverage-no">my $now = now;</span>
<span class="coverage-no">say Person.new(:3id)</span>
<span class="coverage-no"> .active-posts</span>
<span class="coverage-no"> .grep: { .created > $now }</span>
<span class="coverage-no">=end code</span>
<span class="coverage-no"></span>
<span class="coverage-no">=begin code :lang<sql></span>
<span class="coverage-no">-- Equivalent to the following query:</span>
<span class="coverage-no">SELECT</span>
<span class="coverage-no"> post.id,</span>
<span class="coverage-no"> post.author_id as "author-id",</span>
<span class="coverage-no"> post.title,</span>
<span class="coverage-no"> post.body,</span>
<span class="coverage-no"> post.deleted,</span>
<span class="coverage-no"> post.created,</span>
<span class="coverage-no"> post.tags</span>
<span class="coverage-no">FROM</span>
<span class="coverage-no"> post</span>
<span class="coverage-no">WHERE</span>
<span class="coverage-no"> (</span>
<span class="coverage-no"> post.author_id = ?</span>
<span class="coverage-no"> AND (</span>
<span class="coverage-no"> post.deleted == 0</span>
<span class="coverage-no"> OR post.deleted IS NULL</span>
<span class="coverage-no"> )</span>
<span class="coverage-no"> )</span>
<span class="coverage-no"> AND post.created > ?</span>
<span class="coverage-no">-- BIND: [</span>
<span class="coverage-no">-- 3,</span>
<span class="coverage-no">-- Instant.from-posix(</span>
<span class="coverage-no">-- <399441421363/257>,</span>
<span class="coverage-no">-- Bool::False</span>
<span class="coverage-no">-- )</span>
<span class="coverage-no">-- ]</span>
<span class="coverage-no">=end code</span>
<span class="coverage-no"></span>
<span class="coverage-no">=begin code :lang<perl6></span>
<span class="coverage-no">Person.^create:</span>
<span class="coverage-no"> :name<Fernando>,</span>
<span class="coverage-no"> :posts[</span>
<span class="coverage-no"> {</span>
<span class="coverage-no"> :title("My new post"),</span>
<span class="coverage-no"> :body("A long post")</span>
<span class="coverage-no"> },</span>
<span class="coverage-no"> ]</span>
<span class="coverage-no">;</span>
<span class="coverage-no">=end code</span>
<span class="coverage-no"></span>
<span class="coverage-no">=begin code :lang<sql></span>
<span class="coverage-no">-- Equivalent to the following query:</span>
<span class="coverage-no">INSERT INTO person(</span>
<span class="coverage-no"> name</span>
<span class="coverage-no">)</span>
<span class="coverage-no">VALUES(</span>
<span class="coverage-no"> ?</span>
<span class="coverage-no">)</span>
<span class="coverage-no">-- BIND: ["Fernando"]</span>
<span class="coverage-no"></span>
<span class="coverage-no">SELECT</span>
<span class="coverage-no"> person.id,</span>
<span class="coverage-no"> person.name</span>
<span class="coverage-no">FROM</span>
<span class="coverage-no"> person</span>
<span class="coverage-no">WHERE</span>
<span class="coverage-no"> _rowid_ = last_insert_rowid()</span>
<span class="coverage-no">LIMIT 1</span>
<span class="coverage-no">-- BIND: []</span>
<span class="coverage-no"></span>
<span class="coverage-no">INSERT INTO post(</span>
<span class="coverage-no"> created,</span>
<span class="coverage-no"> title,</span>
<span class="coverage-no"> author_id,</span>
<span class="coverage-no"> tags,</span>
<span class="coverage-no"> deleted,</span>
<span class="coverage-no"> body</span>
<span class="coverage-no">)</span>
<span class="coverage-no">VALUES(</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"> ?,</span>
<span class="coverage-no"> ?</span>
<span class="coverage-no">)</span>
<span class="coverage-no">-- BIND: [</span>
<span class="coverage-no">-- "2019-04-02T22:55:13.658596+01:00",</span>
<span class="coverage-no">-- "My new post",</span>
<span class="coverage-no">-- 1,</span>
<span class="coverage-no">-- "",</span>
<span class="coverage-no">-- Bool::False,</span>
<span class="coverage-no">-- "A long post"</span>
<span class="coverage-no">-- ]</span>
<span class="coverage-no"></span>
<span class="coverage-no">SELECT</span>
<span class="coverage-no"> post.id,</span>
<span class="coverage-no"> post.author_id as "author-id",</span>
<span class="coverage-no"> post.title,</span>
<span class="coverage-no"> post.body,</span>
<span class="coverage-no"> post.deleted,</span>
<span class="coverage-no"> post.created,</span>
<span class="coverage-no"> post.tags</span>
<span class="coverage-no">FROM</span>
<span class="coverage-no"> post</span>
<span class="coverage-no">WHERE</span>
<span class="coverage-no"> _rowid_ = last_insert_rowid()</span>
<span class="coverage-no">LIMIT 1</span>
<span class="coverage-no">=end code</span>
<span class="coverage-no"></span>
<span class="coverage-no">=begin code :lang<perl6></span>
<span class="coverage-no">my $post = Post.^load: :title("My new post");</span>
<span class="coverage-no">=end code</span>
<span class="coverage-no"></span>
<span class="coverage-no">=begin code :lang<sql></span>
<span class="coverage-no">-- Equivalent to the following query:</span>
<span class="coverage-no">SELECT</span>
<span class="coverage-no"> post.id,</span>
<span class="coverage-no"> post.author_id as "author-id",</span>
<span class="coverage-no"> post.title,</span>
<span class="coverage-no"> post.body,</span>
<span class="coverage-no"> post.deleted,</span>
<span class="coverage-no"> post.created,</span>
<span class="coverage-no"> post.tags</span>
<span class="coverage-no">FROM</span>
<span class="coverage-no"> post</span>
<span class="coverage-no">WHERE</span>
<span class="coverage-no"> post.title = ‘My new post’</span>
<span class="coverage-no">-- BIND: []</span>
<span class="coverage-no">=end code</span>
<span class="coverage-no"></span>
<span class="coverage-no">=begin code :lang<perl6></span>
<span class="coverage-no">RETURNS:</span>
<span class="coverage-no">Post.new(</span>
<span class="coverage-no"> title => "My new post",</span>
<span class="coverage-no"> body => "A long post",</span>
<span class="coverage-no"> deleted => 0,</span>
<span class="coverage-no"> created => DateTime.new(</span>
<span class="coverage-no"> 2019,</span>
<span class="coverage-no"> 4,</span>
<span class="coverage-no"> 2,</span>
<span class="coverage-no"> 23,</span>
<span class="coverage-no"> 7,</span>
<span class="coverage-no"> 46.677388,</span>
<span class="coverage-no"> :timezone(3600)</span>
<span class="coverage-no"> ),</span>
<span class="coverage-no"> tags => Set.new("")</span>
<span class="coverage-no">)</span>
<span class="coverage-no">=end code</span>
<span class="coverage-no"></span>
<span class="coverage-no">=begin code :lang<perl6></span>
<span class="coverage-no">say $post.body;</span>
<span class="coverage-no">=end code</span>
<span class="coverage-no"></span>
<span class="coverage-no">=begin code :lang<perl6></span>
<span class="coverage-no">PRINTS:</span>
<span class="coverage-no">A long post</span>
<span class="coverage-no">=end code</span>
<span class="coverage-no"></span>
<span class="coverage-no">=begin code :lang<perl6></span>
<span class="coverage-no">my $author = $post.author;</span>
<span class="coverage-no">=end code</span>
<span class="coverage-no"></span>
<span class="coverage-no">=begin code :lang<perl6></span>
<span class="coverage-no">RETURNS:</span>
<span class="coverage-no">Person.new(name => "Fernando")</span>
<span class="coverage-no">=end code</span>
<span class="coverage-no"></span>
<span class="coverage-no">=begin code :lang<perl6></span>
<span class="coverage-no">$author.name = "John Doe";</span>
<span class="coverage-no"></span>
<span class="coverage-no">$author.^save;</span>
<span class="coverage-no">=end code</span>
<span class="coverage-no"></span>
<span class="coverage-no">=begin code :lang<sql></span>
<span class="coverage-no">-- Equivalent to the following query:</span>
<span class="coverage-no">UPDATE person SET</span>
<span class="coverage-no"> name = ‘John Doe’</span>
<span class="coverage-no">WHERE id = 1</span>
<span class="coverage-no">=end code</span>
<span class="coverage-no"></span>
<span class="coverage-no">=begin code :lang<perl6></span>
<span class="coverage-no">$author.posts.create:</span>
<span class="coverage-no"> :title("Second post"),</span>
<span class="coverage-no"> :body("Another long post");</span>
<span class="coverage-no">=end code</span>
<span class="coverage-no"></span>
<span class="coverage-no">=begin code :lang<sql></span>
<span class="coverage-no">-- Equivalent to the following query:</span>
<span class="coverage-no">INSERT INTO post(</span>
<span class="coverage-no"> title,</span>
<span class="coverage-no"> body,</span>
<span class="coverage-no"> created,</span>
<span class="coverage-no"> tags,</span>
<span class="coverage-no"> deleted,</span>
<span class="coverage-no"> author_id</span>
<span class="coverage-no">)</span>
<span class="coverage-no">VALUES(</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"> ?,</span>
<span class="coverage-no"> ?</span>
<span class="coverage-no">)</span>
<span class="coverage-no">-- BIND: [</span>
<span class="coverage-no">-- "Second post",</span>
<span class="coverage-no">-- "Another long post",</span>
<span class="coverage-no">-- "2019-04-02T23:28:09.346442+01:00",</span>
<span class="coverage-no">-- "",</span>
<span class="coverage-no">-- Bool::False,</span>
<span class="coverage-no">-- 1</span>
<span class="coverage-no">-- ]</span>
<span class="coverage-no">=end code</span>
<span class="coverage-no"></span>
<span class="coverage-no">=begin code :lang<perl6></span>
<span class="coverage-no">$author.posts.elems;</span>
<span class="coverage-no">=end code</span>
<span class="coverage-no"></span>
<span class="coverage-no">=begin code :lang<sql></span>
<span class="coverage-no">-- Equivalent to the following query:</span>
<span class="coverage-no">SELECT</span>
<span class="coverage-no"> count(*) as "data_1"</span>
<span class="coverage-no">FROM</span>
<span class="coverage-no"> post</span>
<span class="coverage-no">WHERE</span>
<span class="coverage-no"> post.author_id = ?</span>
<span class="coverage-no">-- BIND: [1]</span>
<span class="coverage-no">=end code</span>
<span class="coverage-no"></span>
<span class="coverage-no">=begin code :lang<perl6></span>
<span class="coverage-no">RETURNS:</span>
<span class="coverage-no">2</span>
<span class="coverage-no">=end code</span>
<span class="coverage-no"></span>
<span class="coverage-no">=head2 DESCRIPTION</span>
<span class="coverage-no"></span>
<span class="coverage-no">Red is a *WiP* ORM for Raku.</span>
<span class="coverage-no"></span>
<span class="coverage-no">=head3 traits</span>
<span class="coverage-no"></span>
<span class="coverage-no">=item C<is column></span>
<span class="coverage-no">=item C<is column{}></span>
<span class="coverage-no">=item C<is id></span>
<span class="coverage-no">=item C<is id{}></span>
<span class="coverage-no">=item C<is serial></span>
<span class="coverage-no">=item C<is referencing{}></span>
<span class="coverage-no">=item C<is relationship{}></span>
<span class="coverage-no">=item C<is table<>></span>
<span class="coverage-no">=item C<is nullable></span>
<span class="coverage-no"></span>
<span class="coverage-no">=head3 features:</span>
<span class="coverage-no"></span>
<span class="coverage-no">=head4 relationships</span>
<span class="coverage-no"></span>
<span class="coverage-no">Red will infer relationship data if you use type constraints on your properties.</span>
<span class="coverage-no"></span>
<span class="coverage-no">=begin code :lang<perl6></span>
<span class="coverage-no"># Single file e.g. Schema.pm6</span>
<span class="coverage-no"></span>
<span class="coverage-no">model Related { ... }</span>
<span class="coverage-no"></span>
<span class="coverage-no"></span>
<span class="coverage-no"># belongs to</span>
<span class="coverage-no">model MyModel {</span>
<span class="coverage-no"> has Int $!related-id is referencing( *.id, :model<Related> );</span>
<span class="coverage-no"> has Related $.related is relationship{ .id };</span>
<span class="coverage-no">}</span>
<span class="coverage-no"></span>
<span class="coverage-no"># has one/has many</span>
<span class="coverage-no">model Related {</span>
<span class="coverage-no"> has Int $.id is serial;</span>
<span class="coverage-no"> has MyModel @.my-models is relationship{ .related-id };</span>
<span class="coverage-no">}</span>
<span class="coverage-no">=end code</span>
<span class="coverage-no"></span>
<span class="coverage-no">If you want to put your schema into multiple files, you can create an "indirect"</span>
<span class="coverage-no">relationship, and Red will look up the related models as necessary.</span>
<span class="coverage-no"></span>
<span class="coverage-no">=begin code :lang<perl6></span>
<span class="coverage-no"># MyModel.pm6</span>
<span class="coverage-no">model MyModel {</span>
<span class="coverage-no"> has Int $!related-id is referencing{ :model<Related>, :column<id> };</span>
<span class="coverage-no"> has $.related is relationship({ .id }, :model<Related>);</span>
<span class="coverage-no">}</span>
<span class="coverage-no"></span>
<span class="coverage-no"># Related.pm6</span>
<span class="coverage-no">model Related {</span>
<span class="coverage-no"> has Int $.id is serial;</span>
<span class="coverage-no"> has @.my-models is relationship({ .related-id }, :model<MyModel>);</span>
<span class="coverage-no">}</span>
<span class="coverage-no">=end code</span>
<span class="coverage-no"></span>
<span class="coverage-no">If Red can’t find where your C<model> is defined you can override where it looks</span>
<span class="coverage-no">with C<require>:</span>
<span class="coverage-no"></span>
<span class="coverage-no">=begin code :lang<perl6></span>
<span class="coverage-no"> has Int $!related-id is referencing{ :model<Related>, :column<id>,</span>
<span class="coverage-no"> :require<MyApp::Schema::Related> };</span>
<span class="coverage-no">=end code</span>
<span class="coverage-no"></span>
<span class="coverage-no">=head4 custom table name</span>
<span class="coverage-no"></span>
<span class="coverage-no">=begin code :lang<perl6></span>
<span class="coverage-no"></span>
<span class="coverage-no">model MyModel is table<custom_table_name> {}</span>
<span class="coverage-no"></span>
<span class="coverage-no">=end code</span>
<span class="coverage-no"></span>
<span class="coverage-no">=head4 not nullable columns by default</span>
<span class="coverage-no"></span>
<span class="coverage-no">Red, by default, has not nullable columns, to change it:</span>
<span class="coverage-no"></span>
<span class="coverage-no">=begin code :lang<perl6></span>
<span class="coverage-no">#| This makes this model’s columns nullable by default</span>
<span class="coverage-no">model MyModel is nullable {</span>
<span class="coverage-no"> has Int $.col1 is column; #= this column is nullable</span>
<span class="coverage-no"> has Int $.col2 is column{ :!nullable }; #= this one is not nullable</span>
<span class="coverage-no">}</span>
<span class="coverage-no">=end code</span>
<span class="coverage-no"></span>
<span class="coverage-no">=head4 load object from database</span>
<span class="coverage-no"></span>
<span class="coverage-no">=begin code :lang<perl6></span>
<span class="coverage-no">MyModel.^load: 42;</span>
<span class="coverage-no">MyModel.^load: id => 42;</span>
<span class="coverage-no">=end code</span>
<span class="coverage-no"></span>
<span class="coverage-no">=head4 save object on the database</span>
<span class="coverage-no"></span>
<span class="coverage-no">=begin code :lang<perl6></span>
<span class="coverage-no">$object.^save;</span>
<span class="coverage-no">=end code</span>
<span class="coverage-no"></span>
<span class="coverage-no">=head4 search for a list of object</span>
<span class="coverage-no"></span>
<span class="coverage-no">=begin code :lang<perl6></span>
<span class="coverage-no">Question.^all.grep: { .answer == 42 }; # returns a result seq</span>
<span class="coverage-no">=end code</span>
<span class="coverage-no"></span>
<span class="coverage-no">=head4 phasers</span>
<span class="coverage-no"></span>
<span class="coverage-no">=item C<before-create></span>
<span class="coverage-no">=item C<after-create></span>
<span class="coverage-no">=item C<before-update></span>
<span class="coverage-no">=item C<after-update></span>
<span class="coverage-no">=item C<before-delete></span>
<span class="coverage-no">=item C<after-delete></span>
<span class="coverage-no"></span>
<span class="coverage-no">=head4 Temporary table</span>
<span class="coverage-no"></span>
<span class="coverage-no">=begin code :lang<perl6></span>
<span class="coverage-no">model Bla is temp { ... }</span>
<span class="coverage-no">=end code</span>
<span class="coverage-no"></span>
<span class="coverage-no">=head4 Create table</span>
<span class="coverage-no"></span>
<span class="coverage-no">=begin code :lang<perl6></span>
<span class="coverage-no">Question.^create-table;</span>
<span class="coverage-no">Question.^create-table: :if-not-exists;</span>
<span class="coverage-no">Question.^create-table: :unless-exists;</span>
<span class="coverage-no">=end code</span>
<span class="coverage-no"></span>
<span class="coverage-no">=head4 IN</span>
<span class="coverage-no"></span>
<span class="coverage-no">=begin code :lang<perl6></span>
<span class="coverage-no">Question.^all.grep: *.answer ⊂ (3.14, 13, 42)</span>
<span class="coverage-no">=end code</span>
<span class="coverage-no"></span>
<span class="coverage-no">=head4 create</span>
<span class="coverage-no"></span>
<span class="coverage-no">=begin code :lang<perl6></span>
<span class="coverage-no"></span>
<span class="coverage-no">Post.^create: :body("bla ble bli blo blu"), :title("qwer");</span>
<span class="coverage-no"></span>
<span class="coverage-no"></span>
<span class="coverage-no">model Tree {</span>
<span class="coverage-no"> has UInt $!id is id;</span>
<span class="coverage-no"> has Str $.value is column;</span>
<span class="coverage-no"> has UInt $!parent-id is referencing{ Tree.id };</span>
<span class="coverage-no"></span>
<span class="coverage-no"> has Tree $.parent is relationship{ .parent-id };</span>
<span class="coverage-no"> has Tree @.kids is relationship{ .parent-id };</span>
<span class="coverage-no">}</span>
<span class="coverage-no"></span>
<span class="coverage-no">Tree.^create-table: :if-not-exists;</span>
<span class="coverage-no"></span>
<span class="coverage-no">Tree.^create:</span>
<span class="coverage-no"> :value<Bla>,</span>
<span class="coverage-no"> :parent{:value<Ble>},</span>
<span class="coverage-no"> :kids[</span>
<span class="coverage-no"> {:value<Bli>},</span>
<span class="coverage-no"> {:value<Blo>},</span>
<span class="coverage-no"> {:value<Blu>}</span>
<span class="coverage-no"> ]</span>
<span class="coverage-no">;</span>
<span class="coverage-no"></span>
<span class="coverage-no">=end code</span>
<span class="coverage-no"></span>
<span class="coverage-no">=head2 AUTHOR</span>
<span class="coverage-no"></span>
<span class="coverage-no">Fernando Correa de Oliveira <fernandocorrea@gmail.com></span>
<span class="coverage-no"></span>
<span class="coverage-no">=head2 COPYRIGHT AND LICENSE</span>
<span class="coverage-no"></span>
<span class="coverage-no">Copyright 2018 Fernando Correa de Oliveira</span>
<span class="coverage-no"></span>
<span class="coverage-no">This library is free software; you can redistribute it and/or modify it under the Artistic License 2.0.</span>
<span class="coverage-no"></span>
<span class="coverage-no">=end pod</span>
</pre>
</div>
</div>
</div>
</body>
</html>