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}