001/* 002 * JKNIV, whinstone one contract to access your database. 003 * 004 * Copyright (C) 2017, the original author or authors. 005 * 006 * This library is free software; you can redistribute it and/or 007 * modify it under the terms of the GNU Lesser General Public 008 * License as published by the Free Software Foundation; either 009 * version 2.1 of the License. 010 * 011 * This library is distributed in the hope that it will be useful, 012 * but WITHOUT ANY WARRANTY; without even the implied warranty of 013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 014 * Lesser General Public License for more details. 015 * 016 * You should have received a copy of the GNU Lesser General Public 017 * License along with this library; if not, write to the Free Software Foundation, Inc., 018 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 019 */ 020package net.sf.jkniv.whinstone.jpa2.dialect; 021 022import net.sf.jkniv.sqlegance.dialect.AnsiDialect; 023import net.sf.jkniv.sqlegance.dialect.SqlFeatureFactory; 024import net.sf.jkniv.sqlegance.dialect.SqlFeatureSupport; 025 026/** 027 * Dialect to JPA 028 * 029 * <p> 030 * Limit clause: 031 * <code>select name from author LIMIT 1 </code> 032 * </p> 033 * 034 * <ul> 035 * <li>Supports limits? true</li> 036 * <li>Supports limit off set? true</li> 037 * <li>Supports rownum? false</li> 038 * </ul> 039 * 040 * 041 * @author Alisson Gomes 042 * @since 0.6.0 043 */ 044public class JpaDialect extends AnsiDialect 045{ 046 public JpaDialect() 047 { 048 super(); 049 addFeature(SqlFeatureFactory.newInstance(SqlFeatureSupport.LIMIT, true)); 050 addFeature(SqlFeatureFactory.newInstance(SqlFeatureSupport.LIMIT_OFF_SET, true)); 051 addFeature(SqlFeatureFactory.newInstance(SqlFeatureSupport.CONN_HOLDABILITY, false)); 052 addFeature(SqlFeatureFactory.newInstance(SqlFeatureSupport.BOOKMARK_QUERY, false)); 053 addFeature(SqlFeatureFactory.newInstance(SqlFeatureSupport.PAGING_ROUNDTRIP, false)); 054 } 055 056 @Override 057 public String buildQueryPaging(final String sqlText, int offset, int max) 058 { 059 return sqlText; 060 } 061 062 @Override 063 public String buildQueryPaging(final String sqlText, int offset, int max, String bookmark) 064 { 065 return sqlText; 066 } 067 068 069 /* 070 * LIMIT clause for Cassandra, where LIMIT is parameter from String.format 071 * 072 * @return Return query pattern: 073 * <p> 074 * <code>select name from author LIMIT 1</code> 075 * 076 * 077 @Override 078 public String getSqlPatternPaging() 079 { 080 return "%1$s LIMIT %2$s"; 081 } 082 */ 083 084 /* 085 @Override 086 public String getSqlPatternCount() 087 { 088 // using String.format argument index 089 return "select count(1) from (%1$s) jkniv_ct_tmp_table";// TODO BUG when conflict alias name 090 } 091 092 private Query getQueryForPaging(SqlContext sqlContext, Queryable queryable, Sql isql) 093 { 094 Query queryJpa = null; 095 Sql sqlCount = null; 096 try 097 { 098 String queryName = queryable.getName() + "#count"; 099 sqlCount = sqlContext.getQuery(queryName); 100 LOG.trace("creating count query [{}] for {}", queryName, queryable.getName()); 101 Queryable queryCopy = QueryFactory.of(queryName, queryable.getParams(), 0, Integer.MAX_VALUE); 102 queryJpa = QueryJpaFactory.newQuery(sqlCount, emFactory.createEntityManager(), queryCopy); 103 } 104 catch (QueryNotFoundException e) 105 { 106 // but its very important remove the order clause, because cannot 107 // execute this way wrapping with "select count(*) ... where exists" and performance 108 String sqlWithoutOrderBy = removeOrderBy(isql.getSql(queryable.getParams())); 109 //String entityName = genericType.getSimpleName(); 110 String sql = "select count (*) from " + isql.getReturnType() + " where exists (" + sqlWithoutOrderBy + ")"; 111 LOG.trace("creating counttry to count rows using dynamically query [" + sql + "]"); 112 Queryable queryCopy = QueryFactory.of(queryable.getName(), queryable.getParams(), 0, 113 Integer.MAX_VALUE); 114 queryJpa = newQueryForCount(sql, isql.getLanguageType(), em, queryCopy, 115 isql.getParamParser()); 116 } 117 return queryJpa; 118 } 119 */ 120 121}