/* * Aipo is a groupware program developed by TOWN, Inc. * Copyright (C) 2004-2015 TOWN, Inc. * http://www.aipo.com * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.aimluck.eip.orm.access.trans; import java.util.ArrayList; import java.util.List; import org.apache.cayenne.access.jdbc.ColumnDescriptor; import org.apache.cayenne.access.trans.SelectTranslator; /** * */ public class CustomSelectTranslator extends SelectTranslator { private String customScript; private ColumnDescriptor[] columns; private String[] columnNames; private int offset; private int limit; private boolean isDistinct; @Override public String createSqlString() throws Exception { String ret = null; ret = super.createSqlString(); String postStr = ""; if (limit > 0) { postStr += " LIMIT " + limit; } if (offset > 0) { postStr += " OFFSET " + offset; } if (customScript == null) { if (isDistinct) { if (!ret.startsWith("SELECT DISTINCT ")) { ret = ret.replaceFirst("SELECT ", "SELECT DISTINCT "); } } return ret + postStr; } int fromIndex = ret.indexOf(" FROM "); ret = String.format("SELECT %s %s", customScript, ret.substring(fromIndex)); return ret + postStr; } @Override public ColumnDescriptor[] getResultColumns() { if (columnNames == null || columnNames.length == 0) { if (columns == null || columns.length == 0) { return super.getResultColumns(); } else { return columns; } } else { ColumnDescriptor[] resultColumns = super.getResultColumns(); List<ColumnDescriptor> list = new ArrayList<ColumnDescriptor>(); for (String columnName : columnNames) { for (ColumnDescriptor resultColumn : resultColumns) { if (resultColumn.getName().equalsIgnoreCase(columnName)) { list.add(resultColumn); break; } } } return list.toArray(new ColumnDescriptor[list.size()]); } } public void setCustomScript(String customScript) { this.customScript = customScript; } public void setCustomColumns(ColumnDescriptor[] columns) { this.columns = columns; } public void setCustomColumnNames(String[] columnNames) { this.columnNames = columnNames; } public void setFetchOffset(int offset) { this.offset = offset; } public void setFetchLimit(int limit) { this.limit = limit; } public void setIsDistinct(boolean isDistinct) { this.isDistinct = isDistinct; } }