/* * Copyright (c) 2013-2015 Josef Hardi <josef.hardi@gmail.com> * * 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 com.obidea.semantika.queryanswer.paging; import java.util.List; public class DefaultPagingDialect implements IPagingDialect { @Override public String paging(String sql, int limit, int offset, List<String> ascOrder, List<String> descOrder) { StringBuilder pagingQuery = new StringBuilder(); return pagingQuery.append(baseSubQuery(sql)) .append(getOrderBy(ascOrder, descOrder)) .append(getLimit(limit)) .append(getOffset(offset)) .toString(); } protected String baseSubQuery(String sql) { StringBuilder sb = new StringBuilder(); sb.append("SELECT PAGING.* FROM ("); //$NON-NLS-1$ sb.append("\n"); //$NON-NLS-1$ sb.append(" "); //$NON-NLS-1$ sb.append(indent(sql)); sb.append("\n"); //$NON-NLS-1$ sb.append(") AS PAGING"); //$NON-NLS-1$ return sb.toString(); } protected String getLimit(int limit) { String limitStr = ""; //$NON-NLS-1$ if (limit > 0) { limitStr = "\n" + String.format("LIMIT %d", limit); //$NON-NLS-1$ //$NON-NLS-2$ } return limitStr; } protected String getOffset(int offset) { String offsetStr = ""; //$NON-NLS-1$ if (offset > 0) { offsetStr = "\n" + String.format("OFFSET %d", offset); //$NON-NLS-1$ //$NON-NLS-2$ } return offsetStr; } protected String getOrderBy(List<String> ascOrder, List<String> descOrder) { String orderStr = ""; //$NON-NLS-1$ StringBuilder orderBuilder = new StringBuilder(); if (!ascOrder.isEmpty() || !descOrder.isEmpty()) { orderBuilder.append("ORDER BY"); //$NON-NLS-1$ boolean needComma = false; for (String item : ascOrder) { if (needComma) { orderBuilder.append(", "); //$NON-NLS-1$ } orderBuilder.append(item); orderBuilder.append(" ASC"); //$NON-NLS-1$ needComma = true; } for (String item : descOrder) { if (needComma) { orderBuilder.append(", "); //$NON-NLS-1$ } orderBuilder.append(item); orderBuilder.append(" DESC"); //$NON-NLS-1$ needComma = true; } orderStr = "\n" + orderBuilder.toString(); //$NON-NLS-1$ } return orderStr; } protected String indent(String sql) { return sql.replaceAll("\n", "\n "); //$NON-NLS-1$ //$NON-NLS-2$ } }