DeletionBuilder.java

package net.zer0bandwidth.android.lib.database.querybuilder;

import android.database.sqlite.SQLiteDatabase;
import android.util.Log;

import static net.zer0bandwidth.android.lib.database.SQLiteSyntax.DELETE_ALL;
import static net.zer0bandwidth.android.lib.database.SQLiteSyntax.DELETE_FAILED;
import static net.zer0bandwidth.android.lib.database.SQLiteSyntax.SQL_DELETE_FROM;
import static net.zer0bandwidth.android.lib.database.SQLiteSyntax.SQL_WHERE;

/**
 * Builds a SQLite {@code DELETE} query.
 *
 * <h3>Examples</h3>
 *
 * Delete all records from a table:
 *
 * <pre>
 * int nDeleted = QueryBuilder.deleteFrom( sTableName )
 *     .deleteAll()
 *     .executeOn( db )
 *     ;
 * </pre>
 *
 * Delete select records from a table:
 *
 * <pre>
 * int nDeleted = QueryBuilder.deleteFrom( sTableName )
 *     .where( "active=? OR last_active_ts<=?",
 *         QueryBuilder.WHERE_FALSE, TimeUtils.now() - 86400 )
 *     .executeOn( db )
 *     ;
 * </pre>
 *
 * @since zer0bandwidth-net/android 0.1.1 (#20)
 * @see SQLiteDatabase#delete(String, String, String[])
 */
public class DeletionBuilder
extends QueryBuilder<DeletionBuilder,Integer>
{
	protected static final String LOG_TAG =
			DeletionBuilder.class.getSimpleName() ;

	public DeletionBuilder( String sTableName )
	{ super( sTableName ) ; }

	/**
	 * Convenience grammar specifying that all rows should be deleted.
	 * @return (fluid)
	 */
	public DeletionBuilder deleteAll()
	{ return this.where( DELETE_ALL ) ; }

	/**
	 * Deletes rows based on the builder's {@code WHERE} clause.
	 * @param db the database instance on which the query should be executed.
	 * @return the number of rows deleted, or
	 *  {@link net.zer0bandwidth.android.lib.database.SQLiteSyntax#DELETE_FAILED}
	 *  if the operation fails
	 */
	@Override
	public Integer executeOn( SQLiteDatabase db )
	{
		try
		{
			return db.delete(
					m_sTableName,
					this.getWhereFormat(),
					this.getWhereParams()
				);
		}
		catch( Exception x )
		{
			Log.e( LOG_TAG, "Deletion query failed:", x ) ;
			return DELETE_FAILED ;
		}
	}

	/**
	 * Constructs a raw SQL {@code DELETE} query based on the attributes of the
	 * builder instance
	 * @return a raw SQLite {@code DELETE} query
	 */
	@Override
	public String toString()
	{
		StringBuilder sb = new StringBuilder() ;
		sb.append( SQL_DELETE_FROM ).append( m_sTableName ) ;
		final String sWhere = this.getWhereClause() ;
		if( sWhere != null )
			sb.append( SQL_WHERE ).append( sWhere ) ;
		sb.append( " ;" ) ;
		return sb.toString() ;
	}
}