You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@metamodel.apache.org by ka...@apache.org on 2013/07/19 11:32:48 UTC
[05/61] [partial] Hard rename of all 'org/eobjects' folders to
'org/apache'.
http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/e2e2b37a/jdbc/src/main/java/org/eobjects/metamodel/jdbc/JdbcSimpleUpdateCallback.java
----------------------------------------------------------------------
diff --git a/jdbc/src/main/java/org/eobjects/metamodel/jdbc/JdbcSimpleUpdateCallback.java b/jdbc/src/main/java/org/eobjects/metamodel/jdbc/JdbcSimpleUpdateCallback.java
deleted file mode 100644
index 0bb7cf7..0000000
--- a/jdbc/src/main/java/org/eobjects/metamodel/jdbc/JdbcSimpleUpdateCallback.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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 org.eobjects.metamodel.jdbc;
-
-import java.sql.PreparedStatement;
-import java.sql.SQLException;
-
-import org.eobjects.metamodel.UpdateCallback;
-import org.eobjects.metamodel.UpdateScript;
-import org.eobjects.metamodel.util.FileHelper;
-
-/**
- * Jdbc {@link UpdateCallback} for databases that do not support batch features.
- * Instead we will use a single transaction for the {@link UpdateScript}.
- *
- * @author Kasper Sørensen
- */
-final class JdbcSimpleUpdateCallback extends JdbcUpdateCallback {
-
- public JdbcSimpleUpdateCallback(JdbcDataContext dataContext) {
- super(dataContext);
- }
-
- @Override
- protected void closePreparedStatement(PreparedStatement preparedStatement) {
- FileHelper.safeClose(preparedStatement);
- }
-
- @Override
- protected void executePreparedStatement(PreparedStatement st) throws SQLException {
- st.executeUpdate();
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/e2e2b37a/jdbc/src/main/java/org/eobjects/metamodel/jdbc/JdbcTable.java
----------------------------------------------------------------------
diff --git a/jdbc/src/main/java/org/eobjects/metamodel/jdbc/JdbcTable.java b/jdbc/src/main/java/org/eobjects/metamodel/jdbc/JdbcTable.java
deleted file mode 100644
index 4ab1419..0000000
--- a/jdbc/src/main/java/org/eobjects/metamodel/jdbc/JdbcTable.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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 org.eobjects.metamodel.jdbc;
-
-import java.io.ObjectStreamException;
-import java.util.List;
-
-import org.eobjects.metamodel.schema.Column;
-import org.eobjects.metamodel.schema.MutableTable;
-import org.eobjects.metamodel.schema.Relationship;
-import org.eobjects.metamodel.schema.Schema;
-import org.eobjects.metamodel.schema.TableType;
-
-/**
- * Table implementation that is based on JDBC metadata.
- *
- * @author Kasper Sørensen
- */
-final class JdbcTable extends MutableTable {
-
- private static final long serialVersionUID = 5952310469458880330L;
-
- private final transient MetadataLoader _metadataLoader;
-
- public JdbcTable(String name, TableType type, JdbcSchema schema, MetadataLoader metadataLoader) {
- super(name, type, schema);
- _metadataLoader = metadataLoader;
- }
-
- @Override
- protected List<Column> getColumnsInternal() {
- if (_metadataLoader != null) {
- _metadataLoader.loadColumns(this);
- }
- return super.getColumnsInternal();
- }
-
- @Override
- protected List<Relationship> getRelationshipsInternal() {
- Schema schema = getSchema();
- if (schema instanceof JdbcSchema) {
- ((JdbcSchema) schema).loadRelations();
- }
- return super.getRelationshipsInternal();
- }
-
- protected void loadIndexes() {
- if (_metadataLoader != null) {
- _metadataLoader.loadIndexes(this);
- }
- }
-
- /**
- * Called by the Java Serialization API to serialize the object.
- */
- private Object writeReplace() throws ObjectStreamException {
- getColumns();
- loadIndexes();
- loadPrimaryKeys();
- return this;
- }
-
- public void loadPrimaryKeys() {
- if (_metadataLoader != null) {
- _metadataLoader.loadPrimaryKeys(this);
- }
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/e2e2b37a/jdbc/src/main/java/org/eobjects/metamodel/jdbc/JdbcUpdateBuilder.java
----------------------------------------------------------------------
diff --git a/jdbc/src/main/java/org/eobjects/metamodel/jdbc/JdbcUpdateBuilder.java b/jdbc/src/main/java/org/eobjects/metamodel/jdbc/JdbcUpdateBuilder.java
deleted file mode 100644
index 622a5ae..0000000
--- a/jdbc/src/main/java/org/eobjects/metamodel/jdbc/JdbcUpdateBuilder.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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 org.eobjects.metamodel.jdbc;
-
-import java.sql.PreparedStatement;
-import java.sql.SQLException;
-import java.util.List;
-
-import org.eobjects.metamodel.MetaModelException;
-import org.eobjects.metamodel.jdbc.dialects.IQueryRewriter;
-import org.eobjects.metamodel.query.FilterItem;
-import org.eobjects.metamodel.query.FromItem;
-import org.eobjects.metamodel.schema.Column;
-import org.eobjects.metamodel.schema.Table;
-import org.eobjects.metamodel.update.AbstractRowUpdationBuilder;
-import org.eobjects.metamodel.update.RowUpdationBuilder;
-import org.eobjects.metamodel.util.FileHelper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * {@link RowUpdationBuilder} that issues an SQL UPDATE statement
- *
- * @author Kasper Sørensen
- */
-final class JdbcUpdateBuilder extends AbstractRowUpdationBuilder {
-
- private static final Logger logger = LoggerFactory.getLogger(JdbcUpdateBuilder.class);
-
- private final boolean _inlineValues;
- private final JdbcUpdateCallback _updateCallback;
- private final IQueryRewriter _queryRewriter;
-
- public JdbcUpdateBuilder(JdbcUpdateCallback updateCallback, Table table, IQueryRewriter queryRewriter) {
- this(updateCallback, table, queryRewriter, false);
- }
-
- public JdbcUpdateBuilder(JdbcUpdateCallback updateCallback, Table table, IQueryRewriter queryRewriter,
- boolean inlineValues) {
- super(table);
- _updateCallback = updateCallback;
- _queryRewriter = queryRewriter;
- _inlineValues = inlineValues;
- }
-
- @Override
- public void execute() throws MetaModelException {
- String sql = createSqlStatement();
- logger.debug("Update statement created: {}", sql);
- final boolean reuseStatement = !_inlineValues;
- final PreparedStatement st = _updateCallback.getPreparedStatement(sql, reuseStatement);
- try {
- if (reuseStatement) {
- Column[] columns = getColumns();
- Object[] values = getValues();
- boolean[] explicitNulls = getExplicitNulls();
- int valueCounter = 1;
- for (int i = 0; i < columns.length; i++) {
- boolean explicitNull = explicitNulls[i];
- if (values[i] != null || explicitNull) {
- JdbcUtils.setStatementValue(st, valueCounter, columns[i], values[i]);
-
- valueCounter++;
- }
- }
-
- List<FilterItem> whereItems = getWhereItems();
- for (FilterItem whereItem : whereItems) {
- if (JdbcUtils.isPreparedParameterCandidate(whereItem)) {
- final Object operand = whereItem.getOperand();
- final Column column = whereItem.getSelectItem().getColumn();
-
- JdbcUtils.setStatementValue(st, valueCounter, column, operand);
-
- valueCounter++;
- }
- }
- }
- _updateCallback.executePreparedStatement(st, reuseStatement);
- } catch (SQLException e) {
- throw JdbcUtils.wrapException(e, "execute update statement: " + sql);
- } finally {
- if (_inlineValues) {
- FileHelper.safeClose(st);
- }
- }
- }
-
- protected String createSqlStatement() {
- return createSqlStatement(_inlineValues);
- }
-
- private String createSqlStatement(boolean inlineValues) {
- final Object[] values = getValues();
- final Table table = getTable();
- final StringBuilder sb = new StringBuilder();
-
- final String tableLabel = _queryRewriter.rewriteFromItem(new FromItem(table));
-
- sb.append("UPDATE ");
- sb.append(tableLabel);
- sb.append(" SET ");
-
- Column[] columns = getColumns();
- boolean[] explicitNulls = getExplicitNulls();
- boolean firstValue = true;
- for (int i = 0; i < columns.length; i++) {
- if (values[i] != null || explicitNulls[i]) {
- if (firstValue) {
- firstValue = false;
- } else {
- sb.append(',');
- }
- String columnName = columns[i].getName();
- columnName = _updateCallback.quoteIfNescesary(columnName);
- sb.append(columnName);
-
- sb.append('=');
-
- if (inlineValues) {
- sb.append(JdbcUtils.getValueAsSql(columns[i], values[i], _queryRewriter));
- } else {
- sb.append('?');
- }
- }
- }
-
- sb.append(JdbcUtils.createWhereClause(getWhereItems(), _queryRewriter, inlineValues));
- String sql = sb.toString();
- return sql;
- }
-
- @Override
- public String toSql() {
- return createSqlStatement(true);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/e2e2b37a/jdbc/src/main/java/org/eobjects/metamodel/jdbc/JdbcUpdateCallback.java
----------------------------------------------------------------------
diff --git a/jdbc/src/main/java/org/eobjects/metamodel/jdbc/JdbcUpdateCallback.java b/jdbc/src/main/java/org/eobjects/metamodel/jdbc/JdbcUpdateCallback.java
deleted file mode 100644
index 67f1b7c..0000000
--- a/jdbc/src/main/java/org/eobjects/metamodel/jdbc/JdbcUpdateCallback.java
+++ /dev/null
@@ -1,216 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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 org.eobjects.metamodel.jdbc;
-
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.SQLException;
-
-import org.eobjects.metamodel.AbstractUpdateCallback;
-import org.eobjects.metamodel.UpdateCallback;
-import org.eobjects.metamodel.create.TableCreationBuilder;
-import org.eobjects.metamodel.delete.RowDeletionBuilder;
-import org.eobjects.metamodel.drop.TableDropBuilder;
-import org.eobjects.metamodel.insert.RowInsertionBuilder;
-import org.eobjects.metamodel.schema.Schema;
-import org.eobjects.metamodel.schema.Table;
-import org.eobjects.metamodel.update.RowUpdationBuilder;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-abstract class JdbcUpdateCallback extends AbstractUpdateCallback implements UpdateCallback {
-
- private static final Logger logger = LoggerFactory.getLogger(JdbcUpdateCallback.class);
-
- private final JdbcDataContext _dataContext;
- private Connection _connection;
- private String _preparedStatementSql;
- private PreparedStatement _preparedStatement;
-
- public JdbcUpdateCallback(JdbcDataContext dataContext) {
- super(dataContext);
- _dataContext = dataContext;
- }
-
- protected abstract void closePreparedStatement(PreparedStatement preparedStatement);
-
- protected abstract void executePreparedStatement(PreparedStatement preparedStatement) throws SQLException;
-
- public void executePreparedStatement(PreparedStatement preparedStatement, boolean reusedStatement)
- throws SQLException {
- executePreparedStatement(preparedStatement);
- if (!reusedStatement) {
- closePreparedStatement(preparedStatement);
- }
- }
-
- protected final Connection getConnection() {
- if (_connection == null) {
- _connection = getDataContext().getConnection();
- try {
- _connection.setAutoCommit(false);
- } catch (SQLException e) {
- throw JdbcUtils.wrapException(e, "disable auto-commit");
- }
- }
- return _connection;
- }
-
- public final void close(boolean success) {
- if (_connection != null) {
- if (success && _preparedStatement != null) {
- closePreparedStatement(_preparedStatement);
- }
-
- try {
- commitOrRollback(success);
-
- if (_dataContext.isDefaultAutoCommit()) {
- try {
- getConnection().setAutoCommit(true);
- } catch (SQLException e) {
- throw JdbcUtils.wrapException(e, "enable auto-commit");
- }
- }
- } finally {
- getDataContext().close(_connection, null, null);
- }
- }
- }
-
- private void commitOrRollback(boolean success) {
- if (success) {
- try {
- getConnection().commit();
- } catch (SQLException e) {
- throw JdbcUtils.wrapException(e, "commit transaction");
- }
- } else {
- try {
- getConnection().rollback();
- } catch (SQLException e) {
- throw JdbcUtils.wrapException(e, "rollback transaction");
- }
- }
- }
-
- @Override
- public final TableCreationBuilder createTable(Schema schema, String name) throws IllegalArgumentException,
- IllegalStateException {
- return new JdbcCreateTableBuilder(this, schema, name);
- }
-
- @Override
- public final RowInsertionBuilder insertInto(Table table) throws IllegalArgumentException, IllegalStateException {
- return new JdbcInsertBuilder(this, table, _dataContext.getQueryRewriter());
- }
-
- @Override
- public final JdbcDataContext getDataContext() {
- return _dataContext;
- }
-
- protected String quoteIfNescesary(String identifier) {
- if (identifier == null) {
- return null;
- }
- final String quote = _dataContext.getIdentifierQuoteString();
- if (quote == null) {
- return identifier;
- }
- boolean quotes = false;
- if (identifier.indexOf(' ') != -1 || identifier.indexOf('-') != -1) {
- quotes = true;
- } else {
- if (SqlKeywords.isKeyword(identifier)) {
- quotes = true;
- }
- }
-
- if (quotes) {
- identifier = quote + identifier + quote;
- }
- return identifier;
- }
-
- public final PreparedStatement getPreparedStatement(String sql, boolean reuseStatement) {
- final PreparedStatement preparedStatement;
- if (reuseStatement) {
- if (sql.equals(_preparedStatementSql)) {
- preparedStatement = _preparedStatement;
- } else {
- if (_preparedStatement != null) {
- try {
- closePreparedStatement(_preparedStatement);
- } catch (RuntimeException e) {
- logger.error("Exception occurred while closing prepared statement: " + _preparedStatementSql);
- throw e;
- }
- }
- preparedStatement = createPreparedStatement(sql);
- _preparedStatement = preparedStatement;
- _preparedStatementSql = sql;
- }
- } else {
- preparedStatement = createPreparedStatement(sql);
- }
- return preparedStatement;
- }
-
- private final PreparedStatement createPreparedStatement(String sql) {
- try {
- return getConnection().prepareStatement(sql);
- } catch (SQLException e) {
- throw JdbcUtils.wrapException(e, "create prepared statement for: " + sql);
- }
- }
-
- @Override
- public boolean isDeleteSupported() {
- return true;
- }
-
- @Override
- public RowDeletionBuilder deleteFrom(Table table) throws IllegalArgumentException, IllegalStateException,
- UnsupportedOperationException {
- return new JdbcDeleteBuilder(this, table, _dataContext.getQueryRewriter());
- }
-
- @Override
- public boolean isDropTableSupported() {
- return true;
- }
-
- @Override
- public TableDropBuilder dropTable(Table table) throws IllegalArgumentException, IllegalStateException,
- UnsupportedOperationException {
- return new JdbcDropTableBuilder(this, table, _dataContext.getQueryRewriter());
- }
-
- @Override
- public boolean isUpdateSupported() {
- return true;
- }
-
- @Override
- public RowUpdationBuilder update(Table table) throws IllegalArgumentException, IllegalStateException,
- UnsupportedOperationException {
- return new JdbcUpdateBuilder(this, table, _dataContext.getQueryRewriter());
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/e2e2b37a/jdbc/src/main/java/org/eobjects/metamodel/jdbc/JdbcUtils.java
----------------------------------------------------------------------
diff --git a/jdbc/src/main/java/org/eobjects/metamodel/jdbc/JdbcUtils.java b/jdbc/src/main/java/org/eobjects/metamodel/jdbc/JdbcUtils.java
deleted file mode 100644
index 853750f..0000000
--- a/jdbc/src/main/java/org/eobjects/metamodel/jdbc/JdbcUtils.java
+++ /dev/null
@@ -1,265 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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 org.eobjects.metamodel.jdbc;
-
-import java.io.InputStream;
-import java.io.Reader;
-import java.sql.Blob;
-import java.sql.Clob;
-import java.sql.NClob;
-import java.sql.PreparedStatement;
-import java.sql.SQLException;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.List;
-
-import org.eobjects.metamodel.MetaModelException;
-import org.eobjects.metamodel.jdbc.dialects.IQueryRewriter;
-import org.eobjects.metamodel.query.FilterItem;
-import org.eobjects.metamodel.query.OperatorType;
-import org.eobjects.metamodel.query.QueryParameter;
-import org.eobjects.metamodel.schema.Column;
-import org.eobjects.metamodel.schema.ColumnType;
-import org.eobjects.metamodel.schema.TableType;
-import org.eobjects.metamodel.util.FileHelper;
-import org.eobjects.metamodel.util.FormatHelper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public final class JdbcUtils {
-
- private static final Logger logger = LoggerFactory
- .getLogger(JdbcUtils.class);
-
- public static MetaModelException wrapException(SQLException e,
- String actionDescription) throws MetaModelException {
- String message = e.getMessage();
- if (message == null || message.isEmpty()) {
- message = "Could not " + actionDescription;
- } else {
- message = "Could not " + actionDescription + ": " + message;
- }
-
- logger.error(message, e);
- logger.error("Error code={}, SQL state={}", e.getErrorCode(),
- e.getSQLState());
-
- final SQLException nextException = e.getNextException();
- if (nextException != null) {
- logger.error("Next SQL exception: " + nextException.getMessage(),
- nextException);
- }
-
- return new MetaModelException(message, e);
- }
-
- /**
- * Method which handles the action of setting a parameterized value on a
- * statement. Traditionally this is done using the
- * {@link PreparedStatement#setObject(int, Object)} method but for some
- * types we use more specific setter methods.
- *
- * @param st
- * @param valueIndex
- * @param column
- * @param value
- * @throws SQLException
- */
- public static void setStatementValue(final PreparedStatement st,
- final int valueIndex, final Column column, Object value)
- throws SQLException {
- final ColumnType type = (column == null ? null : column.getType());
-
- if (type == null || type == ColumnType.OTHER) {
- // type is not known - nothing more we can do to narrow the type
- st.setObject(valueIndex, value);
- return;
- }
-
- if (value == null && type != null) {
- try {
- final int jdbcType = type.getJdbcType();
- st.setNull(valueIndex, jdbcType);
- return;
- } catch (Exception e) {
- logger.warn(
- "Exception occurred while calling setNull(...) for value index "
- + valueIndex
- + ". Attempting value-based setter method instead.",
- e);
- }
- }
-
- if (type == ColumnType.VARCHAR && value instanceof Date) {
- // some drivers (SQLite and JTDS for MS SQL server) treat dates as
- // VARCHARS. In that case we need to convert the dates to the
- // correct format
- String nativeType = column.getNativeType();
- Date date = (Date) value;
- if ("DATE".equalsIgnoreCase(nativeType)) {
- value = FormatHelper
- .formatSqlTime(ColumnType.DATE, date, false);
- } else if ("TIME".equalsIgnoreCase(nativeType)) {
- value = FormatHelper
- .formatSqlTime(ColumnType.TIME, date, false);
- } else if ("TIMESTAMP".equalsIgnoreCase(nativeType)
- || "DATETIME".equalsIgnoreCase(nativeType)) {
- value = FormatHelper.formatSqlTime(ColumnType.TIMESTAMP, date,
- false);
- }
- }
-
- if (type != null && type.isTimeBased() && value instanceof String) {
- value = FormatHelper.parseSqlTime(type, (String) value);
- }
-
- try {
- if (type == ColumnType.DATE && value instanceof Date) {
- Calendar cal = Calendar.getInstance();
- cal.setTime((Date) value);
- st.setDate(valueIndex,
- new java.sql.Date(cal.getTimeInMillis()), cal);
- } else if (type == ColumnType.TIME && value instanceof Date) {
- Calendar cal = Calendar.getInstance();
- cal.setTime((Date) value);
- st.setTime(valueIndex,
- new java.sql.Time(cal.getTimeInMillis()), cal);
- } else if (type == ColumnType.TIMESTAMP && value instanceof Date) {
- Calendar cal = Calendar.getInstance();
- cal.setTime((Date) value);
- st.setTimestamp(valueIndex,
- new java.sql.Timestamp(cal.getTimeInMillis()), cal);
- } else if (type == ColumnType.CLOB || type == ColumnType.NCLOB) {
- if (value instanceof InputStream) {
- InputStream inputStream = (InputStream) value;
- st.setAsciiStream(valueIndex, inputStream);
- } else if (value instanceof Reader) {
- Reader reader = (Reader) value;
- st.setCharacterStream(valueIndex, reader);
- } else if (value instanceof NClob) {
- NClob nclob = (NClob) value;
- st.setNClob(valueIndex, nclob);
- } else if (value instanceof Clob) {
- Clob clob = (Clob) value;
- st.setClob(valueIndex, clob);
- } else if (value instanceof String) {
- st.setString(valueIndex, (String) value);
- } else {
- st.setObject(valueIndex, value);
- }
- } else if (type == ColumnType.BLOB || type == ColumnType.BINARY) {
- if (value instanceof byte[]) {
- byte[] bytes = (byte[]) value;
- st.setBytes(valueIndex, bytes);
- } else if (value instanceof InputStream) {
- InputStream inputStream = (InputStream) value;
- st.setBinaryStream(valueIndex, inputStream);
- } else if (value instanceof Blob) {
- Blob blob = (Blob) value;
- st.setBlob(valueIndex, blob);
- } else {
- st.setObject(valueIndex, value);
- }
- } else if (type.isLiteral()) {
- final String str;
- if (value instanceof Reader) {
- Reader reader = (Reader) value;
- str = FileHelper.readAsString(reader);
- } else {
- str = value.toString();
- }
- st.setString(valueIndex, str);
- } else {
- st.setObject(valueIndex, value);
- }
- } catch (SQLException e) {
- logger.error("Failed to set parameter {} to value: {}", valueIndex,
- value);
- throw e;
- }
- }
-
- public static String getValueAsSql(Column column, Object value,
- IQueryRewriter queryRewriter) {
- if (value == null) {
- return "NULL";
- }
- final ColumnType columnType = column.getType();
- if (columnType.isLiteral() && value instanceof String) {
- value = queryRewriter.escapeQuotes((String) value);
- }
- String formatSqlValue = FormatHelper.formatSqlValue(columnType, value);
- return formatSqlValue;
- }
-
- public static String createWhereClause(List<FilterItem> whereItems,
- IQueryRewriter queryRewriter, boolean inlineValues) {
- if (whereItems.isEmpty()) {
- return "";
- }
- StringBuilder sb = new StringBuilder();
- sb.append(" WHERE ");
- boolean firstValue = true;
- for (FilterItem whereItem : whereItems) {
- if (firstValue) {
- firstValue = false;
- } else {
- sb.append(" AND ");
- }
- if (!inlineValues) {
- if (isPreparedParameterCandidate(whereItem)) {
- // replace operator with parameter
- whereItem = new FilterItem(whereItem.getSelectItem(),
- whereItem.getOperator(), new QueryParameter());
- }
- }
- final String whereItemLabel = queryRewriter
- .rewriteFilterItem(whereItem);
- sb.append(whereItemLabel);
- }
- return sb.toString();
- }
-
- /**
- * Determines if a particular {@link FilterItem} will have it's parameter
- * (operand) replaced during SQL generation. Such filter items should
- * succesively have their parameters set at execution time.
- *
- * @param whereItem
- * @return
- */
- public static boolean isPreparedParameterCandidate(FilterItem whereItem) {
- return !whereItem.isCompoundFilter()
- && whereItem.getOperator() != OperatorType.IN;
- }
-
- public static String[] getTableTypesAsStrings(TableType[] tableTypes) {
- String[] types = new String[tableTypes.length];
- for (int i = 0; i < types.length; i++) {
- if (tableTypes[i] == TableType.OTHER) {
- // if the OTHER type has been selected, don't use a table
- // pattern (ie. include all types)
- types = null;
- break;
- }
- types[i] = tableTypes[i].toString();
- }
- return types;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/e2e2b37a/jdbc/src/main/java/org/eobjects/metamodel/jdbc/MetadataLoader.java
----------------------------------------------------------------------
diff --git a/jdbc/src/main/java/org/eobjects/metamodel/jdbc/MetadataLoader.java b/jdbc/src/main/java/org/eobjects/metamodel/jdbc/MetadataLoader.java
deleted file mode 100644
index f7f3861..0000000
--- a/jdbc/src/main/java/org/eobjects/metamodel/jdbc/MetadataLoader.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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 org.eobjects.metamodel.jdbc;
-
-/**
- * Defines the interface for a component capable of loading schema-model
- * metadata.
- */
-interface MetadataLoader {
-
- public void loadTables(JdbcSchema jdbcSchema);
-
- public void loadRelations(JdbcSchema jdbcSchema);
-
- public void loadColumns(JdbcTable jdbcTable);
-
- public void loadIndexes(JdbcTable jdbcTable);
-
- public void loadPrimaryKeys(JdbcTable jdbcTable);
-}
http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/e2e2b37a/jdbc/src/main/java/org/eobjects/metamodel/jdbc/QuerySplitter.java
----------------------------------------------------------------------
diff --git a/jdbc/src/main/java/org/eobjects/metamodel/jdbc/QuerySplitter.java b/jdbc/src/main/java/org/eobjects/metamodel/jdbc/QuerySplitter.java
deleted file mode 100644
index 1f74866..0000000
--- a/jdbc/src/main/java/org/eobjects/metamodel/jdbc/QuerySplitter.java
+++ /dev/null
@@ -1,336 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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 org.eobjects.metamodel.jdbc;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.eobjects.metamodel.DataContext;
-import org.eobjects.metamodel.MetaModelHelper;
-import org.eobjects.metamodel.data.DataSet;
-import org.eobjects.metamodel.data.Row;
-import org.eobjects.metamodel.query.FilterItem;
-import org.eobjects.metamodel.query.FromClause;
-import org.eobjects.metamodel.query.FromItem;
-import org.eobjects.metamodel.query.FunctionType;
-import org.eobjects.metamodel.query.GroupByItem;
-import org.eobjects.metamodel.query.OperatorType;
-import org.eobjects.metamodel.query.Query;
-import org.eobjects.metamodel.query.SelectItem;
-import org.eobjects.metamodel.schema.Column;
-import org.eobjects.metamodel.schema.Table;
-
-/**
- * The QuerySplitter class makes it possible to split up queries that are
- * expected to yield a huge result set which may cause performance problems like
- * OutOfMemoryError's or very long processing periods. The resulting queries
- * will in union produce the same result, but in smaller bits (resultsets with
- * less rows).
- *
- * Note that there is an initial performance-penalty associated with splitting
- * the query since some queries will be executed in order to determine
- * reasonable intervals to use for the resulting queries WHERE clauses.
- *
- * @see Query
- * @see DataContext
- */
-public final class QuerySplitter {
-
- public final static long DEFAULT_MAX_ROWS = 300000;
- private static final int MINIMUM_MAX_ROWS = 100;
- private final static Logger logger = LoggerFactory.getLogger(QuerySplitter.class);
-
- private final Query _query;
- private final DataContext _dataContext;
- private long _maxRows = DEFAULT_MAX_ROWS;
- private Long _cachedRowCount = null;
-
- public QuerySplitter(DataContext dc, Query q) {
- if (dc == null) {
- throw new IllegalArgumentException("DataContext cannot be null");
- }
- if (q == null) {
- throw new IllegalArgumentException("Query cannot be null");
- }
- _dataContext = dc;
- _query = q;
- }
-
- /**
- * Splits the query into several queries that will together yield the same
- * result set
- *
- * @return a list of queries that can be executed to yield the same
- * collective result as this QuerySplitter's query
- */
- public List<Query> splitQuery() {
- List<Query> result = new ArrayList<Query>();
- if (isSplittable()) {
- if (getRowCount() > _maxRows) {
- Integer subQueryIndex = getSubQueryFromItemIndex();
- List<Query> splitQueries = null;
- if (subQueryIndex != null) {
- splitQueries = splitQueryBasedOnSubQueries(subQueryIndex);
- } else {
- List<Column> splitColumns = getSplitColumns();
- splitQueries = splitQueryBasedOnColumns(splitColumns);
- }
- result.addAll(splitQueries);
- } else {
- if (logger.isInfoEnabled()) {
- logger.info("Accepted query, maxRows not exceeded: " + _query);
- }
- result.add(_query);
- }
- }
- if (result.isEmpty()) {
- logger.debug("Cannot further split query: {}", _query);
- result.add(_query);
- }
- return result;
- }
-
- private List<Query> splitQueryBasedOnColumns(List<Column> splitColumns) {
- List<Query> result = new ArrayList<Query>();
- if (splitColumns.isEmpty() || getRowCount() <= _maxRows) {
- if (getRowCount() > 0) {
- result.add(_query);
- }
- } else {
- Column firstColumn = splitColumns.get(0);
- splitColumns.remove(0);
- List<Query> splitQueries = splitQueryBasedOnColumn(firstColumn);
- for (Query splitQuery : splitQueries) {
- QuerySplitter qs = new QuerySplitter(_dataContext, splitQuery).setMaxRows(_maxRows);
- if (qs.getRowCount() > _maxRows) {
- // Recursively use the next columns to split queries
- // subsequently
- result.addAll(qs.splitQueryBasedOnColumns(splitColumns));
- } else {
- if (qs.getRowCount() > 0) {
- result.add(splitQuery);
- }
- }
- }
- }
- return result;
- }
-
- private List<Query> splitQueryBasedOnColumn(Column column) {
- SelectItem maxItem = new SelectItem(FunctionType.MAX, column);
- SelectItem minItem = new SelectItem(FunctionType.MIN, column);
- Query q = new Query().from(column.getTable()).select(maxItem, minItem);
- Row row = MetaModelHelper.executeSingleRowQuery(_dataContext, q);
- long max = ceil((Number) row.getValue(maxItem));
- long min = floor((Number) row.getValue(minItem));
- long wholeRange = max - min;
- List<Query> result = new ArrayList<Query>();
- if (wholeRange <= 1) {
- result.add(_query);
- } else {
- long numSplits = ceil(getRowCount() / _maxRows);
- if (numSplits < 2) {
- // Must as a minimum yield two new queries
- numSplits = 2;
- }
- int splitInterval = (int) (wholeRange / numSplits);
- for (int i = 0; i < numSplits; i++) {
- q = _query.clone();
- long lowLimit = min + (i * splitInterval);
- long highLimit = lowLimit + splitInterval;
-
- FilterItem lowerThanFilter = new FilterItem(new SelectItem(column), OperatorType.LESS_THAN, highLimit);
- FilterItem higherThanFilter = new FilterItem(new SelectItem(column), OperatorType.GREATER_THAN,
- lowLimit);
- FilterItem equalsFilter = new FilterItem(new SelectItem(column), OperatorType.EQUALS_TO, lowLimit);
-
- if (i == 0) {
- // This is the first split query: no higherThan filter and
- // include
- // IS NULL
- FilterItem nullFilter = new FilterItem(new SelectItem(column), OperatorType.EQUALS_TO, null);
- FilterItem orFilterItem = new FilterItem(lowerThanFilter, nullFilter);
- q.where(orFilterItem);
- } else if (i + 1 == numSplits) {
- // This is the lats split query: no lowerThan filter,
- FilterItem orFilterItem = new FilterItem(higherThanFilter, equalsFilter);
- q.where(orFilterItem);
- } else {
- higherThanFilter = new FilterItem(higherThanFilter, equalsFilter);
- lowerThanFilter = new FilterItem(lowerThanFilter, equalsFilter);
- q.where(higherThanFilter);
- q.where(lowerThanFilter);
- }
- result.add(q);
- }
- }
- return result;
- }
-
- private static long floor(Number value) {
- Double floor = Math.floor(value.doubleValue());
- return floor.longValue();
- }
-
- private static long ceil(Number value) {
- Double ceil = Math.ceil(value.doubleValue());
- return ceil.longValue();
- }
-
- private List<Query> splitQueryBasedOnSubQueries(int fromItemIndex) {
- Query subQuery = _query.getFromClause().getItem(fromItemIndex).getSubQuery();
- QuerySplitter subQuerySplitter = new QuerySplitter(_dataContext, subQuery);
-
- subQuerySplitter.setMaxRows(_maxRows);
- List<Query> splitQueries = subQuerySplitter.splitQuery();
- List<Query> result = new ArrayList<Query>(splitQueries.size());
- for (Query splitQuery : splitQueries) {
- Query newQuery = _query.clone();
- FromClause fromClause = newQuery.getFromClause();
- String alias = fromClause.getItem(fromItemIndex).getAlias();
- fromClause.removeItem(fromItemIndex);
- newQuery.from(new FromItem(splitQuery).setAlias(alias));
- result.add(newQuery);
- }
- return result;
- }
-
- private Integer getSubQueryFromItemIndex() {
- List<FromItem> fromItems = _query.getFromClause().getItems();
- for (int i = 0; i < fromItems.size(); i++) {
- Query subQuery = fromItems.get(i).getSubQuery();
- if (subQuery != null) {
- if (isSplittable(subQuery)) {
- return i;
- }
- }
- }
- return null;
- }
-
- private boolean isSplittable() {
- return isSplittable(_query);
- }
-
- public static boolean isSplittable(Query q) {
- if (q.getOrderByClause().getItemCount() != 0) {
- return false;
- }
- return true;
- }
-
- private List<Column> getSplitColumns() {
- List<Column> result = new ArrayList<Column>();
- if (_query.getGroupByClause().getItemCount() != 0) {
- List<GroupByItem> groupByItems = _query.getGroupByClause().getItems();
- for (GroupByItem groupByItem : groupByItems) {
- Column column = groupByItem.getSelectItem().getColumn();
- if (column != null) {
- if (column.isIndexed()) {
- // Indexed columns have first priority, they will be
- // added to the beginning of the list
- result.add(0, column);
- } else {
- result.add(column);
- }
- }
- }
- } else {
- List<FromItem> fromItems = _query.getFromClause().getItems();
- for (FromItem fromItem : fromItems) {
- if (fromItem.getTable() != null) {
- addColumnsToResult(fromItem.getTable(), result);
- }
- if (fromItem.getJoin() != null && fromItem.getAlias() == null) {
- if (fromItem.getLeftSide().getTable() != null) {
- addColumnsToResult(fromItem.getLeftSide().getTable(), result);
- }
- if (fromItem.getRightSide().getTable() != null) {
- addColumnsToResult(fromItem.getRightSide().getTable(), result);
- }
- }
- }
- }
- return result;
- }
-
- private static void addColumnsToResult(Table table, List<Column> result) {
- Column[] numberColumns = table.getNumberColumns();
- for (int i = 0; i < numberColumns.length; i++) {
- Column column = numberColumns[i];
- if (column.isIndexed()) {
- // Indexed columns have first priority, they will be
- // added to the beginning of the list
- result.add(0, column);
- } else {
- result.add(column);
- }
- }
- }
-
- /**
- * @return the total number of rows expected from executing the query.
- */
- public long getRowCount() {
- if (_cachedRowCount == null) {
- _cachedRowCount = getRowCount(_query);
- }
- return _cachedRowCount;
- }
-
- private long getRowCount(Query q) {
- q = q.clone();
- SelectItem countAllItem = SelectItem.getCountAllItem();
- if (q.getGroupByClause().getItemCount() > 0) {
- q = new Query().from(new FromItem(q).setAlias("sq")).select(countAllItem);
- } else {
- q.getSelectClause().removeItems();
- q.select(countAllItem);
- }
- Row row = MetaModelHelper.executeSingleRowQuery(_dataContext, q);
- Number count = (Number) row.getValue(countAllItem);
- return count.longValue();
- }
-
- /**
- * Sets the desired maximum result set row count. Note that this size cannot
- * be guaranteed, but will serve as an indicator for determining the
- * split-size
- *
- * @param maxRows
- */
- public QuerySplitter setMaxRows(long maxRows) {
- if (maxRows < MINIMUM_MAX_ROWS) {
- throw new IllegalArgumentException("maxRows must be higher than " + MINIMUM_MAX_ROWS);
- }
- _maxRows = maxRows;
- return this;
- }
-
- public DataSet executeQueries() {
- return executeQueries(splitQuery());
- }
-
- public DataSet executeQueries(List<Query> splitQueries) {
- return new SplitQueriesDataSet(_dataContext, splitQueries);
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/e2e2b37a/jdbc/src/main/java/org/eobjects/metamodel/jdbc/SplitQueriesDataSet.java
----------------------------------------------------------------------
diff --git a/jdbc/src/main/java/org/eobjects/metamodel/jdbc/SplitQueriesDataSet.java b/jdbc/src/main/java/org/eobjects/metamodel/jdbc/SplitQueriesDataSet.java
deleted file mode 100644
index 68cc442..0000000
--- a/jdbc/src/main/java/org/eobjects/metamodel/jdbc/SplitQueriesDataSet.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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 org.eobjects.metamodel.jdbc;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.eobjects.metamodel.DataContext;
-import org.eobjects.metamodel.MetaModelException;
-import org.eobjects.metamodel.data.AbstractDataSet;
-import org.eobjects.metamodel.data.DataSet;
-import org.eobjects.metamodel.data.Row;
-import org.eobjects.metamodel.query.Query;
-import org.eobjects.metamodel.query.SelectItem;
-
-/**
- * DataSet for split queries. Queries will be executed as needed, not at once.
- *
- * @see org.eobjects.metamodel.jdbc.QuerySplitter
- */
-final class SplitQueriesDataSet extends AbstractDataSet {
-
- private static final Logger logger = LoggerFactory.getLogger(SplitQueriesDataSet.class);
- private final DataContext _dataContext;
- private Iterator<Query> _queryIterator;
- private DataSet _currentDataSet;
- private int _queryIndex = 0;
-
- public SplitQueriesDataSet(DataContext dataContext, List<Query> splitQueries) {
- super(getSelectItems(splitQueries));
- if (dataContext == null || splitQueries == null) {
- throw new IllegalArgumentException("Arguments cannot be null");
- }
- _dataContext = dataContext;
- _queryIterator = splitQueries.iterator();
- }
-
- private static List<SelectItem> getSelectItems(List<Query> splitQueries) {
- if (splitQueries.isEmpty()) {
- return new ArrayList<SelectItem>(0);
- }
- return splitQueries.get(0).getSelectClause().getItems();
- }
-
- @Override
- public void close() {
- if (_currentDataSet != null) {
- logger.debug("currentDataSet.close()");
- _currentDataSet.close();
- }
- _currentDataSet = null;
- _queryIterator = null;
- }
-
- @Override
- public Row getRow() throws MetaModelException {
- if (_currentDataSet != null) {
- return _currentDataSet.getRow();
- }
- throw new IllegalStateException("No rows available. Either DataSet is closed or next() hasn't been called");
- }
-
- @Override
- public boolean next() {
- boolean result;
- if (_currentDataSet == null) {
- result = false;
- } else {
- result = _currentDataSet.next();
- }
- if (!result && _queryIterator.hasNext()) {
- if (_currentDataSet != null) {
- logger.debug("currentDataSet.close()");
- _currentDataSet.close();
- }
- Query q = _queryIterator.next();
- _currentDataSet = _dataContext.executeQuery(q);
- if (logger.isDebugEnabled()) {
- _queryIndex++;
- logger.debug("Executing query #{}", _queryIndex);
- }
- result = next();
- }
- return result;
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/e2e2b37a/jdbc/src/main/java/org/eobjects/metamodel/jdbc/SqlKeywords.java
----------------------------------------------------------------------
diff --git a/jdbc/src/main/java/org/eobjects/metamodel/jdbc/SqlKeywords.java b/jdbc/src/main/java/org/eobjects/metamodel/jdbc/SqlKeywords.java
deleted file mode 100644
index eca70fa..0000000
--- a/jdbc/src/main/java/org/eobjects/metamodel/jdbc/SqlKeywords.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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 org.eobjects.metamodel.jdbc;
-
-import java.util.HashSet;
-import java.util.Set;
-
-class SqlKeywords {
-
- private static final Set<String> KEYWORDS;
-
- static {
- KEYWORDS = new HashSet<String>();
- KEYWORDS.add("SELECT");
- KEYWORDS.add("DISTINCT");
- KEYWORDS.add("AS");
- KEYWORDS.add("COUNT");
- KEYWORDS.add("SUM");
- KEYWORDS.add("MIN");
- KEYWORDS.add("MAX");
- KEYWORDS.add("FROM");
- KEYWORDS.add("WHERE");
- KEYWORDS.add("LIKE");
- KEYWORDS.add("IN");
- KEYWORDS.add("GROUP");
- KEYWORDS.add("BY");
- KEYWORDS.add("HAVING");
- KEYWORDS.add("ORDER");
- }
-
- public static boolean isKeyword(String str) {
- str = str.toUpperCase();
- return KEYWORDS.contains(str);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/e2e2b37a/jdbc/src/main/java/org/eobjects/metamodel/jdbc/dialects/AbstractQueryRewriter.java
----------------------------------------------------------------------
diff --git a/jdbc/src/main/java/org/eobjects/metamodel/jdbc/dialects/AbstractQueryRewriter.java b/jdbc/src/main/java/org/eobjects/metamodel/jdbc/dialects/AbstractQueryRewriter.java
deleted file mode 100644
index 2cc8ece..0000000
--- a/jdbc/src/main/java/org/eobjects/metamodel/jdbc/dialects/AbstractQueryRewriter.java
+++ /dev/null
@@ -1,259 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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 org.eobjects.metamodel.jdbc.dialects;
-
-import java.util.List;
-
-import org.eobjects.metamodel.jdbc.JdbcDataContext;
-import org.eobjects.metamodel.query.AbstractQueryClause;
-import org.eobjects.metamodel.query.FilterClause;
-import org.eobjects.metamodel.query.FilterItem;
-import org.eobjects.metamodel.query.FromClause;
-import org.eobjects.metamodel.query.FromItem;
-import org.eobjects.metamodel.query.GroupByClause;
-import org.eobjects.metamodel.query.GroupByItem;
-import org.eobjects.metamodel.query.OperatorType;
-import org.eobjects.metamodel.query.OrderByClause;
-import org.eobjects.metamodel.query.OrderByItem;
-import org.eobjects.metamodel.query.Query;
-import org.eobjects.metamodel.query.SelectClause;
-import org.eobjects.metamodel.query.SelectItem;
-import org.eobjects.metamodel.schema.ColumnType;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Abstract implementation of query rewriter. This implementation delegates the
- * rewriting of the Query into several subtasks according to the query items to
- * be rendered. This makes it easy to overload single methods in order to
- * correct syntax quirks.
- */
-public abstract class AbstractQueryRewriter implements IQueryRewriter {
-
- protected final Logger logger = LoggerFactory.getLogger(getClass());
-
- private final JdbcDataContext _dataContext;
-
- public AbstractQueryRewriter(JdbcDataContext dataContext) {
- _dataContext = dataContext;
- }
-
- public JdbcDataContext getDataContext() {
- return _dataContext;
- }
-
- @Override
- public ColumnType getColumnType(int jdbcType, String nativeType, Integer columnSize) {
- return ColumnType.convertColumnType(jdbcType);
- }
-
- public String rewriteQuery(Query query) {
- query = beforeRewrite(query);
-
- final StringBuilder sb = new StringBuilder();
- sb.append(rewriteSelectClause(query, query.getSelectClause()));
- sb.append(rewriteFromClause(query, query.getFromClause()));
- sb.append(rewriteWhereClause(query, query.getWhereClause()));
- sb.append(rewriteGroupByClause(query, query.getGroupByClause()));
- sb.append(rewriteHavingClause(query, query.getHavingClause()));
- sb.append(rewriteOrderByClause(query, query.getOrderByClause()));
- return sb.toString();
- }
-
- public boolean isSchemaIncludedInColumnPaths() {
- return false;
- }
-
- /**
- * Method to modify query before rewriting begins. Overwrite this method if
- * you want to change parts of the query that are not just rendering
- * related. Cloning the query before modifying is recommended in order to
- * not violate referential integrity of clients (the query is mutable).
- *
- * @param strategy
- * @param query
- * @return the modified query
- */
- protected Query beforeRewrite(Query query) {
- return query;
- }
-
- @Override
- public String rewriteColumnType(ColumnType columnType) {
- return columnType.toString();
- }
-
- protected String rewriteOrderByClause(Query query, OrderByClause orderByClause) {
- StringBuilder sb = new StringBuilder();
- if (orderByClause.getItemCount() > 0) {
- sb.append(AbstractQueryClause.PREFIX_ORDER_BY);
- List<OrderByItem> items = orderByClause.getItems();
- for (int i = 0; i < items.size(); i++) {
- OrderByItem item = items.get(i);
- if (i != 0) {
- sb.append(AbstractQueryClause.DELIM_COMMA);
- }
- sb.append(rewriteOrderByItem(query, item));
- }
- }
- return sb.toString();
- }
-
- @Override
- public String rewriteFromItem(FromItem item) {
- return rewriteFromItem(item.getQuery(), item);
- }
-
- protected String rewriteOrderByItem(Query query, OrderByItem item) {
- return item.toSql(isSchemaIncludedInColumnPaths());
- }
-
- protected String rewriteHavingClause(Query query, FilterClause havingClause) {
- StringBuilder sb = new StringBuilder();
- if (havingClause.getItemCount() > 0) {
- sb.append(AbstractQueryClause.PREFIX_HAVING);
- List<FilterItem> items = havingClause.getItems();
- for (int i = 0; i < items.size(); i++) {
- FilterItem item = items.get(i);
- if (i != 0) {
- sb.append(AbstractQueryClause.DELIM_AND);
- }
- sb.append(rewriteFilterItem(item));
- }
- }
- return sb.toString();
- }
-
- protected String rewriteGroupByClause(Query query, GroupByClause groupByClause) {
- StringBuilder sb = new StringBuilder();
- if (groupByClause.getItemCount() > 0) {
- sb.append(AbstractQueryClause.PREFIX_GROUP_BY);
- List<GroupByItem> items = groupByClause.getItems();
- for (int i = 0; i < items.size(); i++) {
- GroupByItem item = items.get(i);
- if (i != 0) {
- sb.append(AbstractQueryClause.DELIM_COMMA);
- }
- sb.append(rewriteGroupByItem(query, item));
- }
- }
- return sb.toString();
- }
-
- protected String rewriteGroupByItem(Query query, GroupByItem item) {
- return item.toSql(isSchemaIncludedInColumnPaths());
- }
-
- protected String rewriteWhereClause(Query query, FilterClause whereClause) {
- StringBuilder sb = new StringBuilder();
- if (whereClause.getItemCount() > 0) {
- sb.append(AbstractQueryClause.PREFIX_WHERE);
- List<FilterItem> items = whereClause.getItems();
- for (int i = 0; i < items.size(); i++) {
- FilterItem item = items.get(i);
- if (i != 0) {
- sb.append(AbstractQueryClause.DELIM_AND);
- }
- sb.append(rewriteFilterItem(item));
- }
- }
- return sb.toString();
- }
-
- @Override
- public String rewriteFilterItem(FilterItem item) {
- if (item.isCompoundFilter()) {
- FilterItem[] childItems = item.getChildItems();
- StringBuilder sb = new StringBuilder();
- sb.append('(');
- for (int i = 0; i < childItems.length; i++) {
- FilterItem child = childItems[i];
- if (i != 0) {
- sb.append(' ');
- sb.append(item.getLogicalOperator().toString());
- sb.append(' ');
- }
- sb.append(rewriteFilterItem(child));
- }
- sb.append(')');
- return sb.toString();
- }
-
- final String primaryFilterSql = item.toSql(isSchemaIncludedInColumnPaths());
-
- final OperatorType operator = item.getOperator();
- if (operator == OperatorType.DIFFERENT_FROM) {
- final Object operand = item.getOperand();
- if (operand != null) {
- // special case in SQL where NULL is not treated as a value -
- // see Ticket #1058
-
- FilterItem isNullFilter = new FilterItem(item.getSelectItem(), OperatorType.EQUALS_TO, null);
- final String secondaryFilterSql = rewriteFilterItem(isNullFilter);
-
- return '(' + primaryFilterSql + " OR " + secondaryFilterSql + ')';
- }
- }
-
- return primaryFilterSql;
- }
-
- protected String rewriteFromClause(Query query, FromClause fromClause) {
- StringBuilder sb = new StringBuilder();
- if (fromClause.getItemCount() > 0) {
- sb.append(AbstractQueryClause.PREFIX_FROM);
- List<FromItem> items = fromClause.getItems();
- for (int i = 0; i < items.size(); i++) {
- FromItem item = items.get(i);
- if (i != 0) {
- sb.append(AbstractQueryClause.DELIM_COMMA);
- }
- sb.append(rewriteFromItem(query, item));
- }
- }
- return sb.toString();
- }
-
- protected String rewriteFromItem(Query query, FromItem item) {
- return item.toSql(isSchemaIncludedInColumnPaths());
- }
-
- protected String rewriteSelectClause(Query query, SelectClause selectClause) {
- StringBuilder sb = new StringBuilder();
- if (selectClause.getItemCount() > 0) {
- sb.append(AbstractQueryClause.PREFIX_SELECT);
- if (selectClause.isDistinct()) {
- sb.append("DISTINCT ");
- }
- List<SelectItem> items = selectClause.getItems();
- for (int i = 0; i < items.size(); i++) {
- SelectItem item = items.get(i);
- if (i != 0) {
- sb.append(AbstractQueryClause.DELIM_COMMA);
- }
- sb.append(rewriteSelectItem(query, item));
- }
- }
- return sb.toString();
- }
-
- protected String rewriteSelectItem(Query query, SelectItem item) {
- return item.toSql(isSchemaIncludedInColumnPaths());
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/e2e2b37a/jdbc/src/main/java/org/eobjects/metamodel/jdbc/dialects/DB2QueryRewriter.java
----------------------------------------------------------------------
diff --git a/jdbc/src/main/java/org/eobjects/metamodel/jdbc/dialects/DB2QueryRewriter.java b/jdbc/src/main/java/org/eobjects/metamodel/jdbc/dialects/DB2QueryRewriter.java
deleted file mode 100644
index 90eeb9d..0000000
--- a/jdbc/src/main/java/org/eobjects/metamodel/jdbc/dialects/DB2QueryRewriter.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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 org.eobjects.metamodel.jdbc.dialects;
-
-import java.util.Date;
-import java.util.List;
-
-import org.eobjects.metamodel.jdbc.JdbcDataContext;
-import org.eobjects.metamodel.query.FilterItem;
-import org.eobjects.metamodel.query.FromItem;
-import org.eobjects.metamodel.query.OperatorType;
-import org.eobjects.metamodel.query.Query;
-import org.eobjects.metamodel.query.SelectItem;
-import org.eobjects.metamodel.schema.ColumnType;
-import org.eobjects.metamodel.util.FormatHelper;
-import org.eobjects.metamodel.util.TimeComparator;
-
-/**
- * Query rewriter for IBM DB2
- */
-public class DB2QueryRewriter extends DefaultQueryRewriter implements IQueryRewriter {
-
- public DB2QueryRewriter(JdbcDataContext dataContext) {
- super(dataContext);
- }
-
- @Override
- public String escapeQuotes(String filterItemOperand) {
- return filterItemOperand.replaceAll("\\'", "\\\\'");
- }
-
- /**
- * DB2 expects the fully qualified column name, including schema, in select
- * items.
- */
- @Override
- public boolean isSchemaIncludedInColumnPaths() {
- return true;
- }
-
- @Override
- public boolean isMaxRowsSupported() {
- return true;
- }
-
- @Override
- public boolean isFirstRowSupported() {
- return true;
- }
-
- @Override
- public String rewriteQuery(Query query) {
- final Integer firstRow = query.getFirstRow();
- final Integer maxRows = query.getMaxRows();
-
- if (maxRows == null && firstRow == null) {
- return super.rewriteQuery(query);
- }
-
- if (firstRow == null || firstRow.intValue() == 1) {
- // We prefer to use the "FETCH FIRST [n] ROWS ONLY" approach, if
- // firstRow is not specified.
- return super.rewriteQuery(query) + " FETCH FIRST " + maxRows + " ROWS ONLY";
-
- } else {
- // build a ROW_NUMBER() query like this:
-
- // SELECT [original select clause]
- // FROM ([original select clause],
- // ROW_NUMBER() AS metamodel_row_number
- // FROM [remainder of regular query])
- // WHERE metamodel_row_number BETWEEN [firstRow] and [maxRows];
-
- final Query innerQuery = query.clone();
- innerQuery.setFirstRow(null);
- innerQuery.setMaxRows(null);
-
- final Query outerQuery = new Query();
- final FromItem subQuerySelectItem = new FromItem(innerQuery).setAlias("metamodel_subquery");
- outerQuery.from(subQuerySelectItem);
-
- final List<SelectItem> innerSelectItems = innerQuery.getSelectClause().getItems();
- for (SelectItem selectItem : innerSelectItems) {
- outerQuery.select(new SelectItem(selectItem, subQuerySelectItem));
- }
-
- innerQuery.select(new SelectItem("ROW_NUMBER() OVER()", "metamodel_row_number"));
-
- final String baseQueryString = rewriteQuery(outerQuery);
-
- if (maxRows == null) {
- return baseQueryString + " WHERE metamodel_row_number > " + (firstRow - 1);
- }
-
- return baseQueryString + " WHERE metamodel_row_number BETWEEN " + firstRow + " AND " + (firstRow - 1 + maxRows);
- }
- }
-
- @Override
- public String rewriteColumnType(ColumnType columnType) {
- switch (columnType) {
- case BOOLEAN:
- case BIT:
- return "SMALLINT";
- default:
- return super.rewriteColumnType(columnType);
- }
- }
-
- @Override
- public String rewriteFilterItem(FilterItem item) {
- SelectItem _selectItem = item.getSelectItem();
- Object _operand = item.getOperand();
- OperatorType _operator = item.getOperator();
- if (null != _selectItem && _operand != null) {
- ColumnType columnType = _selectItem.getExpectedColumnType();
- if (columnType != null) {
- if (columnType.isTimeBased()) {
- // special logic for DB2 based time operands.
-
- StringBuilder sb = new StringBuilder();
- sb.append(_selectItem.getSameQueryAlias(true));
- final Object operand = FilterItem.appendOperator(sb, _operand, _operator);
-
- if (operand instanceof SelectItem) {
- final String selectItemString = ((SelectItem) operand).getSameQueryAlias(true);
- sb.append(selectItemString);
- } else {
- Date date = TimeComparator.toDate(_operand);
- if (date == null) {
- throw new IllegalStateException("Could not convert " + _operand + " to date");
- }
-
- final String sqlValue = FormatHelper.formatSqlTime(columnType, date, true, "('", "')");
- sb.append(sqlValue);
- }
-
- return sb.toString();
- }
- }
- }
- return super.rewriteFilterItem(item);
- }
-
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/e2e2b37a/jdbc/src/main/java/org/eobjects/metamodel/jdbc/dialects/DefaultQueryRewriter.java
----------------------------------------------------------------------
diff --git a/jdbc/src/main/java/org/eobjects/metamodel/jdbc/dialects/DefaultQueryRewriter.java b/jdbc/src/main/java/org/eobjects/metamodel/jdbc/dialects/DefaultQueryRewriter.java
deleted file mode 100644
index d3356cd..0000000
--- a/jdbc/src/main/java/org/eobjects/metamodel/jdbc/dialects/DefaultQueryRewriter.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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 org.eobjects.metamodel.jdbc.dialects;
-
-import java.util.List;
-import java.util.ListIterator;
-
-import org.eobjects.metamodel.jdbc.JdbcDataContext;
-import org.eobjects.metamodel.query.FilterItem;
-import org.eobjects.metamodel.query.FromItem;
-import org.eobjects.metamodel.query.OperatorType;
-import org.eobjects.metamodel.query.Query;
-import org.eobjects.metamodel.query.SelectItem;
-import org.eobjects.metamodel.util.CollectionUtils;
-
-/**
- * Generic query rewriter that adds syntax enhancements that are only possible
- * to resolve just before execution time.
- */
-public class DefaultQueryRewriter extends AbstractQueryRewriter {
-
- private static final String SPECIAL_ALIAS_CHARACTERS = "- ,.|*%()!#¤/\\=?;:~";
-
- public DefaultQueryRewriter(JdbcDataContext dataContext) {
- super(dataContext);
- }
-
- @Override
- protected Query beforeRewrite(Query query) {
- query = query.clone();
-
- JdbcDataContext dataContext = getDataContext();
- if (dataContext != null) {
- String identifierQuoteString = dataContext.getIdentifierQuoteString();
- if (identifierQuoteString != null) {
- List<SelectItem> selectItems = query.getSelectClause().getItems();
- for (SelectItem item : selectItems) {
- String alias = item.getAlias();
- if (needsQuoting(alias, identifierQuoteString)) {
- item.setAlias(identifierQuoteString + alias + identifierQuoteString);
- }
- }
- List<FromItem> fromItems = query.getFromClause().getItems();
- for (FromItem item : fromItems) {
- String alias = item.getAlias();
- if (needsQuoting(alias, identifierQuoteString)) {
- item.setAlias(identifierQuoteString + alias + identifierQuoteString);
- }
- }
- }
- }
- return query;
- }
-
- private boolean needsQuoting(String alias, String identifierQuoteString) {
- boolean result = false;
- if (alias != null && identifierQuoteString != null) {
- if (alias.indexOf(identifierQuoteString) == -1) {
- for (int i = 0; i < SPECIAL_ALIAS_CHARACTERS.length(); i++) {
- char specialCharacter = SPECIAL_ALIAS_CHARACTERS.charAt(i);
- if (alias.indexOf(specialCharacter) != -1) {
- result = true;
- break;
- }
- }
- }
- }
- if (logger.isDebugEnabled()) {
- logger.debug("needsQuoting(" + alias + "," + identifierQuoteString + ") = " + result);
- }
- return result;
- }
-
- @Override
- public String rewriteFilterItem(FilterItem item) {
- Object operand = item.getOperand();
- if (operand != null) {
- if (operand instanceof String) {
- String str = (String) operand;
- // escape single quotes
- if (str.indexOf('\'') != -1) {
- str = escapeQuotes(str);
- FilterItem replacementFilterItem = new FilterItem(item.getSelectItem(), item.getOperator(), str);
- return super.rewriteFilterItem(replacementFilterItem);
- }
- } else if (operand instanceof Iterable || operand.getClass().isArray()) {
- // operand is a set of values (typically in combination with an
- // IN operator). Each individual element must be escaped.
-
- assert item.getOperator() == OperatorType.IN;
-
- @SuppressWarnings("unchecked")
- final List<Object> elements = (List<Object>) CollectionUtils.toList(operand);
-
- for (ListIterator<Object> it = elements.listIterator(); it.hasNext();) {
- Object next = it.next();
- if (next == null) {
- logger.warn("element in IN list is NULL, which isn't supported by SQL. Stripping the element from the list: {}", item);
- it.remove();
- } else if (next instanceof String) {
- String str = (String) next;
- if (str.indexOf('\'') != -1) {
- str = escapeQuotes(str);
- it.set(str);
- }
- }
- }
-
- FilterItem replacementFilterItem = new FilterItem(item.getSelectItem(), item.getOperator(), elements);
- return super.rewriteFilterItem(replacementFilterItem);
- }
- }
- return super.rewriteFilterItem(item);
- }
-
- @Override
- public boolean isFirstRowSupported() {
- return false;
- }
-
- @Override
- public boolean isMaxRowsSupported() {
- return false;
- }
-
- @Override
- public String escapeQuotes(String item) {
- return item.replaceAll("\\'", "\\'\\'");
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/e2e2b37a/jdbc/src/main/java/org/eobjects/metamodel/jdbc/dialects/H2QueryRewriter.java
----------------------------------------------------------------------
diff --git a/jdbc/src/main/java/org/eobjects/metamodel/jdbc/dialects/H2QueryRewriter.java b/jdbc/src/main/java/org/eobjects/metamodel/jdbc/dialects/H2QueryRewriter.java
deleted file mode 100644
index 4ed4555..0000000
--- a/jdbc/src/main/java/org/eobjects/metamodel/jdbc/dialects/H2QueryRewriter.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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 org.eobjects.metamodel.jdbc.dialects;
-
-import org.eobjects.metamodel.jdbc.JdbcDataContext;
-
-/**
- * Query rewriter for H2
- */
-public class H2QueryRewriter extends LimitOffsetQueryRewriter {
-
- public H2QueryRewriter(JdbcDataContext dataContext) {
- super(dataContext);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/e2e2b37a/jdbc/src/main/java/org/eobjects/metamodel/jdbc/dialects/HsqldbQueryRewriter.java
----------------------------------------------------------------------
diff --git a/jdbc/src/main/java/org/eobjects/metamodel/jdbc/dialects/HsqldbQueryRewriter.java b/jdbc/src/main/java/org/eobjects/metamodel/jdbc/dialects/HsqldbQueryRewriter.java
deleted file mode 100644
index cf54718..0000000
--- a/jdbc/src/main/java/org/eobjects/metamodel/jdbc/dialects/HsqldbQueryRewriter.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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 org.eobjects.metamodel.jdbc.dialects;
-
-import org.eobjects.metamodel.jdbc.JdbcDataContext;
-import org.eobjects.metamodel.query.FilterItem;
-import org.eobjects.metamodel.query.Query;
-import org.eobjects.metamodel.query.SelectClause;
-import org.eobjects.metamodel.query.SelectItem;
-import org.eobjects.metamodel.schema.Column;
-import org.eobjects.metamodel.schema.ColumnType;
-
-/**
- * Query rewriter for HSQLDB
- */
-public class HsqldbQueryRewriter extends DefaultQueryRewriter {
-
- public HsqldbQueryRewriter(JdbcDataContext dataContext) {
- super(dataContext);
- }
-
- @Override
- public String rewriteColumnType(ColumnType columnType) {
- if (columnType == ColumnType.BLOB) {
- return "LONGVARBINARY";
- }
- return super.rewriteColumnType(columnType);
- }
-
- @Override
- public boolean isFirstRowSupported() {
- return true;
- }
-
- @Override
- public boolean isMaxRowsSupported() {
- return true;
- }
-
- @Override
- protected String rewriteSelectClause(Query query, SelectClause selectClause) {
- String result = super.rewriteSelectClause(query, selectClause);
-
- Integer firstRow = query.getFirstRow();
- Integer maxRows = query.getMaxRows();
- if (maxRows != null || firstRow != null) {
- if (maxRows == null) {
- maxRows = Integer.MAX_VALUE;
- }
- if (firstRow == null || firstRow <= 0) {
- result = "SELECT TOP " + maxRows + " " + result.substring(7);
- } else {
- final int offset = firstRow - 1;
- result = "SELECT LIMIT " + offset + " " + maxRows + " " + result.substring(7);
- }
- }
-
- return result;
- }
-
- @Override
- public String rewriteFilterItem(FilterItem item) {
- if (!item.isCompoundFilter()) {
- final SelectItem selectItem = item.getSelectItem();
- final Column column = selectItem.getColumn();
- if (column != null) {
- if (column.getType() == ColumnType.TIMESTAMP) {
- // HSQLDB does not treat (TIMESTAMP 'yyyy-MM-dd hh:mm:ss')
- // tokens correctly
- String result = super.rewriteFilterItem(item);
- int indexOfTimestamp = result.lastIndexOf("TIMESTAMP");
- if (indexOfTimestamp != -1) {
- result = result.substring(0, indexOfTimestamp)
- + result.substring(indexOfTimestamp + "TIMESTAMP".length());
- }
- return result;
- }
- }
- }
- return super.rewriteFilterItem(item);
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/e2e2b37a/jdbc/src/main/java/org/eobjects/metamodel/jdbc/dialects/IQueryRewriter.java
----------------------------------------------------------------------
diff --git a/jdbc/src/main/java/org/eobjects/metamodel/jdbc/dialects/IQueryRewriter.java b/jdbc/src/main/java/org/eobjects/metamodel/jdbc/dialects/IQueryRewriter.java
deleted file mode 100644
index 4d94d40..0000000
--- a/jdbc/src/main/java/org/eobjects/metamodel/jdbc/dialects/IQueryRewriter.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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 org.eobjects.metamodel.jdbc.dialects;
-
-import java.sql.Types;
-
-import org.eobjects.metamodel.jdbc.JdbcDataContext;
-import org.eobjects.metamodel.query.FilterItem;
-import org.eobjects.metamodel.query.FromItem;
-import org.eobjects.metamodel.query.Query;
-import org.eobjects.metamodel.schema.ColumnType;
-
-/**
- * A query rewriter can be used for rewriting (part of) a query's string
- * representation. This is usefull for databases that deviate from the SQL 99
- * compliant syntax which is delievered by the query and it's query item's
- * toString() methods.
- *
- * @see AbstractQueryRewriter
- * @see JdbcDataContext
- */
-public interface IQueryRewriter {
-
- public String rewriteFromItem(FromItem item);
-
- public String rewriteQuery(Query query);
-
- public String rewriteFilterItem(FilterItem whereItem);
-
- /**
- * Gets whether this query rewriter is able to write the "Max rows" query
- * property to the query string.
- *
- * @return whether this query rewriter is able to write the "Max rows" query
- * property to the query string.
- */
- public boolean isMaxRowsSupported();
-
- /**
- * Gets whether this query rewriter is able to write the "First row" query
- * property to the query string.
- *
- * @return whether this query rewriter is able to write the "First row"
- * query property to the query string.
- */
- public boolean isFirstRowSupported();
-
- /**
- * Escapes the quotes within a String literal of a query item.
- *
- * @return String item with quotes escaped.
- */
- public String escapeQuotes(String item);
-
- /**
- * Rewrites the name of a column type, as it is written in CREATE TABLE
- * statements. Some databases dont support all column types, or have
- * different names for them. The implementation of this method will do that
- * conversion.
- *
- * @param columnType
- * @return
- */
- public String rewriteColumnType(ColumnType columnType);
-
- /**
- * Gets the column type for a specific JDBC type (as defined in
- * {@link Types}), native type name and column size.
- *
- * @param jdbcType
- * @param nativeType
- * @param columnSize
- * @return
- */
- public ColumnType getColumnType(int jdbcType, String nativeType, Integer columnSize);
-
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/e2e2b37a/jdbc/src/main/java/org/eobjects/metamodel/jdbc/dialects/LimitOffsetQueryRewriter.java
----------------------------------------------------------------------
diff --git a/jdbc/src/main/java/org/eobjects/metamodel/jdbc/dialects/LimitOffsetQueryRewriter.java b/jdbc/src/main/java/org/eobjects/metamodel/jdbc/dialects/LimitOffsetQueryRewriter.java
deleted file mode 100644
index b15b8ca..0000000
--- a/jdbc/src/main/java/org/eobjects/metamodel/jdbc/dialects/LimitOffsetQueryRewriter.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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 org.eobjects.metamodel.jdbc.dialects;
-
-import org.eobjects.metamodel.jdbc.JdbcDataContext;
-import org.eobjects.metamodel.query.Query;
-
-/**
- * Query rewriter for databases that support LIMIT and OFFSET keywords for max
- * rows and first row properties.
- */
-public abstract class LimitOffsetQueryRewriter extends DefaultQueryRewriter {
-
- public LimitOffsetQueryRewriter(JdbcDataContext dataContext) {
- super(dataContext);
- }
-
- @Override
- public final boolean isFirstRowSupported() {
- return true;
- }
-
- @Override
- public final boolean isMaxRowsSupported() {
- return true;
- }
-
- /**
- * {@inheritDoc}
- *
- * If the Max rows and/or First row property of the query is set, then we
- * will use the database's LIMIT and OFFSET functions.
- */
- @Override
- public String rewriteQuery(Query query) {
- String queryString = super.rewriteQuery(query);
- Integer maxRows = query.getMaxRows();
- Integer firstRow = query.getFirstRow();
- if (maxRows != null || firstRow != null) {
- if (maxRows == null) {
- maxRows = Integer.MAX_VALUE;
- }
- queryString = queryString + " LIMIT " + maxRows;
-
- if (firstRow != null && firstRow > 1) {
- // offset is 0-based
- int offset = firstRow - 1;
- queryString = queryString + " OFFSET " + offset;
- }
- }
-
-
- return queryString;
- }
-}