/*
* $Id$
*
* Copyright 2008 Glencoe Software, Inc. All rights reserved.
* Use is subject to license terms supplied in LICENSE.txt
*/
package ome.services.search;
import java.util.List;
import ome.model.IObject;
import ome.system.ServiceFactory;
import org.hibernate.Session;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
/**
* Complement {@link SearchAction} which combines two other search actions into
* one logical unit, e.g.
*
* <pre>
* A - B
* </pre>
*
* @author Josh Moore, josh at glencoesoftware.com
* @since 3.0-Beta3
* @see ome.api.Search#and()
*/
public class Complement extends SearchAction {
private static final long serialVersionUID = 1L;
private final SearchAction a;
private final SearchAction b;
public Complement(SearchValues values, SearchAction a, SearchAction b) {
super(values);
Assert.notNull(a);
Assert.notNull(b);
this.a = a;
this.b = b;
}
@Transactional(readOnly = true)
public Object doWork(Session session, ServiceFactory sf) {
List<IObject> rvA;
List<IObject> rvB;
rvA = (List<IObject>) a.doWork(session, sf);
b.chainedSearch(rvA);
rvB = (List<IObject>) b.doWork(session, sf);
rvA.removeAll(rvB);
return rvA;
}
}