package fr.lteconsulting.hexa.server.qpath.list; import java.util.ArrayList; import java.util.List; import fr.lteconsulting.hexa.server.qpath.DatabaseHelper; import fr.lteconsulting.hexa.server.qpath.DatabaseHelper.FieldsMap; import fr.lteconsulting.hexa.server.qpath.QPath; import fr.lteconsulting.hexa.server.qpath.QPathResult.QPathResultRow; import fr.lteconsulting.hexa.shared.data.ListDTO; public class ListDBManager<T extends ListDTO> { private QPath qpath;// = Server.inst().qpath(); private DatabaseHelper dbh;// = Server.inst().dbh(); private Class<T> clazz; private String table; private String groupingField; public ListDBManager( String targetTable, String groupingField, Class<T> targetClass, QPath qpath, DatabaseHelper dbh ) { this.table = targetTable; this.groupingField = groupingField; this.clazz = targetClass; this.qpath = qpath; this.dbh = dbh; } // query to select all the elements of the list private String baseQuery( int groupingFieldValue ) { return table + " [" + groupingField + "=" + groupingFieldValue + "]"; } public List<T> get( int groupingFieldValue ) { Iterable<T> result = qpath.queryExDTO( clazz, baseQuery( groupingFieldValue ) ); List<T> list = new ArrayList<T>(); for( T item : result ) list.add( item ); // TODO : sort according before_id and after_id return list; } // adds at the end public T add( T item, int groupingFieldValue ) { if( item == null ) { System.out.println( "ERROR in ListDBManager.add, item is null" ); return null; } // how many in that list ? // Long count = qpath.queryOne( "F[count(*) as 'count'] ? " + baseQuery( // groupingFieldValue ) ).get( "count" ); QPathResultRow row = qpath.queryOne( "F[" + table + ".id as 'id'] ? " + baseQuery( groupingFieldValue ) ); // last in the list T last; if( row != null ) // count > 0 ) last = qpath.queryOneDTO( clazz, baseQuery( groupingFieldValue ) + " [after_id=-1]" ); else last = null; // add the new item item.setBeforeId( last != null ? last.getId() : -1 ); item.setAfterId( -1 ); item = dbh.insert( table, clazz, item, FieldsMap.create().p( groupingField, groupingFieldValue ) ); // update the last if( last != null ) dbh.update( table, "id=" + last.getId(), FieldsMap.create().p( "after_id", item.getId() ) ); return item; } }