package gov.nysenate.openleg.dao.law.data;
import gov.nysenate.openleg.dao.base.BasicSqlQuery;
import gov.nysenate.openleg.dao.base.SqlTable;
public enum SqlLawDataQuery implements BasicSqlQuery
{
/** --- Law Documents --- */
SELECT_LAW_DOCUMENT(
"WITH max_date AS (\n" +
" SELECT max(published_date) AS pub_date FROM ${schema}." + SqlTable.LAW_DOCUMENT + "\n" +
" WHERE document_id = :docId AND published_date <= :endPublishedDate" +
")\n" +
"SELECT * FROM max_date, ${schema}." + SqlTable.LAW_DOCUMENT + "\n" +
"WHERE document_id = :docId AND published_date = max_date.pub_date"
),
SELECT_ALL_LAW_DOCUMENTS(
"WITH latest_laws AS (\n" +
" SELECT document_id, max(published_date) AS published_date " +
" FROM ${schema}." + SqlTable.LAW_DOCUMENT + "\n" +
" WHERE law_id = :lawId AND published_date <= :endPublishedDate \n" +
" GROUP BY document_id" +
")\n" +
"SELECT * FROM ${schema}." + SqlTable.LAW_DOCUMENT + "\n" +
"JOIN latest_laws USING (document_id, published_date)"
),
INSERT_LAW_DOCUMENT(
"INSERT INTO ${schema}." + SqlTable.LAW_DOCUMENT +
"(document_id, published_date, document_type, law_id, location_id, document_type_id, title, text, law_file_name)\n" +
"VALUES (:documentId, :publishedDate, :documentType, :lawId, :locationId, :documentTypeId, :title, :text, :lawFileName)"
),
UPDATE_LAW_DOCUMENT(
"UPDATE ${schema}." + SqlTable.LAW_DOCUMENT + "\n" +
"SET document_type = :documentType, law_id = :lawId, location_id = :locationId, document_type_id = :documentTypeId,\n" +
" title = :title, text = :text, law_file_name = :lawFileName\n" +
"WHERE document_id = :documentId AND published_date = :publishedDate"
),
/** --- Law Trees --- */
SELECT_MAX_PUB_DATE(
"SELECT law_id, MAX(published_date) AS max_pub_date\n" +
"FROM ${schema}." + SqlTable.LAW_TREE + "\n" +
"WHERE parent_doc_id IS NULL\n" +
"GROUP by law_id"
),
SELECT_ALL_PUB_DATES(
"SELECT DISTINCT published_date \n" +
"FROM ${schema}." + SqlTable.LAW_TREE + "\n" +
"WHERE law_id = :lawId"
),
SELECT_LAW_TREE(
"WITH max_date AS (\n" +
" SELECT max(published_date) AS pub_date FROM ${schema}." + SqlTable.LAW_TREE + "\n" +
" WHERE law_id = :lawId AND published_date <= :endPublishedDate" +
")\n" +
"SELECT t.law_id, t.published_date AS tree_published_date, t.is_root, t.sequence_no, t.repealed_date, " +
" d1.document_id, d1.published_date, d1.document_type, d1.location_id, d1.title, d1.document_type_id, " +
" t.parent_doc_id\n" +
"FROM max_date, ${schema}." + SqlTable.LAW_TREE + " t\n" +
"LEFT JOIN ${schema}." + SqlTable.LAW_DOCUMENT + " d1 \n" +
" ON t.doc_id = d1.document_id AND t.doc_published_date = d1.published_date\n" +
"WHERE t.law_id = :lawId AND t.published_date = max_date.pub_date"
),
INSERT_LAW_TREE(
"INSERT INTO ${schema}." + SqlTable.LAW_TREE + "\n" +
"(law_id, published_date, doc_id, doc_published_date, parent_doc_id, parent_doc_published_date, is_root, " +
" sequence_no, repealed_date, law_file)\n" +
"VALUES (:lawId, :publishedDate, :docId, :docPublishedDate, :parentDocId, :parentDocPublishedDate, :isRoot, " +
" :sequenceNo, :repealedDate, :lawFileName)"
),
UPDATE_LAW_TREE(
"UPDATE ${schema}." + SqlTable.LAW_TREE + "\n" +
"SET parent_doc_id = :parentDocId, parent_doc_published_date = :parentDocPublishedDate, is_root = :isRoot, " +
" sequence_no = :sequenceNo, repealed_date = :repealedDate, law_file = :lawFileName \n" +
"WHERE law_id = :lawId AND published_date = :publishedDate AND \n" +
" doc_id = :docId AND doc_published_date = :docPublishedDate"
),
DELETE_TREE(
"DELETE FROM ${schema}." + SqlTable.LAW_TREE + "\n" +
"WHERE law_id = :lawId AND published_date = :publishedDate"
),
/** --- Law Chapters --- */
SELECT_LAW_INFO(
"SELECT * FROM ${schema}." + SqlTable.LAW_INFO
),
SELECT_LAW_INFO_BY_ID(
SELECT_LAW_INFO.sql + " WHERE law_id = :lawId"
),
SELECT_LAW_INFO_BY_TYPE(
SELECT_LAW_INFO.sql + " WHERE law_type = :lawType"
),
UPDATE_LAW_INFO(
"UPDATE ${schema}." + SqlTable.LAW_INFO + "\n" +
"SET chapter_id = :chapterId, law_type = :lawType, name = :name\n" +
"WHERE law_id = :lawId"
),
INSERT_LAW_INFO(
"INSERT INTO ${schema}." + SqlTable.LAW_INFO + " (law_id, chapter_id, law_Type, name)\n" +
"VALUES (:lawId, :chapterId, :lawType, :name)\n"
)
;
private String sql;
SqlLawDataQuery(String sql) {
this.sql = sql;
}
@Override
public String getSql() {
return sql;
}
}