/* * Copyright 2013 Robert von Burg <eitch@eitchnet.ch> * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package li.strolch.persistence.postgresql; import java.sql.Date; import java.util.ArrayList; import java.util.List; import li.strolch.utils.StringMatchMode; import li.strolch.utils.collections.DateRange; /** * @author Robert von Burg <eitch@eitchnet.ch> */ public class PostgreSqlHelper { public static void toSql(String indent, StringBuilder sb, List<Object> values, String column, DateRange dateRange) { // TODO handle inclusive/exclusive: between is inclusive if (dateRange.isDate()) { sb.append(indent); sb.append(column); sb.append(" = ?\n"); values.add(new Date(dateRange.getFromDate().getTime())); } else if (dateRange.isBounded()) { sb.append(indent); sb.append(column); sb.append(" between ? and ?\n"); values.add(new Date(dateRange.getFromDate().getTime())); values.add(new Date(dateRange.getToDate().getTime())); } else if (dateRange.isToBounded()) { sb.append(indent); sb.append(column); sb.append(" <= ?\n"); values.add(new Date(dateRange.getToDate().getTime())); } else if (dateRange.isFromBounded()) { sb.append(indent); sb.append(column); sb.append(" >= ?\n"); values.add(new Date(dateRange.getFromDate().getTime())); } } public static String toSql(String column, String indent, StringMatchMode mm, List<Object> values, String... query) { // CS EQ // 1. x x // 2. x o // 3. o x // 4. o o StringBuilder sb = new StringBuilder(); if (mm.isCaseSensitve() && mm.isEquals()) { if (query.length == 1) { sb.append(column + " = ?\n"); values.add(query[0]); } else { sb.append(column + " in ( "); for (int i = 0; i < query.length; i++) { sb.append("?"); values.add(query[i]); if (i < query.length - 1) sb.append(", "); } sb.append(" )\n"); } } else if (!mm.isCaseSensitve() && mm.isEquals()) { if (query.length == 1) { sb.append("lower(" + column + ") = ?\n"); values.add(query[0].toLowerCase()); } else { sb.append("lower(" + column + ") in ( "); for (int i = 0; i < query.length; i++) { sb.append("?"); values.add(query[i].toLowerCase()); if (i < query.length - 1) sb.append(", "); } sb.append(" )\n"); } } else if (!mm.isEquals() && mm.isCaseSensitve()) { if (query.length == 1) { sb.append(column + " like ?\n"); values.add("%" + query[0] + "%"); } else { sb.append("(\n"); for (int i = 0; i < query.length; i++) { sb.append(indent); sb.append(" "); sb.append(column + " like ?"); values.add("%" + query[i] + "%"); if (i < query.length - 1) sb.append(" or"); sb.append("\n"); } sb.append(")\n"); } } else { if (query.length == 1) { sb.append("lower(" + column + ") like ?\n"); values.add("%" + query[0].toLowerCase() + "%"); } else { sb.append("(\n"); for (int i = 0; i < query.length; i++) { sb.append(indent); sb.append(" "); sb.append("lower(" + column + ") like ?"); values.add("%" + query[i].toLowerCase() + "%"); if (i < query.length - 1) sb.append(" or"); sb.append("\n"); } sb.append(")\n"); } } return sb.toString(); } public static void main(String[] args) { ArrayList<Object> values = new ArrayList<>(); String sql = toSql("name", " ", StringMatchMode.CONTAINS_CASE_INSENSITIVE, values, "foo", "bar", "fub"); System.out.println(sql); System.out.println(); sql = toSql("name", " ", StringMatchMode.CONTAINS_CASE_INSENSITIVE, values, "foo"); System.out.println(sql); System.out.println(); sql = toSql("name", " ", StringMatchMode.CONTAINS_CASE_SENSITIVE, values, "foo", "bar", "fub"); System.out.println(sql); System.out.println(); sql = toSql("name", " ", StringMatchMode.CONTAINS_CASE_SENSITIVE, values, "foo"); System.out.println(sql); System.out.println(); sql = toSql("name", " ", StringMatchMode.EQUALS_CASE_INSENSITIVE, values, "foo", "bar", "fub"); System.out.println(sql); System.out.println(); sql = toSql("name", " ", StringMatchMode.EQUALS_CASE_INSENSITIVE, values, "foo"); System.out.println(sql); System.out.println(); sql = toSql("name", " ", StringMatchMode.EQUALS_CASE_SENSITIVE, values, "foo", "bar", "fub"); System.out.println(sql); System.out.println(); sql = toSql("name", " ", StringMatchMode.EQUALS_CASE_SENSITIVE, values, "foo"); System.out.println(sql); System.out.println(); } }