------------------------------------------------------------------------------;
----
---- queries.sql: manually maintained queries.
----
---- 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 2
---- of the License, or (at your option) any later version.
----
---- This program is distributed in the hope that it will be useful,
---- but WITHOUT ANY WARRANTY; without even the implied warranty of
---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
---- GNU General Public License for more details.
----
---- You should have received a copy of the GNU General Public License
---- along with this program; if not, write to the Free Software
---- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
---- USA.
----
---- Copyright (C) 2016 Simon Brooke for Radical Independence Campaign
----
------------------------------------------------------------------------------;

-- This file gets slurped in and converted into simple functions by the line
-- in youyesyet.db.core.clj:
--     (conman/bind-connection *db* "sql/queries-auto.sql" "sql/queries.sql")
-- the functions then appeare in the youyesyet.db.core namespace.
-- Note that queries generated by ADL are in the file
-- resources/sql/queries-auto.sql; they do not have to be (and should not be)
-- redefined here.

-- :name list-addresses-by-locality :? :*
-- :doc lists all existing address records in a given locality
SELECT *
FROM addresses
WHERE locality = :locality


-- :name list-open-requests :? :*
-- :doc lists all existing followuprequest records which have not been closed and which the :expert has expertise to answer.
SELECT DISTINCT request.*,
  electors.name ||', '|| electors.gender AS elector_id_expanded,
	addresses.address ||', '|| addresses.postcode ||', '|| visits.date AS visit_id_expanded,
  request.issue_id as issue_id_expanded,
	request.method_id AS method_id_expanded,
  visits.date AS raised
FROM followuprequests as request,
  ln_experts_issues_canvassers as expertise,
  canvassers as experts,
  electors,
  addresses,
  visits
where not exists (select * from followupactions as action
                  where action.request_id = request.id
                  and action.closed = true)
and request.locked_by is null
and request.elector_id = electors.id
and request.visit_id = visits.id
and visits.address_id = addresses.id
and request.issue_id = expertise.issue_id
and expertise.canvasser_id = :expert
ORDER BY raised

--:name get-last-visit-by-canvasser :? :1
--:doc returns the most recent visit record of the canvasser with the specified `:id`
SELECT * FROM visits
WHERE canvasser_id = :id
ORDER BY date desc
LIMIT 1

--:name get-locality-for-visit :? :1
--:doc returns the locality of the address of this visit
SELECT addresses.locality
FROM addresses, visits
WHERE visits.address_id = addresses.id
AND visits.id = :id

-- I don't know why this next one isn't autogenerating, but it isn't and it's critical.

-- :name list-roles-by-canvasser :? :*
-- :doc links all existing canvasser records related to a given role
SELECT DISTINCT roles.*
FROM roles, ln_canvassers_roles
WHERE roles.id = ln_canvassers_roles.role_id
	AND ln_canvassers_roles.canvasser_id = :id
ORDER BY roles.name,
	roles.id

-- :name list-elector-intentions :? :*
-- :doc short form of `list-intentions-by-elector`, returning far less data, for use in `youyesyet.routes.rest/get-local-data`, q.v.
-- TODO: should be limited to visits in the past 24 hours, to prevent the app being
-- used to harrass NO voters. See https://github.com/simon-brooke/youyesyet/issues/58
SELECT intentions.id, intentions.option_id, visits.date
FROM intentions, visits
WHERE intentions.visit_id = visits.id
AND intentions.elector_id = :id
ORDER BY visits.date DESC
