/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package nl.itopia.corendon.model; import java.sql.ResultSet; import java.sql.SQLException; import java.time.LocalDate; import java.util.ArrayList; import java.util.List; import nl.itopia.corendon.data.Luggage; import nl.itopia.corendon.utils.Log; /** * * @author Jeroentje */ public class SearchModel { private static final SearchModel _default = new SearchModel(); private final DatabaseManager dbmanager = DatabaseManager.getDefault(); private static final int WHERE_DEFAULT_LENGTH = 6; private SearchModel() {} public static SearchModel getDefault() { return _default; } public List<Luggage> initSearch(Luggage luggage, LocalDate beginDate, LocalDate endDate) { String searchQuery = "SELECT luggage.id FROM luggage {JOIN} {WHERE}"; String whereQuery = "WHERE "; String innerjoinQuery = ""; if (null != luggage.airport) { // The none value has an ID 0 if (luggage.airport.getID() != 0) { /* innerjoin airport for searching */ innerjoinQuery += "INNER JOIN airport ON luggage.airport_id = airport.id "; whereQuery += " airport.name = '" + luggage.airport.getName() + "'"; } } if (null != luggage.color) { // The none value has an ID 0 if (luggage.color.getID() != 0) { /* innerjoin for color */ Log.display(luggage.color.getID()); innerjoinQuery += "INNER JOIN color ON luggage.color_id = color.id "; // Only add 'AND' when it's not our first statement if (whereQuery.length() > WHERE_DEFAULT_LENGTH) { whereQuery += " AND"; } whereQuery += " color.name = '" + luggage.color.getHex() + "' "; } } if (null != luggage.brand) { // The none value has an ID 0 if(luggage.brand.getID() != 0) { /* innerjoin for brand */ innerjoinQuery += "INNER JOIN brand ON luggage.brand_id=brand.id"; // Only add 'AND' when it's not our first statement if (whereQuery.length() > WHERE_DEFAULT_LENGTH) { whereQuery += " AND"; } whereQuery += " brand.name = '" + luggage.brand.getName() + "' "; } } if (!luggage.label.isEmpty()) { /* searching records containing the searchpart for labels */ // Only add 'AND' when it's not our first statement if (whereQuery.length() > 0) { whereQuery += " AND"; } whereQuery += " luggage.label LIKE '%" + luggage.label + "%'"; } if (!luggage.notes.isEmpty()) { /* searching records containing the searchpart for notes */ // Only add 'AND' when it's not our first statement if (whereQuery.length() > WHERE_DEFAULT_LENGTH) { whereQuery += " AND"; } whereQuery += " luggage.notes LIKE '%" + luggage.notes + "%'"; } if (!luggage.weight.isEmpty()) { /* searching records containing the searchpart for weigth */ // Only add 'AND' when it's not our first statement if (whereQuery.length() > WHERE_DEFAULT_LENGTH) { whereQuery += " AND"; } whereQuery += " luggage.weight LIKE '%" + luggage.weight + "%'"; } if (!"xx cm".equals(luggage.dimensions)) { /* @TODO make this working, it's now a quick and dirty fix */ /* searching recorde containing the searchparts for dimensions */ // Only add 'AND' when it's not our first statement if (whereQuery.length() > WHERE_DEFAULT_LENGTH) { whereQuery += " AND"; } whereQuery += " luggage.dimensions LIKE '%" + luggage.dimensions + "%'"; } if (null != beginDate && null != endDate) { /* check on create date */ // Only add 'AND' when it's not our first statement if (whereQuery.length() > WHERE_DEFAULT_LENGTH) { whereQuery += " AND"; } whereQuery += " (DATE_FORMAT(FROM_UNIXTIME(create_date), '%Y-%m-%d') BETWEEN '" + beginDate + "' AND '" + endDate + "')"; } if (null != luggage.status) { /* filter on status */ // Only add 'AND' when it's not our first statement if (whereQuery.length() > WHERE_DEFAULT_LENGTH) { whereQuery += " AND"; } whereQuery += " luggage.status_id = " + luggage.status.getID(); } /* replace the wildcards for the real join and where statements */ searchQuery = searchQuery.replace("{JOIN}", innerjoinQuery); // If no values are given in the WHERE statement, replace it with an empty character // The whereQuery string has a length of 6 by default String replaceValue = (whereQuery.length() > WHERE_DEFAULT_LENGTH) ? whereQuery : ""; searchQuery = searchQuery.replace("{WHERE}", replaceValue); Log.display(whereQuery.length(), whereQuery, searchQuery); List<Luggage> luggages = executeQuery(searchQuery); return luggages; } private List<Luggage> executeQuery(String query) { List<Luggage> luggageList = new ArrayList<Luggage>(); LuggageModel luggagemodel = LuggageModel.getDefault(); try { ResultSet result = dbmanager.doQuery(query); while (result.next()) { int id = result.getInt("id"); Luggage luggage = luggagemodel.getLuggage(id); luggageList.add(luggage); } } catch (SQLException e) { Log.display("SQLEXCEPTION", e.getErrorCode(), e.getSQLState(), e.getMessage()); } return luggageList; } }