-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathaqtdexpr
39 lines (29 loc) · 1.02 KB
/
aqtdexpr
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
use strict;
use warnings;
use Path::Tiny;
use Data::Dumper::Compact;
use List::UtilsBy qw(nsort_by);
my $data = eval '+'.($ARGV[0] =~ /^[\{\[]/ ? $ARGV[0] : path($ARGV[0])->slurp);
die "Invalid data: $@" unless $data;
my $args = ($ARGV[1] ? eval '+'.$ARGV[1] : {});
die "Invalid args: $@" unless $args;
my $ddc = Data::Dumper::Compact->new($args);
my @select_clauses = qw(with with_recursive _ select from where order_by group_by having);
my %select_clauses; @select_clauses{@select_clauses} = -@select_clauses..-1;
sub key_sorter (&) {
my ($sorter) = @_;
+{ hash => sub {
my ($keys, $map) = @{$_[2]};
return [ hash => [ [ $sorter->(@$keys) ], $map ] ];
} }
}
$ddc->add_transform(
[ -select => key_sorter { nsort_by { $select_clauses{$_}||0 } @_ } ],
)->add_transform(
[ qr/^with/, sub { ($_ % 2) == 0 }, { array => sub {
#my ($self, $type, $payload, $path) = @_;
my ($first, @rest) = @{$_[2]};
return [ array => [ [ key => $first->[1] ], [ list => \@rest ] ] ];
} } ],
);
print $ddc->dump($data);