package org.tmatesoft.svn.core.internal.wc17.db.statement;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.internal.db.SVNSqlJetDb;
import org.tmatesoft.svn.core.internal.db.SVNSqlJetDeleteStatement;
import org.tmatesoft.svn.core.internal.db.SVNSqlJetSelectStatement;
import org.tmatesoft.svn.core.internal.wc17.db.ISVNWCDb;
import org.tmatesoft.svn.core.internal.wc17.db.SvnWcDbStatementUtil;
import java.util.EnumSet;
/**
* DELETE FROM actual_node
* WHERE wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
* AND EXISTS(SELECT 1 FROM NODES b
* WHERE b.wc_id = ?1
* AND b.local_relpath = actual_node.local_relpath
* AND op_depth = 0)
* AND NOT EXISTS(SELECT 1 FROM NODES w
* WHERE w.wc_id = ?1
* AND w.local_relpath = actual_node.local_relpath
* AND op_depth > 0
* AND presence in (MAP_NORMAL, MAP_INCOMPLETE, MAP_NOT_PRESENT))
* @author TMate Software Ltd.
*/
public class SVNWCDbDeleteActualForBaseRecursive extends SVNSqlJetDeleteStatement {
private SVNWCDbNodesStrictOpDepth strictOpDepthSelect;
private SelectFromNodesForPresence selectFromNodesForPresence;
public SVNWCDbDeleteActualForBaseRecursive(SVNSqlJetDb sDb) throws SVNException {
super(sDb, SVNWCDbSchema.ACTUAL_NODE);
strictOpDepthSelect = new SVNWCDbNodesStrictOpDepth(sDb, 0);
selectFromNodesForPresence = new SelectFromNodesForPresence(sDb, 1,
EnumSet.of(ISVNWCDb.SVNWCDbStatus.Normal, ISVNWCDb.SVNWCDbStatus.Incomplete, ISVNWCDb.SVNWCDbStatus.NotPresent));
}
@Override
protected Object[] getWhere() throws SVNException {
return new Object[] {getBind(1)};
}
@Override
protected boolean isFilterPassed() throws SVNException {
return strictOpDepthSelect.existsOpDepth((Long)getBind(1), getColumnString(SVNWCDbSchema.ACTUAL_NODE__Fields.local_relpath)) &&
!selectFromNodesForPresence.existsOpDepth((Long)getBind(1), getColumnString(SVNWCDbSchema.ACTUAL_NODE__Fields.local_relpath));
}
@Override
protected String getPathScope() {
return getBind(2).toString();
}
@Override
protected boolean isStrictiDescendant() {
return true;
}
private static class SelectFromNodesForPresence extends SVNSqlJetSelectStatement {
private long minOpDepth;
private EnumSet<ISVNWCDb.SVNWCDbStatus> presence;
public SelectFromNodesForPresence(SVNSqlJetDb sDb, long minOpDepth, EnumSet<ISVNWCDb.SVNWCDbStatus> presence) throws SVNException {
super(sDb, SVNWCDbSchema.NODES);
this.minOpDepth = minOpDepth;
this.presence = presence;
}
@Override
protected boolean isFilterPassed() throws SVNException {
return getColumnLong(SVNWCDbSchema.NODES__Fields.op_depth) >= minOpDepth &&
presence.contains(SvnWcDbStatementUtil.getColumnPresence(this, SVNWCDbSchema.NODES__Fields.presence));
}
public boolean existsOpDepth(Long wcId, String localRelpath) throws SVNException {
try {
bindLong(1, wcId);
bindString(2, localRelpath);
return next();
} finally {
reset();
}
}
}
}