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 }