You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by nt...@apache.org on 2019/05/04 15:01:03 UTC
[cayenne] 01/04: Do not use TRIM() on Sybase to keep 4.1
compatibility
This is an automated email from the ASF dual-hosted git repository.
ntimofeev pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git
commit d72999e4b78cf2db70dfe4d79fd7953e21bca34b
Author: Nikita Timofeev <st...@gmail.com>
AuthorDate: Sat May 4 17:13:21 2019 +0300
Do not use TRIM() on Sybase to keep 4.1 compatibility
---
.../cayenne/dba/sqlserver/SQLServerAdapter.java | 4 +
.../dba/sqlserver/SQLServerTreeProcessor.java | 96 +---------------------
.../apache/cayenne/dba/sybase/SybaseAdapter.java | 7 +-
.../SybaseSQLTreeProcessor.java} | 21 +++--
4 files changed, 21 insertions(+), 107 deletions(-)
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlserver/SQLServerAdapter.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlserver/SQLServerAdapter.java
index 6a99dcb..ed0619b 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlserver/SQLServerAdapter.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlserver/SQLServerAdapter.java
@@ -74,6 +74,10 @@ import org.apache.cayenne.resource.ResourceLocator;
*/
public class SQLServerAdapter extends SybaseAdapter {
+ /**
+ * @deprecated since 4.2 unused
+ */
+ @Deprecated
public static final String TRIM_FUNCTION = "RTRIM";
public SQLServerAdapter(@Inject RuntimeProperties runtimeProperties,
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlserver/SQLServerTreeProcessor.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlserver/SQLServerTreeProcessor.java
index 2681a53..2d697cb 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlserver/SQLServerTreeProcessor.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlserver/SQLServerTreeProcessor.java
@@ -20,109 +20,17 @@
package org.apache.cayenne.dba.sqlserver;
import org.apache.cayenne.access.sqlbuilder.sqltree.ColumnNode;
-import org.apache.cayenne.access.sqlbuilder.sqltree.EmptyNode;
-import org.apache.cayenne.access.sqlbuilder.sqltree.FunctionNode;
-import org.apache.cayenne.access.sqlbuilder.sqltree.LimitOffsetNode;
import org.apache.cayenne.access.sqlbuilder.sqltree.Node;
-import org.apache.cayenne.access.sqlbuilder.sqltree.NodeType;
-import org.apache.cayenne.access.sqlbuilder.sqltree.OpExpressionNode;
-import org.apache.cayenne.access.sqlbuilder.sqltree.TextNode;
-import org.apache.cayenne.access.sqlbuilder.sqltree.TopNode;
-import org.apache.cayenne.access.translator.select.BaseSQLTreeProcessor;
import org.apache.cayenne.dba.sqlserver.sqltree.SQLServerColumnNode;
+import org.apache.cayenne.dba.sybase.SybaseSQLTreeProcessor;
/**
* @since 4.2
*/
-public class SQLServerTreeProcessor extends BaseSQLTreeProcessor {
-
- @Override
- protected void onLimitOffsetNode(Node parent, LimitOffsetNode child, int index) {
- // SQLServer uses "SELECT DISTINCT TOP N" or "SELECT TOP N" instead of LIMIT
- // Offset will be calculated in-memory
- replaceChild(parent, index, new EmptyNode(), false);
- if(child.getLimit() > 0) {
- int limit = child.getLimit() + child.getOffset();
- // we have root actually as input for processor, but it's better to keep processor stateless
- // root shouldn't be far from limit's parent (likely it will be parent itself)
- Node root = getRoot(parent);
- int idx = 0;
- if(root.getChild(0).getType() == NodeType.DISTINCT) {
- idx = 1;
- }
- root.addChild(idx, new TopNode(limit));
- }
- }
-
- private Node getRoot(Node node) {
- while(node.getParent() != null) {
- node = node.getParent();
- }
- return node;
- }
+public class SQLServerTreeProcessor extends SybaseSQLTreeProcessor {
@Override
protected void onColumnNode(Node parent, ColumnNode child, int index) {
replaceChild(parent, index, new SQLServerColumnNode(child));
}
-
- @Override
- protected void onFunctionNode(Node parent, FunctionNode child, int index) {
- String functionName = child.getFunctionName();
- Node replacement = null;
- switch (functionName) {
- case "LENGTH":
- replacement = new FunctionNode("LEN", child.getAlias(), true);
- break;
- case "LOCATE":
- replacement = new FunctionNode("CHARINDEX", child.getAlias(), true);
- break;
- case "MOD":
- replacement = new OpExpressionNode("%");
- break;
- case "TRIM":
- Node rtrim = new FunctionNode("RTRIM", null, true);
- replacement = new FunctionNode("LTRIM", child.getAlias(), true);
- for(int i=0; i<child.getChildrenCount(); i++) {
- rtrim.addChild(child.getChild(i));
- }
- replacement.addChild(rtrim);
- parent.replaceChild(index, replacement);
- return;
- case "CURRENT_DATE":
- replacement = new FunctionNode("{fn CURDATE()}", child.getAlias(), false);
- break;
- case "CURRENT_TIME":
- replacement = new FunctionNode("{fn CURTIME()}", child.getAlias(), false);
- break;
- case "CURRENT_TIMESTAMP":
- replacement = new FunctionNode("CURRENT_TIMESTAMP", child.getAlias(), false);
- break;
-
- case "YEAR":
- case "MONTH":
- case "WEEK":
- case "DAY_OF_YEAR":
- case "DAY":
- case "DAY_OF_MONTH":
- case "DAY_OF_WEEK":
- case "HOUR":
- case "MINUTE":
- case "SECOND":
- replacement = new FunctionNode("DATEPART", child.getAlias(), true);
- if("DAY_OF_MONTH".equals(functionName)) {
- functionName = "DAY";
- } else if("DAY_OF_WEEK".equals(functionName)) {
- functionName = "WEEKDAY";
- } else if("DAY_OF_YEAR".equals(functionName)) {
- functionName = "DAYOFYEAR";
- }
- replacement.addChild(new TextNode(functionName));
- break;
- }
-
- if(replacement != null) {
- replaceChild(parent, index, replacement);
- }
- }
}
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/sybase/SybaseAdapter.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/sybase/SybaseAdapter.java
index 2aaff9d..6226f2c 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/sybase/SybaseAdapter.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/sybase/SybaseAdapter.java
@@ -20,7 +20,6 @@
package org.apache.cayenne.dba.sybase;
import java.sql.PreparedStatement;
-import java.sql.SQLException;
import java.sql.Types;
import java.util.List;
import java.util.function.Function;
@@ -42,7 +41,6 @@ import org.apache.cayenne.dba.DefaultQuotingStrategy;
import org.apache.cayenne.dba.JdbcAdapter;
import org.apache.cayenne.dba.PkGenerator;
import org.apache.cayenne.dba.QuotingStrategy;
-import org.apache.cayenne.dba.sqlserver.SQLServerTreeProcessor;
import org.apache.cayenne.di.Inject;
import org.apache.cayenne.map.DbAttribute;
import org.apache.cayenne.resource.ResourceLocator;
@@ -81,7 +79,7 @@ public class SybaseAdapter extends JdbcAdapter {
*/
@Override
public Function<Node, Node> getSqlTreeProcessor() {
- return new SQLServerTreeProcessor();
+ return new SybaseSQLTreeProcessor();
}
/**
@@ -124,8 +122,7 @@ public class SybaseAdapter extends JdbcAdapter {
}
@Override
- public void bindParameter(PreparedStatement statement, ParameterBinding binding)
- throws SQLException, Exception {
+ public void bindParameter(PreparedStatement statement, ParameterBinding binding) throws Exception {
// Sybase driver doesn't like CLOBs and BLOBs as parameters
if (binding.getValue() == null) {
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlserver/SQLServerTreeProcessor.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/sybase/SybaseSQLTreeProcessor.java
similarity index 90%
copy from cayenne-server/src/main/java/org/apache/cayenne/dba/sqlserver/SQLServerTreeProcessor.java
copy to cayenne-server/src/main/java/org/apache/cayenne/dba/sybase/SybaseSQLTreeProcessor.java
index 2681a53..8393298 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlserver/SQLServerTreeProcessor.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/sybase/SybaseSQLTreeProcessor.java
@@ -17,7 +17,7 @@
* under the License.
****************************************************************/
-package org.apache.cayenne.dba.sqlserver;
+package org.apache.cayenne.dba.sybase;
import org.apache.cayenne.access.sqlbuilder.sqltree.ColumnNode;
import org.apache.cayenne.access.sqlbuilder.sqltree.EmptyNode;
@@ -34,7 +34,7 @@ import org.apache.cayenne.dba.sqlserver.sqltree.SQLServerColumnNode;
/**
* @since 4.2
*/
-public class SQLServerTreeProcessor extends BaseSQLTreeProcessor {
+public class SybaseSQLTreeProcessor extends BaseSQLTreeProcessor {
@Override
protected void onLimitOffsetNode(Node parent, LimitOffsetNode child, int index) {
@@ -110,12 +110,16 @@ public class SQLServerTreeProcessor extends BaseSQLTreeProcessor {
case "MINUTE":
case "SECOND":
replacement = new FunctionNode("DATEPART", child.getAlias(), true);
- if("DAY_OF_MONTH".equals(functionName)) {
- functionName = "DAY";
- } else if("DAY_OF_WEEK".equals(functionName)) {
- functionName = "WEEKDAY";
- } else if("DAY_OF_YEAR".equals(functionName)) {
- functionName = "DAYOFYEAR";
+ switch (functionName) {
+ case "DAY_OF_MONTH":
+ functionName = "DAY";
+ break;
+ case "DAY_OF_WEEK":
+ functionName = "WEEKDAY";
+ break;
+ case "DAY_OF_YEAR":
+ functionName = "DAYOFYEAR";
+ break;
}
replacement.addChild(new TextNode(functionName));
break;
@@ -125,4 +129,5 @@ public class SQLServerTreeProcessor extends BaseSQLTreeProcessor {
replaceChild(parent, index, replacement);
}
}
+
}