package com.idega.data.query;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.Vector;
import com.idega.data.IDOEntity;
import com.idega.data.query.output.Output;
/**
* @author <a href="joe@truemesh.com">Joe Walnes </a>
*/
public class InCriteria extends Criteria implements PlaceHolder {
private Column column;
private String value;
private SelectQuery subSelect;
private boolean notInCr = false;
public InCriteria(Column column, Collection values) {
this.column = column;
StringBuffer v = new StringBuffer();
Iterator i = values.iterator();
boolean hasNext = i.hasNext();
while (hasNext) {
Object curr = i.next();
hasNext = i.hasNext();
if (curr instanceof Number) {
v.append(curr);
}
else if (curr instanceof IDOEntity) {
Object primaryKey = ((IDOEntity) curr).getPrimaryKey();
if (primaryKey instanceof Number) {
v.append(primaryKey.toString());
}
else {
v.append(quote(primaryKey.toString()));
}
}
else {
v.append(quote(curr.toString()));
}
if (hasNext) {
v.append(',');
}
}
this.value = v.toString();
}
public InCriteria(Column column, Object[] values) {
this.column = column;
StringBuffer v = new StringBuffer();
for (int i = 0; i < values.length; i++) {
Object value = values[i];
if (value instanceof Number) {
v.append(value);
}
else if (value instanceof IDOEntity) {
Object primaryKey = ((IDOEntity) value).getPrimaryKey();
if (primaryKey instanceof Number) {
v.append(primaryKey.toString());
}
else {
v.append(quote(primaryKey.toString()));
}
}
else {
v.append(quote(value.toString()));
}
if (i < values.length - 1) {
v.append(',');
}
}
this.value = v.toString();
}
public InCriteria(Column column, String[] values) {
this.column = column;
StringBuffer v = new StringBuffer();
for (int i = 0; i < values.length; i++) {
v.append(quote(values[i]));
if (i < values.length - 1) {
v.append(',');
}
}
this.value = v.toString();
}
public InCriteria(Column column, int[] values) {
this.column = column;
StringBuffer v = new StringBuffer();
for (int i = 0; i < values.length; i++) {
v.append(values[i]);
if (i < values.length - 1) {
v.append(',');
}
}
this.value = v.toString();
}
public InCriteria(Column column, float[] values) {
this.column = column;
StringBuffer v = new StringBuffer();
for (int i = 0; i < values.length; i++) {
v.append(values[i]);
if (i < values.length - 1) {
v.append(',');
}
}
this.value = v.toString();
}
public InCriteria(Column column, SelectQuery subSelect) {
this.column = column;
this.subSelect = subSelect;
}
public InCriteria(Column column, String subSelect) {
this.column = column;
this.value = subSelect;
}
public InCriteria(Table table, String columnname, Collection values) {
this(table.getColumn(columnname), values);
}
public InCriteria(Table table, String columnname, float[] values) {
this(table.getColumn(columnname), values);
}
public InCriteria(Table table, String columnname, int[] values) {
this(table.getColumn(columnname), values);
}
public InCriteria(Table table, String columnname, SelectQuery subSelect) {
this(table.getColumn(columnname), subSelect);
}
public InCriteria(Table table, String columnname, String subSelect) {
this(table.getColumn(columnname), subSelect);
}
public InCriteria(Table table, String columnname, Object[] values) {
this(table.getColumn(columnname), values);
}
public InCriteria(Table table, String columnname, String[] values) {
this(table.getColumn(columnname), values);
}
// /////////
public InCriteria(Column column, Collection values, boolean notIn) {
this(column, values);
setAsNotInCriteria(notIn);
}
public InCriteria(Column column, String[] values, boolean notIn) {
this(column, values);
setAsNotInCriteria(notIn);
}
public InCriteria(Column column, int[] values, boolean notIn) {
this(column, values);
setAsNotInCriteria(notIn);
}
public InCriteria(Column column, float[] values, boolean notIn) {
this(column, values);
setAsNotInCriteria(notIn);
}
public InCriteria(Column column, SelectQuery subSelect, boolean notIn) {
this(column, subSelect);
setAsNotInCriteria(notIn);
}
public InCriteria(Column column, String subSelect, boolean notIn) {
this(column, subSelect);
setAsNotInCriteria(notIn);
}
public InCriteria(Table table, String columnname, Collection values, boolean notIn) {
this(table, columnname, values);
setAsNotInCriteria(notIn);
}
public InCriteria(Table table, String columnname, float[] values, boolean notIn) {
this(table, columnname, values);
setAsNotInCriteria(notIn);
}
public InCriteria(Table table, String columnname, int[] values, boolean notIn) {
this(table, columnname, values);
setAsNotInCriteria(notIn);
}
public InCriteria(Table table, String columnname, SelectQuery subSelect, boolean notIn) {
this(table, columnname, subSelect);
setAsNotInCriteria(notIn);
}
public InCriteria(Table table, String columnname, String subSelect, boolean notIn) {
this(table, columnname, subSelect);
setAsNotInCriteria(notIn);
}
public InCriteria(Table table, String columnname, Object[] values, boolean notIn) {
this(table, columnname, values);
setAsNotInCriteria(notIn);
}
public InCriteria(Table table, String columnname, String[] values, boolean notIn) {
this(table, columnname, values);
setAsNotInCriteria(notIn);
}
// ////////
public void setAsNotInCriteria(boolean value) {
this.notInCr = value;
}
public void setAsNotInCriteria() {
setAsNotInCriteria(true);
}
public Column getColumn() {
return this.column;
}
public void write(Output out) {
out.print(this.column);
if (this.notInCr) {
out.println(" NOT IN (");
}
else {
out.println(" IN (");
}
out.indent();
if (this.subSelect != null) {
this.subSelect.write(out);
}
else {
out.print(this.value);
}
out.unindent();
out.println();
out.print(")");
}
public Set getTables() {
Set s = new HashSet();
s.add(this.column.getTable());
return s;
}
public List getValues() {
Vector l = new Vector();
if (this.subSelect != null) {
l.addAll(this.subSelect.getValues());
}
return l;
}
public Object clone(){
InCriteria obj = (InCriteria)super.clone();
if(this.column!=null){
obj.column = (Column) this.column.clone();
}
if(this.subSelect!=null){
obj.subSelect = (SelectQuery) this.subSelect.clone();
}
return obj;
}
}