001    package biz.hammurapi.sql.syntax;
002    
003    import java.io.Serializable;
004    import java.sql.PreparedStatement;
005    import java.sql.SQLException;
006    import java.util.Arrays;
007    
008    import biz.hammurapi.sql.Variant;
009    
010    /**
011     * Not In
012     * @author Pavel
013     *
014     */
015    public class NotIn implements StatementFragment, Serializable {
016            
017            private static int hashCode(Object[] array) {
018                    final int prime = 31;
019                    if (array == null)
020                            return 0;
021                    int result = 1;
022                    for (int index = 0; index < array.length; index++) {
023                            result = prime * result
024                                            + (array[index] == null ? 0 : array[index].hashCode());
025                    }
026                    return result;
027            }
028    
029            private Variant[] variants;
030            private String columnName;
031            
032            public NotIn(String columnName, boolean[] values) {
033                    variants = new Variant[values.length];
034                    for (int i=0; i<values.length; ++i) {
035                            variants[i] = new Variant(values[i]);
036                    }
037                    this.columnName = columnName;
038            }
039    
040            public NotIn(String columnName, byte[] values) {
041                    variants = new Variant[values.length];
042                    for (int i=0; i<values.length; ++i) {
043                            variants[i] = new Variant(values[i]);
044                    }
045                    this.columnName = columnName;
046            }
047    
048            public NotIn(String columnName, char[] values) {
049                    variants = new Variant[values.length];
050                    for (int i=0; i<values.length; ++i) {
051                            variants[i] = new Variant(values[i]);
052                    }
053                    this.columnName = columnName;
054            }
055    
056            public NotIn(String columnName, double[] values) {
057                    variants = new Variant[values.length];
058                    for (int i=0; i<values.length; ++i) {
059                            variants[i] = new Variant(values[i]);
060                    }
061                    this.columnName = columnName;
062            }
063    
064            public NotIn(String columnName, float[] values) {
065                    variants = new Variant[values.length];
066                    for (int i=0; i<values.length; ++i) {
067                            variants[i] = new Variant(values[i]);
068                    }
069                    this.columnName = columnName;
070            }
071    
072            public NotIn(String columnName, int[] values) {
073                    variants = new Variant[values.length];
074                    for (int i=0; i<values.length; ++i) {
075                            variants[i] = new Variant(values[i]);
076                    }
077                    this.columnName = columnName;
078            }
079    
080            public NotIn(String columnName, long[] values) {
081                    variants = new Variant[values.length];
082                    for (int i=0; i<values.length; ++i) {
083                            variants[i] = new Variant(values[i]);
084                    }
085                    this.columnName = columnName;
086            }
087    
088            public NotIn(String columnName, String[] values) {
089                    variants = new Variant[values.length];
090                    for (int i=0; i<values.length; ++i) {
091                            variants[i] = new Variant(values[i]);
092                    }
093                    this.columnName = columnName;
094            }
095    
096            public NotIn(String columnName, Object[] values) {
097                    variants = new Variant[values.length];
098                    for (int i=0; i<values.length; ++i) {
099                            variants[i] = new Variant(values[i]);
100                    }
101                    this.columnName = columnName;
102            }
103    
104            public NotIn(String columnName, Object[] values, int sqlType) {
105                    variants = new Variant[values.length];
106                    for (int i=0; i<values.length; ++i) {
107                            variants[i] = new Variant(values[i]);
108                    }
109                    this.columnName = columnName;
110            }
111    
112            public NotIn(String columnName, short[] values) {
113                    variants = new Variant[values.length];
114                    for (int i=0; i<values.length; ++i) {
115                            variants[i] = new Variant(values[i]);
116                    }
117                    this.columnName = columnName;
118            }
119    
120            public String toSqlString() {
121                    StringBuffer ret = new StringBuffer(columnName);
122                    ret.append(" NOT IN (");
123                    for (int i=0; i<variants.length; ++i) {
124                            if (i>0) {
125                                    ret.append(", ");                               
126                            }
127                            ret.append("?");
128                    }
129                    ret.append(")");
130                    return ret.toString();
131            }
132    
133            public int parameterize(PreparedStatement ps, int idx) throws SQLException {
134                    for (int i=0; i<variants.length; ++i) {
135                            idx=variants[i].parameterize(ps, idx);
136                    }
137                    return idx;
138            }
139    
140            public int hashCode() {
141                    final int prime = 31;
142                    int result = 1;
143                    result = prime * result
144                                    + ((columnName == null) ? 0 : columnName.hashCode());
145                    result = prime * result + NotIn.hashCode(variants);
146                    return result;
147            }
148    
149            public boolean equals(Object obj) {
150                    if (this == obj)
151                            return true;
152                    if (obj == null)
153                            return false;
154                    if (getClass() != obj.getClass())
155                            return false;
156                    final NotIn other = (NotIn) obj;
157                    if (columnName == null) {
158                            if (other.columnName != null)
159                                    return false;
160                    } else if (!columnName.equals(other.columnName))
161                            return false;
162                    if (!Arrays.equals(variants, other.variants))
163                            return false;
164                    return true;
165            }
166    
167    }