Aion-Query

 view release on metacpan or  search on metacpan

Changes  view on Meta::CPAN

Revision history for Perl extension Aion::Query

0.0.6 2024-07-07T12:38:14Z

    - query_attach add empty array to attach row if not exists result to it

0.0.5 2024-07-07T12:32:27Z

    - query_attach returns array or array_ref with it query results

0.0.4 2024-07-06T17:18:44Z

    - add subroutine query_attach
    - writes test-cases for subroutine query_slice
    - requires license GPL_3 in cpanfile

0.0.3 2023-11-30T15:23:52Z

    - add query param-masks :^x, :~x, and :.x for set typed value
    - add x*>> :_ in query_prepare. This is inline map

0.0.2 2023-11-01T10:55:12Z

LICENSE  view on Meta::CPAN

copy of the Program in return for a fee.

                     END OF TERMS AND CONDITIONS

            How to Apply These Terms to Your New Programs

  If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.

  To do so, attach the following notices to the program.  It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.

    {one line to give the program's name and a brief idea of what it does.}
    Copyright (C) {year}  {name of author}

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

README.md  view on Meta::CPAN

        {title => "Mir",           author_id => 1},
    ],
    3 => [
        {title => "Mips as cpu",   author_id => 3}
    ],
};

\%author  # --> $rows
```

## query_attach ($rows, $attach, $query, %kw)

Подсоединяет в результат запроса результат другого запроса.

`$attach` содержит три ключа через двоеточие: ключ для присоединяемых данных, столбец из `$rows` и столбец из `$query`. По столбцам происходит объедÐ...

Возвращает функция массив с результатом запроса (`$query`), в который можно приаттачить ещё что-то.

```perl
my $authors = query "SELECT id, name FROM author";

my $res = [
    {name => "Pushkin A.S.", id => 1},
    {name => "Pushkin A.",   id => 2},
    {name => "Alice",        id => 3},
];

$authors # --> $res

my @books = query_attach $authors => "books:id:author_id" => "SELECT author_id, title FROM book ORDER BY title";

my $attaches = [
    {name => "Pushkin A.S.", id => 1, books => [
        {title => "Kiss in night", author_id => 1},
        {title => "Mir",           author_id => 1},
    ]},
    {name => "Pushkin A.",   id => 2, books => []},
    {name => "Alice",        id => 3, books => [
        {title => "Mips as cpu", author_id => 3},
    ]},
];

$authors # --> $attaches

my $books = [
    {title => "Kiss in night", author_id => 1},
    {title => "Mips as cpu",   author_id => 3},
    {title => "Mir",           author_id => 1},
];

\@books  # --> $books
```

i18n/Aion/Query.ru-en.po  view on Meta::CPAN


msgid "Если нужен хеш вида идентификатор – строка:"
msgstr "If you need a hash of the form identifier - string:"

msgid "Если одному идентификатору соответствует несколько строк, то логично собрать их в массивы:"
msgstr "If several lines correspond to one identifier, then it is logical to collect them into arrays:"

msgid "Ну и строки со всеми полями:"
msgstr "Well, the lines with all the fields:"

msgid "## query_attach ($rows, $attach, $query, %kw)"
msgstr "## query_attach ($rows, $attach, $query, %kw)"

msgid "Подсоединяет в результат запроса результат другого запроса."
msgstr "Includes the result of another query into the result of a query."

msgid "`$attach` содержит три ключа через двоеточие: ключ для присоединяемых данных, столбец из `$rows` и столбец из `$query`. По столбцам происходит об...
msgstr "`$attach` contains three keys separated by a colon: the key for the data to be attached, a column from `$rows` and a column from `$query`. Rows are merged across columns."

msgid "Возвращает функция массив с результатом запроса (`$query`), в который можно приаттачить ещё что-то."
msgstr "The function returns an array with the result of the query (`$query`), into which you can attach something else."

msgid "## query_col ($query, %params)"
msgstr "## query_col ($query, %params)"

msgid "Возвращает один столбец."
msgstr "Returns one column."

msgid "## query_row ($query, %params)"
msgstr "## query_row ($query, %params)"

lib/Aion/Query.md  view on Meta::CPAN

        {title => "Mir",           author_id => 1},
    ],
    3 => [
        {title => "Mips as cpu",   author_id => 3}
    ],
};

\%author  # --> $rows
```

## query_attach ($rows, $attach, $query, %kw)

Подсоединяет в результат запроса результат другого запроса.

`$attach` содержит три ключа через двоеточие: ключ для присоединяемых данных, столбец из `$rows` и столбец из `$query`. По столбцам происходит объедÐ...

Возвращает функция массив с результатом запроса (`$query`), в который можно приаттачить ещё что-то.

```perl
my $authors = query "SELECT id, name FROM author";

my $res = [
    {name => "Pushkin A.S.", id => 1},
    {name => "Pushkin A.",   id => 2},
    {name => "Alice",        id => 3},
];

$authors # --> $res

my @books = query_attach $authors => "books:id:author_id" => "SELECT author_id, title FROM book ORDER BY title";

my $attaches = [
    {name => "Pushkin A.S.", id => 1, books => [
        {title => "Kiss in night", author_id => 1},
        {title => "Mir",           author_id => 1},
    ]},
    {name => "Pushkin A.",   id => 2, books => []},
    {name => "Alice",        id => 3, books => [
        {title => "Mips as cpu", author_id => 3},
    ]},
];

$authors # --> $attaches

my $books = [
    {title => "Kiss in night", author_id => 1},
    {title => "Mips as cpu",   author_id => 3},
    {title => "Mir",           author_id => 1},
];

\@books  # --> $books
```

lib/Aion/Query.pm  view on Meta::CPAN

	else {
		map { $_->{$key} => $_->{$val} } @$rows
	}
}

# Подсоединить в результат запроса результат другого запроса
# 
# $authors = query "SELECT id, name FROM author";
# # $authors as [{id => 1, name => "..."}, ...];
#
# query_attach $authors => 'books:id:author_id' => "SELECT author_id, title FROM book"
#
sub query_attach {
	my ($rows, $attach, $query, %kw) = @_;
	
	($attach, my $key1, my $key2) = split /:/, $attach;

	my %row1 = map { $_->{$attach} = []; ($_->{$key1} => $_) } @$rows;

	my $rows2 = query $query, %kw;

	for my $row2 (@$rows2) {
		my $id = $row2->{$key2} // die "Not $key2 in query!";
		my $row1 = $row1{$id} // die "Not $key1=$id in main rows!";
		push @{$row1->{$attach}}, $row2;
	}

	wantarray? @$rows2: $rows2
}

# Выбрать один колумн
#
#   query_col "SELECT id FROM word WHERE word in (1,2,3)" 	-> 	[1,2,3]
#
sub query_col(@);

lib/Aion/Query.pm  view on Meta::CPAN

	        {title => "Kiss in night", author_id => 1},
	        {title => "Mir",           author_id => 1},
	    ],
	    3 => [
	        {title => "Mips as cpu",   author_id => 3}
	    ],
	};
	
	\%author  # --> $rows

=head2 query_attach ($rows, $attach, $query, %kw)

Includes the result of another query into the result of a query.

C<$attach> contains three keys separated by a colon: the key for the data to be attached, a column from C<$rows> and a column from C<$query>. Rows are merged across columns.

The function returns an array with the result of the query (C<$query>), into which you can attach something else.

	my $authors = query "SELECT id, name FROM author";
	
	my $res = [
	    {name => "Pushkin A.S.", id => 1},
	    {name => "Pushkin A.",   id => 2},
	    {name => "Alice",        id => 3},
	];
	
	$authors # --> $res
	
	my @books = query_attach $authors => "books:id:author_id" => "SELECT author_id, title FROM book ORDER BY title";
	
	my $attaches = [
	    {name => "Pushkin A.S.", id => 1, books => [
	        {title => "Kiss in night", author_id => 1},
	        {title => "Mir",           author_id => 1},
	    ]},
	    {name => "Pushkin A.",   id => 2, books => []},
	    {name => "Alice",        id => 3, books => [
	        {title => "Mips as cpu", author_id => 3},
	    ]},
	];
	
	$authors # --> $attaches
	
	my $books = [
	    {title => "Kiss in night", author_id => 1},
	    {title => "Mips as cpu",   author_id => 3},
	    {title => "Mir",           author_id => 1},
	];
	
	\@books  # --> $books

=head2 query_col ($query, %params)

t/aion/query.t  view on Meta::CPAN

        {title => "Mir",           author_id => 1},
    ],
    3 => [
        {title => "Mips as cpu",   author_id => 3}
    ],
};

::is_deeply scalar do {\%author}, scalar do {$rows}, '\%author  # --> $rows';

# 
# ## query_attach ($rows, $attach, $query, %kw)
# 
# Подсоединяет в результат запроса результат другого запроса.
# 
# `$attach` содержит три ключа через двоеточие: ключ для присоединяемых данных, столбец из `$rows` и столбец из `$query`. По столбцам происходит объеÐ...
# 
# Возвращает функция массив с результатом запроса (`$query`), в который можно приаттачить ещё что-то.
# 
done_testing; }; subtest 'query_attach ($rows, $attach, $query, %kw)' => sub { 
my $authors = query "SELECT id, name FROM author";

my $res = [
    {name => "Pushkin A.S.", id => 1},
    {name => "Pushkin A.",   id => 2},
    {name => "Alice",        id => 3},
];

::is_deeply scalar do {$authors}, scalar do {$res}, '$authors # --> $res';

my @books = query_attach $authors => "books:id:author_id" => "SELECT author_id, title FROM book ORDER BY title";

my $attaches = [
    {name => "Pushkin A.S.", id => 1, books => [
        {title => "Kiss in night", author_id => 1},
        {title => "Mir",           author_id => 1},
    ]},
    {name => "Pushkin A.",   id => 2, books => []},
    {name => "Alice",        id => 3, books => [
        {title => "Mips as cpu", author_id => 3},
    ]},
];

::is_deeply scalar do {$authors}, scalar do {$attaches}, '$authors # --> $attaches';

my $books = [
    {title => "Kiss in night", author_id => 1},
    {title => "Mips as cpu",   author_id => 3},
    {title => "Mir",           author_id => 1},
];

::is_deeply scalar do {\@books}, scalar do {$books}, '\@books  # --> $books';

# 



( run in 2.038 seconds using v1.01-cache-2.11-cpan-e1769b4cff6 )