JAVA   50

SQL92 implements Vendor

Guest on 11th May 2022 04:50:30 PM

  1. package de.fuberlin.wiwiss.d2rq.sql.vendor;
  2.  
  3. import java.sql.Connection;
  4. import java.sql.SQLException;
  5. import java.sql.Types;
  6. import java.util.Properties;
  7. import java.util.regex.Pattern;
  8.  
  9. import de.fuberlin.wiwiss.d2rq.algebra.Attribute;
  10. import de.fuberlin.wiwiss.d2rq.algebra.RelationName;
  11. import de.fuberlin.wiwiss.d2rq.expr.Expression;
  12. import de.fuberlin.wiwiss.d2rq.map.Database;
  13. import de.fuberlin.wiwiss.d2rq.sql.Quoter;
  14. import de.fuberlin.wiwiss.d2rq.sql.Quoter.PatternDoublingQuoter;
  15. import de.fuberlin.wiwiss.d2rq.sql.types.DataType;
  16. import de.fuberlin.wiwiss.d2rq.sql.types.SQLApproximateNumeric;
  17. import de.fuberlin.wiwiss.d2rq.sql.types.SQLBinary;
  18. import de.fuberlin.wiwiss.d2rq.sql.types.SQLBit;
  19. import de.fuberlin.wiwiss.d2rq.sql.types.SQLBoolean;
  20. import de.fuberlin.wiwiss.d2rq.sql.types.SQLCharacterString;
  21. import de.fuberlin.wiwiss.d2rq.sql.types.SQLDate;
  22. import de.fuberlin.wiwiss.d2rq.sql.types.SQLExactNumeric;
  23. import de.fuberlin.wiwiss.d2rq.sql.types.SQLTime;
  24. import de.fuberlin.wiwiss.d2rq.sql.types.SQLTimestamp;
  25. import de.fuberlin.wiwiss.d2rq.sql.types.UnsupportedDataType;
  26.  
  27. /**
  28.  * This base class implements SQL-92 compatible syntax. Subclasses
  29.  * can override individual methods to implement different syntax.
  30.  *
  31.  * @author Richard Cyganiak
  32.  */
  33. public class SQL92 implements Vendor {
  34.         private boolean useAS;
  35.        
  36.         /**
  37.          * Initializes a new instance.
  38.          *
  39.          * @param useAS Use "Table AS Alias" or "Table Alias" in FROM clauses? In standard SQL, either is fine.
  40.          */
  41.         public SQL92(boolean useAS) {
  42.                 this.useAS = useAS;
  43.         }
  44.        
  45.         public String getConcatenationExpression(String[] sqlFragments) {
  46.                 StringBuffer result = new StringBuffer();
  47.                 for (int i = 0; i < sqlFragments.length; i++) {
  48.                         if (i > 0) {
  49.                                 result.append(" || ");
  50.                         }
  51.                         result.append(sqlFragments[i]);
  52.                 }
  53.                 return result.toString();
  54.         }
  55.  
  56.         public String getRelationNameAliasExpression(RelationName relationName,
  57.                         RelationName aliasName) {
  58.                 return quoteRelationName(relationName) + (useAS ? " AS " : " ") + quoteRelationName(aliasName);
  59.         }
  60.        
  61.         public String quoteAttribute(Attribute attribute) {
  62.                 return quoteRelationName(attribute.relationName()) + "." +
  63.                                 quoteIdentifier(attribute.attributeName());
  64.         }
  65.        
  66.         public String quoteRelationName(RelationName relationName) {
  67.                 if (relationName.schemaName() == null) {
  68.                         return quoteIdentifier(relationName.tableName());
  69.                 }
  70.                 return quoteIdentifier(relationName.schemaName()) + "." + quoteIdentifier(relationName.tableName());
  71.         }
  72.        
  73.         public String quoteIdentifier(String identifier) {
  74.                 return doubleQuoteEscaper.quote(identifier);
  75.         }
  76.         private final static Quoter doubleQuoteEscaper =
  77.                 new PatternDoublingQuoter(Pattern.compile("(\")"), "\"");
  78.  
  79.         public String quoteStringLiteral(String s) {
  80.                 return singleQuoteEscaper.quote(s);
  81.         }
  82.         private final static Quoter singleQuoteEscaper =
  83.                 new PatternDoublingQuoter(Pattern.compile("(')"), "'");
  84.  
  85.         public String quoteBinaryLiteral(String hexString) {
  86.                 return "X" + quoteStringLiteral(hexString);
  87.         }
  88.        
  89.         public String quoteDateLiteral(String date) {
  90.                 return "DATE " + quoteStringLiteral(date);
  91.         }
  92.        
  93.         public String quoteTimeLiteral(String time) {
  94.                 return "TIME " + quoteStringLiteral(time);
  95.         }
  96.        
  97.         public String quoteTimestampLiteral(String timestamp) {
  98.                 return "TIMESTAMP " + quoteStringLiteral(timestamp);
  99.         }
  100.  
  101.         public Expression getRowNumLimitAsExpression(int limit) {
  102.                 return Expression.TRUE;
  103.         }
  104.  
  105.         /**
  106.          * Technically speaking, SQL 92 supports NO way of limiting
  107.          * result sets (ROW_NUMBER appeared in SQL 2003). We will
  108.          * just use MySQL's LIMIT as it appears to be widely implemented.
  109.          */
  110.         public String getRowNumLimitAsQueryAppendage(int limit) {
  111.                 if (limit == Database.NO_LIMIT) return "";
  112.                 return "LIMIT " + limit;
  113.         }
  114.  
  115.         public String getRowNumLimitAsSelectModifier(int limit) {
  116.                 return "";
  117.         }
  118.  
  119.         public Properties getDefaultConnectionProperties() {
  120.                 return new Properties();
  121.         }
  122.        
  123.         public DataType getDataType(int jdbcType, String name, int size) {
  124.                 // TODO: These are in java.sql.Types as of Java 6 but not yet in Java 1.5
  125.                 if ("NCHAR".equals(name) || "NVARCHAR".equals(name) || "NCLOB".equals(name)) {
  126.                         return new SQLCharacterString(this, name, true);
  127.                 }
  128.  
  129.                
  130.                 switch (jdbcType) {
  131.                 case Types.CHAR:
  132.                 case Types.VARCHAR:
  133.                 case Types.LONGVARCHAR:
  134.                 case Types.CLOB:
  135.                         return new SQLCharacterString(this, name, true);
  136.                        
  137.                 case Types.BOOLEAN:
  138.                         return new SQLBoolean(this, name);
  139.  
  140.                 case Types.BINARY:
  141.                 case Types.VARBINARY:
  142.                 case Types.LONGVARBINARY:
  143.                 case Types.BLOB:
  144.                         return new SQLBinary(this, name, true);
  145.                        
  146.                 case Types.BIT:
  147.                         return new SQLBit(this, name);
  148.  
  149.                 case Types.NUMERIC:
  150.                 case Types.DECIMAL:
  151.                 case Types.TINYINT:
  152.                 case Types.SMALLINT:
  153.                 case Types.INTEGER:
  154.                 case Types.BIGINT:
  155.                         return new SQLExactNumeric(this, name, jdbcType, false);
  156.                        
  157.                 case Types.REAL:
  158.                 case Types.FLOAT:
  159.                 case Types.DOUBLE:
  160.                         return new SQLApproximateNumeric(this, name);
  161.                
  162.                 case Types.DATE:
  163.                         return new SQLDate(this, name);
  164.                        
  165.                 case Types.TIME:
  166.                         return new SQLTime(this, name);
  167.                        
  168.                 case Types.TIMESTAMP:
  169.                         return new SQLTimestamp(this, name);
  170.  
  171.                 case Types.ARRAY:
  172.                 case Types.JAVA_OBJECT:
  173.                         return new UnsupportedDataType(jdbcType, name);
  174.                        
  175.                 // TODO: What about the remaining java.sql.Types?
  176.                 case Types.DATALINK:
  177.                 case Types.DISTINCT:
  178.                 case Types.NULL:
  179.                 case Types.OTHER:
  180.                 case Types.REF:
  181.                 }
  182.                
  183.                 return null;
  184.         }
  185.  
  186.         /**
  187.          * In most databases, we don't have to do anything because boolean
  188.          * expressions are allowed anywhere.
  189.          */
  190.         public Expression booleanExpressionToSimpleExpression(Expression expression) {
  191.                 return expression;
  192.         }
  193.        
  194.         public boolean isIgnoredTable(String schema, String table) {
  195.                 return false;
  196.         }
  197.  
  198.         public void initializeConnection(Connection connection) throws SQLException {
  199.                 // Do nothing for standard SQL 92. Subclasses can override.
  200.         }
  201. }

Raw Paste


Login or Register to edit or fork this paste. It's free.