4. Everything is an object
my $obj = Thingy.new();
$obj.method();
my @array = <one two three>; # like qw(...)
@array.elems.say; # 3
5. Everything is an object
my $obj = Thingy.new();
$obj.method();
my @array = <one two three>; # like qw(...)
@array.elems.say; # 3
4.say; # 4
“this is a string”.words.perl.say;
# ("this", "is", "a", "string").Seq
6. Several namespace-y collections
● package { … }
● module { … }
● enum <zero one two three>
● class { … }
● subset PositiveInt of Int where * > 0
● role { … }
● grammar { … }
7. Grammars are collections of named
regexes
grammar Answer {
regex TOP { <yes> | <no> | <maybe> }
}
10. Grammars are collections of named
regexes
grammar Answer {
regex TOP { <yes> | <no> | <maybe> }
regex yes { :i 'y' | 'ye' | 'yes' }
regex no { :i 'n' | 'no' }
regex maybe { :i
<{ 'maybe'.comb.produce(&[~]) }>
}
}
11. grammar Answer {
regex TOP { <yes> | <no> | <maybe> }
regex yes { … }
regex no { … }
regex maybe { … }
}
my $response = prompt “What is your answer? “;
my $match = Answer.parse($response);
$match.say;
12. grammar Answer { … }
my $response = prompt “What is your answer? “;
my $match = Answer.parse($response);
$match.say;
if !$match {
say “I didn't understand”;
} elsif $match{'yes'} {
say “I'll proceed...”;
} elsif $match{'no'} {
say “Cancelled”;
} elsif $match{'maybe'} {
say “Come back later”;
}
13. grammar Answer { … }
my $response = prompt “What is your answer? “;
my $match = Answer.parse($response);
$match.say;
if !$match {
say “I didn't understand”;
} elsif $match<yes> {
say “I'll proceed...”;
} elsif $match<no> {
say “Cancelled”;
} elsif $match<maybe> {
say “Come back later”;
}
14. grammar Answer { … }
my $response = prompt “What is your answer? “;
my $match = Answer.parse($response);
$match.say;
given $match {
when $<yes> { say “I'll proceed” };
when $<no> { say “Cancelled” };
when $<maybe> { say “Come back later” };
default { say “I didn't understand” };
}
16. > get-answer
What is your answer? y
「 y 」
yes => 「 y 」
I'll proceed
> get-answer
What is your answer? MaY
「 MaY 」
maybe => 「 MaY 」
Come back when you have decided
17. > get-answer
What is your answer? y
「 y 」
yes => 「 y 」
I'll proceed
> get-answer
What is your answer? MaY
「 MaY 」
maybe => 「 MaY 」
Come back when you have decided
> get-answer
What is your answer? nope
18. > get-answer
What is your answer? y
「 y 」
yes => 「 y 」
I'll proceed
> get-answer
What is your answer? MaY
「 MaY 」
maybe => 「 MaY 」
Come back when you have decided
> get-answer
What is your answer? nope
(Any)
I didn't understand...
28. Translating SQL
● Comments
● Data types
VARCHAR2 vs VARCHAR
NUMBER(2) vs SMALLINT
BLOB vs BYTEA
9999999999999999999999999999
vs 9223372036854775807
29. Translating SQL
● Comments
● Data types
● CREATE $thing options
CREATE TABLE foo ( … ) ORGANIZATION HEAP;
CREATE INDEX bar ON foo ( … ) COMPRESS 1;
CREATE CONSTRAINT … DISABLE;
CREATE SEQUENCE baz NOCYCLE NOCACHE;
vs NO CYCLE;
30. Translating SQL
● Comments
● Data types
● CREATE $thing options
● Functions
decode(x, y, z) vs ( CASE x WHEN y ELSE z END )
systimestamp() vs localtimestamp()
45. SQL expressions
CREATE OR REPLACE VIEW SCHEMA_USER.genotyping_externalinfo
(
project_id
, batch_number
, organism_sample_id
, count_illumina
, seq_id
, date_scheduled
, y_snp_count
, y_snp_total
, gender
, total_snps
, total_calls
, status
, setup_wo_id
)
AS
select distinct
samples.project_id,
samples.batch_number,
samples.organism_sample_id,
count_illumina,
eg.seq_id,
import_pses.date_scheduled,
eg.y_snp_count,
eg.y_snp_total,
samples.gender,
eg.total_snps,
eg.total_calls,
eg.status,
setup_wo_id
from (
select
project_id,
batch_number,
organism_sample_id,
count(illumina_seq_id) as count_illumina,
seq_id,
gender,
setup_wo_id
from (
select distinct
wo.project_id,
batch.batch_number as batch_number,
os.organism_sample_id,
ig.seq_id as illumina_seq_id,
case when eg.seq_id is not null then
eg.seq_id
else
case when eg2.seq_id is not null then
eg2.seq_id
else
eg3.seq_id
end
end as seq_id,
oi.gender as gender,
wo.setup_wo_id as setup_wo_id
46. SQL expressions
CREATE OR REPLACE VIEW SCHEMA_USER.genotyping_externalinfo
(
project_id
, batch_number
, organism_sample_id
, count_illumina
, seq_id
, date_scheduled
, y_snp_count
, y_snp_total
, gender
, total_snps
, total_calls
, status
, setup_wo_id
)
AS
select distinct
samples.project_id,
samples.batch_number,
samples.organism_sample_id,
count_illumina,
eg.seq_id,
import_pses.date_scheduled,
eg.y_snp_count,
eg.y_snp_total,
samples.gender,
eg.total_snps,
eg.total_calls,
eg.status,
setup_wo_id
from (
select
project_id,
batch_number,
organism_sample_id,
count(illumina_seq_id) as count_illumina,
seq_id,
gender,
setup_wo_id
from (
select distinct
wo.project_id,
batch.batch_number as batch_number,
os.organism_sample_id,
ig.seq_id as illumina_seq_id,
case when eg.seq_id is not null then
eg.seq_id
else
case when eg2.seq_id is not null then
eg2.seq_id
else
eg3.seq_id
end
end as seq_id,
oi.gender as gender,
wo.setup_wo_id as setup_wo_id
from setup_work_order wo
join work_order_item woi on wo.setup_wo_id = woi.setup_wo_id
join organism_sample@dw os on woi.dna_id = os.organism_sample_id
join organism_individual@dw oi on os.source_id = oi.organism_id
left outer join (
select
sa.organism_sample_id,
sa.attribute_value as batch_number
from sample_attribute@dw sa
where sa.attribute_label = 'batch_number'
) batch on os.organism_sample_id = batch.organism_sample_id
47. SQL expressions
CREATE OR REPLACE VIEW SCHEMA_USER.genotyping_externalinfo
(
project_id
, batch_number
, organism_sample_id
, count_illumina
, seq_id
, date_scheduled
, y_snp_count
, y_snp_total
, gender
, total_snps
, total_calls
, status
, setup_wo_id
)
AS
select distinct
samples.project_id,
samples.batch_number,
samples.organism_sample_id,
count_illumina,
eg.seq_id,
import_pses.date_scheduled,
eg.y_snp_count,
eg.y_snp_total,
samples.gender,
eg.total_snps,
eg.total_calls,
eg.status,
setup_wo_id
from (
select
project_id,
batch_number,
organism_sample_id,
count(illumina_seq_id) as count_illumina,
seq_id,
gender,
setup_wo_id
from (
select distinct
wo.project_id,
batch.batch_number as batch_number,
os.organism_sample_id,
ig.seq_id as illumina_seq_id,
case when eg.seq_id is not null then
eg.seq_id
else
case when eg2.seq_id is not null then
eg2.seq_id
else
eg3.seq_id
end
end as seq_id,
oi.gender as gender,
wo.setup_wo_id as setup_wo_id
from setup_work_order wo
join work_order_item woi on wo.setup_wo_id = woi.setup_wo_id
join organism_sample@dw os on woi.dna_id = os.organism_sample_id
join organism_individual@dw oi on os.source_id = oi.organism_id
left outer join (
select
sa.organism_sample_id,
sa.attribute_value as batch_number
from sample_attribute@dw sa
where sa.attribute_label = 'batch_number'
) batch on os.organism_sample_id = batch.organism_sample_id
left outer join external_genotyping@dw eg on os.organism_sample_id = eg.organism_sample_id
left outer join external_genotyping@dw eg2 on os.default_genotype_seq_id = eg2.seq_id
left outer join organism_sample@dw os2 on os2.source_id = os.source_id
and os2.common_name = os.common_name
and os2.sample_type = os.sample_type
48. SQL expressions
CREATE OR REPLACE VIEW SCHEMA_USER.genotyping_externalinfo
(
project_id
, batch_number
, organism_sample_id
, count_illumina
, seq_id
, date_scheduled
, y_snp_count
, y_snp_total
, gender
, total_snps
, total_calls
, status
, setup_wo_id
)
AS
select distinct
samples.project_id,
samples.batch_number,
samples.organism_sample_id,
count_illumina,
eg.seq_id,
import_pses.date_scheduled,
eg.y_snp_count,
eg.y_snp_total,
samples.gender,
eg.total_snps,
eg.total_calls,
eg.status,
setup_wo_id
from (
select
project_id,
batch_number,
organism_sample_id,
count(illumina_seq_id) as count_illumina,
seq_id,
gender,
setup_wo_id
from (
select distinct
wo.project_id,
batch.batch_number as batch_number,
os.organism_sample_id,
ig.seq_id as illumina_seq_id,
case when eg.seq_id is not null then
eg.seq_id
else
case when eg2.seq_id is not null then
eg2.seq_id
else
eg3.seq_id
end
end as seq_id,
oi.gender as gender,
wo.setup_wo_id as setup_wo_id
from setup_work_order wo
join work_order_item woi on wo.setup_wo_id = woi.setup_wo_id
join organism_sample@dw os on woi.dna_id = os.organism_sample_id
join organism_individual@dw oi on os.source_id = oi.organism_id
left outer join (
select
sa.organism_sample_id,
sa.attribute_value as batch_number
from sample_attribute@dw sa
where sa.attribute_label = 'batch_number'
) batch on os.organism_sample_id = batch.organism_sample_id
left outer join external_genotyping@dw eg on os.organism_sample_id = eg.organism_sample_id
left outer join external_genotyping@dw eg2 on os.default_genotype_seq_id = eg2.seq_id
left outer join organism_sample@dw os2 on os2.source_id = os.source_id
and os2.common_name = os.common_name
and os2.sample_type = os.sample_type
left outer join
external_genotyping@dw eg3 on
eg3.organism_sample_id =
os2.organism_sample_id
left outer join
illumina_genotyping@dw ig on
os.organism_sample_id =
ig.organism_sample_id
where wo.pipeline in (
'Genotyping',
'Genotyping and Agilent
Exome Sequencing',
'Genotyping and Illumina
Whole Genome Sequencing',
'Genotyping and Nimblegen Exome
Sequencing',
'Genotyping and Nimblegen
Custom Capture Illumina',
'Genotyping and Nimblegen Liquid
Phase Targeted Sequencing',
'Genotyping and Nimblegen Solid
Phase Targeted Sequencing',
49. SQL expressions
CREATE OR REPLACE VIEW SCHEMA_USER.genotyping_externalinfo
(
project_id
, batch_number
, organism_sample_id
, count_illumina
, seq_id
, date_scheduled
, y_snp_count
, y_snp_total
, gender
, total_snps
, total_calls
, status
, setup_wo_id
)
AS
select distinct
samples.project_id,
samples.batch_number,
samples.organism_sample_id,
count_illumina,
eg.seq_id,
import_pses.date_scheduled,
eg.y_snp_count,
eg.y_snp_total,
samples.gender,
eg.total_snps,
eg.total_calls,
eg.status,
setup_wo_id
from (
select
project_id,
batch_number,
organism_sample_id,
count(illumina_seq_id) as count_illumina,
seq_id,
gender,
setup_wo_id
from (
select distinct
wo.project_id,
batch.batch_number as batch_number,
os.organism_sample_id,
ig.seq_id as illumina_seq_id,
case when eg.seq_id is not null then
eg.seq_id
else
case when eg2.seq_id is not null then
eg2.seq_id
else
eg3.seq_id
end
end as seq_id,
oi.gender as gender,
wo.setup_wo_id as setup_wo_id
from setup_work_order wo
join work_order_item woi on wo.setup_wo_id = woi.setup_wo_id
join organism_sample@dw os on woi.dna_id = os.organism_sample_id
join organism_individual@dw oi on os.source_id = oi.organism_id
left outer join (
select
sa.organism_sample_id,
sa.attribute_value as batch_number
from sample_attribute@dw sa
where sa.attribute_label = 'batch_number'
) batch on os.organism_sample_id = batch.organism_sample_id
left outer join external_genotyping@dw eg on os.organism_sample_id = eg.organism_sample_id
left outer join external_genotyping@dw eg2 on os.default_genotype_seq_id = eg2.seq_id
left outer join organism_sample@dw os2 on os2.source_id = os.source_id
and os2.common_name = os.common_name
and os2.sample_type = os.sample_type
left outer join external_genotyping@dw eg3 on
eg3.organism_sample_id =
os2.organism_sample_id
left outer join illumina_genotyping@dw ig on
os.organism_sample_id =
ig.organism_sample_id
where wo.pipeline in (
'Genotyping',
'Genotyping and Agilent Exome
Sequencing',
'Genotyping and Illumina Whole Genome
Sequencing',
'Genotyping and Nimblegen Exome Sequencing',
'Genotyping and Nimblegen Custom Capture
Illumina',
'Genotyping and Nimblegen Liquid Phase
Targeted Sequencing',
'Genotyping and Nimblegen Solid Phase
Targeted Sequencing',
'Resource Storage'
)
)
group by
project_id,
batch_number,
organism_sample_id,
seq_id,
gender,
setup_wo_id
) samples
left outer join external_genotyping@dw eg on
50. SQL expressions
CREATE OR REPLACE VIEW SCHEMA_USER.genotyping_externalinfo
(
project_id
, batch_number
, organism_sample_id
, count_illumina
, seq_id
, date_scheduled
, y_snp_count
, y_snp_total
, gender
, total_snps
, total_calls
, status
, setup_wo_id
)
AS
select distinct
samples.project_id,
samples.batch_number,
samples.organism_sample_id,
count_illumina,
eg.seq_id,
import_pses.date_scheduled,
eg.y_snp_count,
eg.y_snp_total,
samples.gender,
eg.total_snps,
eg.total_calls,
eg.status,
setup_wo_id
from (
select
project_id,
batch_number,
organism_sample_id,
count(illumina_seq_id) as count_illumina,
seq_id,
gender,
setup_wo_id
from (
select distinct
wo.project_id,
batch.batch_number as batch_number,
os.organism_sample_id,
ig.seq_id as illumina_seq_id,
case when eg.seq_id is not null then
eg.seq_id
else
case when eg2.seq_id is not null then
eg2.seq_id
else
eg3.seq_id
end
end as seq_id,
oi.gender as gender,
wo.setup_wo_id as setup_wo_id
from setup_work_order wo
join work_order_item woi on wo.setup_wo_id = woi.setup_wo_id
join organism_sample@dw os on woi.dna_id = os.organism_sample_id
join organism_individual@dw oi on os.source_id = oi.organism_id
left outer join (
select
sa.organism_sample_id,
sa.attribute_value as batch_number
from sample_attribute@dw sa
where sa.attribute_label = 'batch_number'
) batch on os.organism_sample_id = batch.organism_sample_id
left outer join external_genotyping@dw eg on os.organism_sample_id = eg.organism_sample_id
left outer join external_genotyping@dw eg2 on os.default_genotype_seq_id = eg2.seq_id
left outer join organism_sample@dw os2 on os2.source_id = os.source_id
and os2.common_name = os.common_name
and os2.sample_type = os.sample_type
left outer join external_genotyping@dw eg3 on
eg3.organism_sample_id = os2.organism_sample_id
left outer join illumina_genotyping@dw ig on
os.organism_sample_id = ig.organism_sample_id
where wo.pipeline in (
'Genotyping',
'Genotyping and Agilent Exome Sequencing',
'Genotyping and Illumina Whole Genome Sequencing',
'Genotyping and Nimblegen Exome Sequencing',
'Genotyping and Nimblegen Custom Capture Illumina',
'Genotyping and Nimblegen Liquid Phase Targeted
Sequencing',
'Genotyping and Nimblegen Solid Phase Targeted Sequencing',
'Resource Storage'
)
)
group by
project_id,
batch_number,
organism_sample_id,
seq_id,
gender,
setup_wo_id
) samples
left outer join external_genotyping@dw eg on samples.seq_id =
eg.seq_id
left outer join (
select
param.param_value,
param.pse_id,
to_char(pse.date_scheduled, 'MM/DD/YYYY') as
date_scheduled
from process_step_executions pse
join pse_param param on pse.pse_id = param.pse_id
where
pse.ps_ps_id = 7375
and param.param_name = 'organism_sample_id'
) import_pses on import_pses.param_value =
eg.organism_sample_id
left outer join tpp_pse on tpp_pse.pse_id = import_pses.pse_id;
51. SQL expressions
CREATE OR REPLACE VIEW SCHEMA_USER.genotyping_externalinfo
(
project_id
, batch_number
, organism_sample_id
, count_illumina
, seq_id
, date_scheduled
, y_snp_count
, y_snp_total
, gender
, total_snps
, total_calls
, status
, setup_wo_id
)
AS
select distinct
samples.project_id,
samples.batch_number,
samples.organism_sample_id,
count_illumina,
eg.seq_id,
import_pses.date_scheduled,
eg.y_snp_count,
eg.y_snp_total,
samples.gender,
eg.total_snps,
eg.total_calls,
eg.status,
setup_wo_id
from (
select
project_id,
batch_number,
organism_sample_id,
count(illumina_seq_id) as count_illumina,
seq_id,
gender,
setup_wo_id
from (
select distinct
wo.project_id,
batch.batch_number as batch_number,
os.organism_sample_id,
ig.seq_id as illumina_seq_id,
case when eg.seq_id is not null then
eg.seq_id
else
case when eg2.seq_id is not null then
eg2.seq_id
else
eg3.seq_id
end
end as seq_id,
oi.gender as gender,
wo.setup_wo_id as setup_wo_id
from setup_work_order wo
join work_order_item woi on wo.setup_wo_id = woi.setup_wo_id
join organism_sample@dw os on woi.dna_id = os.organism_sample_id
join organism_individual@dw oi on os.source_id = oi.organism_id
left outer join (
select
sa.organism_sample_id,
sa.attribute_value as batch_number
from sample_attribute@dw sa
where sa.attribute_label = 'batch_number'
) batch on os.organism_sample_id = batch.organism_sample_id
left outer join external_genotyping@dw eg on os.organism_sample_id = eg.organism_sample_id
left outer join external_genotyping@dw eg2 on os.default_genotype_seq_id = eg2.seq_id
left outer join organism_sample@dw os2 on os2.source_id = os.source_id
and os2.common_name = os.common_name
and os2.sample_type = os.sample_type
left outer join external_genotyping@dw eg3 on
eg3.organism_sample_id = os2.organism_sample_id
left outer join illumina_genotyping@dw ig on
os.organism_sample_id = ig.organism_sample_id
where wo.pipeline in (
'Genotyping',
'Genotyping and Agilent Exome Sequencing',
'Genotyping and Illumina Whole Genome Sequencing',
'Genotyping and Nimblegen Exome Sequencing',
'Genotyping and Nimblegen Custom Capture Illumina',
'Genotyping and Nimblegen Liquid Phase Targeted
Sequencing',
'Genotyping and Nimblegen Solid Phase Targeted Sequencing',
'Resource Storage'
)
)
group by
project_id,
batch_number,
organism_sample_id,
seq_id,
gender,
setup_wo_id
) samples
left outer join external_genotyping@dw eg on samples.seq_id =
eg.seq_id
left outer join (
select
param.param_value,
param.pse_id,
to_char(pse.date_scheduled, 'MM/DD/YYYY') as
date_scheduled
from process_step_executions pse
join pse_param param on pse.pse_id = param.pse_id
where
pse.ps_ps_id = 7375
and param.param_name = 'organism_sample_id'
) import_pses on import_pses.param_value =
eg.organism_sample_id
left outer join tpp_pse on tpp_pse.pse_id = import_pses.pse_id;
59. Hard to parse SQL
CREATE OR REPLACE VIEW SCHEMA_USER.plate_locations
( sec_sec_id, well_name, pt_pt_id, pl_id )
AS SELECT
SCHEMA_USER.sectors.SEC_ID AS "SEC_SEC_ID",
SCHEMA_USER.dna_location.LOCATION_NAME AS "WELL_NAME",
SCHEMA_USER.plate_types.PT_ID AS "PT_PT_ID",
SCHEMA_USER.dna_location.dl_id AS "PL_ID"
FROM
SCHEMA_USER.sectors, SCHEMA_USER.dna_location,
SCHEMA_USER.plate_types
WHERE
SCHEMA_USER.sectors.SEC_ID
= SCHEMA_USER.dna_location.sec_id
and
SCHEMA_USER.dna_location.LOCATION_TYPE
= to_char(SCHEMA_USER.plate_types.WELL_COUNT)||' well plate'
60. Hard to parse SQL
CREATE OR REPLACE VIEW SCHEMA_USER.plate_locations
( sec_sec_id, well_name, pt_pt_id, pl_id )
AS SELECT
SCHEMA_USER.sectors.SEC_ID AS "SEC_SEC_ID",
SCHEMA_USER.dna_location.LOCATION_NAME AS "WELL_NAME",
SCHEMA_USER.plate_types.PT_ID AS "PT_PT_ID",
SCHEMA_USER.dna_location.dl_id AS "PL_ID"
FROM
SCHEMA_USER.sectors, SCHEMA_USER.dna_location,
SCHEMA_USER.plate_types
WHERE
SCHEMA_USER.sectors.SEC_ID
= SCHEMA_USER.dna_location.sec_id
and
SCHEMA_USER.dna_location.LOCATION_TYPE
= to_char(SCHEMA_USER.plate_types.WELL_COUNT)||' well plate'
61. Hard to parse SQL
rule sql-statement:sym<special-CREATE-VIEW> {
'CREATE' 'OR' 'REPLACE' 'VIEW'
'SCHEMA_USER.plate_locations'
'(' <-[;]>+
}
method sql-statement:sym<special-CREATE-VIEW>($/) {
Make ~$/;
}