/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.framework.hibernate.support; import java.util.ArrayList; import java.util.Collection; import java.util.List; public abstract class InClauseBuilder<T> { private int maxValuesPrInClause = 500; private String columnName; private Collection<T> values; private int index = 0; public InClauseBuilder( String columnName, Collection<T> values ) { this.columnName = columnName; this.values = values; } public void setMaxValuesPrInClause( int value ) { this.maxValuesPrInClause = value; } public void appendTo( final StringBuffer sql ) { if ( values == null || values.size() == 0 ) { return; } sql.append( "(" ); int i = 0; int size = values.size(); boolean firstInClause = true; for ( T value : values ) { boolean newInClause = i == 0 || ( i % maxValuesPrInClause ) == 0; if ( newInClause ) { if ( !firstInClause ) { sql.append( ") OR " ); } sql.append( columnName ).append( " IN (" ); firstInClause = false; } if ( !newInClause ) { sql.append( "," ); } appendValue( sql, value ); if ( i == size - 1 ) { sql.append( ")" ); } i++; index = i; } sql.append( ")" ); } public abstract void appendValue( final StringBuffer sql, final T value ); public int getIndex() { return index; } public String toString() { StringBuffer str = new StringBuffer(); appendTo( str ); return str.toString(); } public static void buildAndAppendTemplateInClause( StringBuffer sql, String columnName, int count ) { List<String> values = new ArrayList<String>( count ); for ( int i = 1; i <= count; i++ ) { values.add( "?" ); } InClauseBuilder inclause = new InClauseBuilder<String>( columnName, values ) { public void appendValue( StringBuffer sql, String value ) { sql.append( "?" ); } }; inclause.appendTo( sql ); } }