DNA
 |
- Flat file
- DNA in 60 seconds or less
- A-T G-C "Gattaca"
- Very efficient from a biological perspective
- Not binary
|

CREATE OR REPLACE FUNCTION good_dna(VARCHAR)
RETURNS BOOLEAN AS '
BEGIN
IF length(substring($1 FROM \'[^ATGC]\')) THEN
RAISE EXCEPTION \'DNA must be one of A, T, G, C\';
END IF;
RETURN true;
END;
' LANGUAGE plpgsql;

CREATE DOMAIN dnabasepair VARCHAR CHECK (good_dna(VALUE));

Operators
| |
- Operators <= 60 seconds
- Left and right: + = - ^ & >>
|

CREATE OR REPLACE FUNCTION complement_dna(dnabasepair)
RETURNS dnabasepair AS'
DECLARE
original ALIAS FOR $1;
BEGIN
RETURN TRANSLATE(original, \'ATCG\',\'TAGC\');
END;
' LANGUAGE plpgsql;
oscon=> SELECT complement_dna('ATCG');
complement_dna
----------------
TAGC
oscon=> SELECT complement_dna('ATCGZ');
ERROR: DNA must be one of A, T, G, C

CREATE OPERATOR ~ (
rightarg = dnabasepair,
procedure = complement_dna
);

oscon=> SELECT ~'AAATTT'::dnabasepair;
?column?
----------
TTTAAA
oscon=> SELECT ~ 'AAATTT';
?column?
----------
TTTAAA