A WiP ORM for perl6
Clone or download
FCO Roles (#84)
* Make t/13 possible, but broke up everything else. Related to #80

* Fixing comparator methods

* Fixing errors on roles, flikering t/13. Related to #80

* Fix flickering test. related to #80

* ResultSeq.save; closes #79

* 0.0.1

* 0.0.2

* Make t/13 possible, but broke up everything else. Related to #80

* Fixing comparator methods

* Fixing errors on roles, flikering t/13. Related to #80

* Fix flickering test. related to #80

* rebase master on branch roles
Latest commit 8ff77d0 Jan 11, 2019
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
examples Fixing cqrs example Jan 1, 2019
lib Roles (#84) Jan 11, 2019
t Roles (#84) Jan 11, 2019
.gitignore add alias Aug 13, 2018
.travis.yml new .travis.yml Dec 6, 2018
Changes 0.0.2 Jan 4, 2019
LICENSE Starting tdd Aug 3, 2018
META6.json 0.0.2 Jan 4, 2019
README.md 0.0.2 Jan 4, 2019
dist.ini Starting tdd Aug 3, 2018

README.md

Build Status

Red

Take a look at our Wiki: https://github.com/FCO/Red/wiki

Red - A WiP ORM for perl6

INSTALL

Install with (you need rakudo 2018.12-94-g495ac7c00 or newer):

zef install Red

SYNOPSIS

use Red;

model Person { ... }

model Post {
    has Int     $.id        is id;
    has Int     $!author-id is referencing{ Person.id };
    has Str     $.title     is unique;
    has Str     $.body      is column;
    has Person  $.author    is relationship{ .author-id };
    has Bool    $.deleted   is column is rw = False;
    has Instant $.created   is column = now;

    method delete {
        $!deleted = True;
        self.^save
    }
}

model Person {
    has Int  $.id            is id;
    has Str  $.name          is column;
    has Post @.posts         is relationship{ .author-id };

    method active-posts { @!posts.grep: { not .deleted } }
}

my $*REDDB = database 'Pg';

my Post $post1 = Post.^load: :42id;   # Returns a Post object with data returned by
                                      # SELECT * FROM post me WHERE me.id = 42
my $id = 13;
my Post $post2 = Post.^load: :$id;    # Returns a Post object with data returned by
                                      # SELECT * FROM post me WHERE me.id = ? with
                                      # [13] as bind

say $post2.author;                    # Prints a Person object with data returned by
                                      # SELECT * FROM person me WHERE me.id = ?

say Person.new(:1id).posts;           # Prints a Seq (Post::ResultSeq) with
                                      # the return of:
                                      # SELECT * FROM post me WHERE me.author_id = ?
                                      # with [1] as bind.
                                      # converted for Post objects

say Person.new(:2id)
    .active-posts
    .grep: { .created > Date.today }  # SELECT * FROM post me WHERE
;                                     # me.author_id = ? AND me.deleted = 't'
                                      # AND me.created > '2018-08-14'::datetime
                                      # with [2] as bind.

my $author = $post2.author;
$author.name = "John Doe";

$author.^save;                        # UPDATE person SET name = ?
                                      # WHERE id = ? with ['John Doe', 13] as bind

$author.posts.elems;                  # SELECT COUNT(*) FROM post
                                      # WHERE author_id = ?

my $p = $author.posts.create:         # INSERT INTO post(author_id, title, body, deleted, created)
    :title<Bla>,                      # VALUES(?, ?, ?, ?, ?)
    :body<body>
;

DESCRIPTION

Red is a WiP ORM for perl6. It's not working yet. My objective publishing is only ask for help validating the APIs.

traits

  • is column

  • is column{}

  • is id

  • is id{}

  • is serial

  • is referencing{}

  • is relationship{}

  • is table<>

  • is nullable

features:

custom table name

model MyModel is table<custom_table_name> {}

not nullable columns by default

Red, by default, has not nullable columns, to change it:

model MyModel is nullable {                 # is nullable makes this model's columns nullable by default
    has Int $.col1 is column;               # this column now is nullable
    has Int $.col2 is column{ :!nullable }; # this column is not nullable
}

load object from database

MyModel.^load: 42;
MyModel.^load: id => 42;

save object on the database

$object.^save;

search for a list of object

Question.^all.grep: { .answer == 42 }; # returns a result seq

AUTHOR

Fernando Correa de Oliveira fernandocorrea@gmail.com

COPYRIGHT AND LICENSE

Copyright 2018 Fernando Correa de Oliveira

This library is free software; you can redistribute it and/or modify it under the Artistic License 2.0.