Docjar: A Java Source and Docuemnt Enginecom.*    java.*    javax.*    org.*    all    new    plug-in

Quick Search    Search Deep

Source code: org/hsqldb/Like.java


1   /* Copyrights and Licenses
2    *
3    * This product includes Hypersonic SQL.
4    * Originally developed by Thomas Mueller and the Hypersonic SQL Group. 
5    *
6    * Copyright (c) 1995-2000 by the Hypersonic SQL Group. All rights reserved. 
7    * Redistribution and use in source and binary forms, with or without modification, are permitted
8    * provided that the following conditions are met: 
9    *     -  Redistributions of source code must retain the above copyright notice, this list of conditions
10   *         and the following disclaimer. 
11   *     -  Redistributions in binary form must reproduce the above copyright notice, this list of
12   *         conditions and the following disclaimer in the documentation and/or other materials
13   *         provided with the distribution. 
14   *     -  All advertising materials mentioning features or use of this software must display the
15   *        following acknowledgment: "This product includes Hypersonic SQL." 
16   *     -  Products derived from this software may not be called "Hypersonic SQL" nor may
17   *        "Hypersonic SQL" appear in their names without prior written permission of the
18   *         Hypersonic SQL Group. 
19   *     -  Redistributions of any form whatsoever must retain the following acknowledgment: "This
20   *          product includes Hypersonic SQL." 
21   * This software is provided "as is" and any expressed or implied warranties, including, but
22   * not limited to, the implied warranties of merchantability and fitness for a particular purpose are
23   * disclaimed. In no event shall the Hypersonic SQL Group or its contributors be liable for any
24   * direct, indirect, incidental, special, exemplary, or consequential damages (including, but
25   * not limited to, procurement of substitute goods or services; loss of use, data, or profits;
26   * or business interruption). However caused any on any theory of liability, whether in contract,
27   * strict liability, or tort (including negligence or otherwise) arising in any way out of the use of this
28   * software, even if advised of the possibility of such damage. 
29   * This software consists of voluntary contributions made by many individuals on behalf of the
30   * Hypersonic SQL Group.
31   *
32   *
33   * For work added by the HSQL Development Group:
34   *
35   * Copyright (c) 2001-2002, The HSQL Development Group
36   * All rights reserved.
37   *
38   * Redistribution and use in source and binary forms, with or without
39   * modification, are permitted provided that the following conditions are met:
40   *
41   * Redistributions of source code must retain the above copyright notice, this
42   * list of conditions and the following disclaimer, including earlier
43   * license statements (above) and comply with all above license conditions.
44   *
45   * Redistributions in binary form must reproduce the above copyright notice,
46   * this list of conditions and the following disclaimer in the documentation
47   * and/or other materials provided with the distribution, including earlier
48   * license statements (above) and comply with all above license conditions.
49   *
50   * Neither the name of the HSQL Development Group nor the names of its
51   * contributors may be used to endorse or promote products derived from this
52   * software without specific prior written permission.
53   *
54   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
55   * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
56   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
57   * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, 
58   * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 
59   * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 
60   * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
61   * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
62   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
63   * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
64   * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
65   */
66  
67  
68  package org.hsqldb;
69  
70  /**
71   * Class declaration
72   *
73   *
74   * @version 1.7.0
75   */
76  class Like {
77  
78      private char    cLike[];
79      private int[]   iType;
80      private int     iLen;
81      private boolean bIgnoreCase;
82  
83      /**
84       * Constructor declaration
85       *
86       *
87       * @param s
88       * @param escape
89       * @param ignorecase
90       */
91      Like(String s, char escape, boolean ignorecase) {
92  
93          if (ignorecase) {
94              s = s.toUpperCase();
95          }
96  
97          normalize(s, true, escape);
98  
99          bIgnoreCase = ignorecase;
100     }
101 
102     /**
103      * Method declaration
104      *
105      *
106      * @return
107      */
108     String getStartsWith() {
109 
110         StringBuffer s = new StringBuffer();
111         int          i = 0;
112 
113         for (; (i < iLen) && (iType[i] == 0); i++) {
114             s.append(cLike[i]);
115         }
116 
117         if (i == 0) {
118             return null;
119         }
120 
121         return s.toString();
122     }
123 
124     /**
125      * Method declaration
126      *
127      *
128      * @param o
129      *
130      * @return
131      */
132     boolean compare(Object o) {
133 
134         if (o == null) {
135             return iLen == 0;
136         }
137 
138         String s = o.toString();
139 
140         if (bIgnoreCase) {
141             s = s.toUpperCase();
142         }
143 
144         return compareAt(s, 0, 0, s.length());
145     }
146 
147     /**
148      * Method declaration
149      *
150      *
151      * @param s
152      * @param i
153      * @param j
154      * @param jLen
155      *
156      * @return
157      */
158     private boolean compareAt(String s, int i, int j, int jLen) {
159 
160         for (; i < iLen; i++) {
161             switch (iType[i]) {
162 
163                 case 0 :    // general character
164                     if ((j >= jLen) || (cLike[i] != s.charAt(j++))) {
165                         return false;
166                     }
167                     break;
168 
169                 case 1 :    // underscore: do not test this character
170                     if (j++ >= jLen) {
171                         return false;
172                     }
173                     break;
174 
175                 case 2 :    // percent: none or any character(s)
176                     if (++i >= iLen) {
177                         return true;
178                     }
179 
180                     while (j < jLen) {
181                         if ((cLike[i] == s.charAt(j))
182                                 && compareAt(s, i, j, jLen)) {
183                             return true;
184                         }
185 
186                         j++;
187                     }
188 
189                     return false;
190             }
191         }
192 
193         if (j != jLen) {
194             return false;
195         }
196 
197         return true;
198     }
199 
200     /**
201      * Method declaration
202      *
203      *
204      * @param s
205      * @param b
206      * @param e
207      */
208     private void normalize(String s, boolean b, char e) {
209 
210         iLen = 0;
211 
212         if (s == null) {
213             return;
214         }
215 
216         int l = s.length();
217 
218         cLike = new char[l];
219         iType = new int[l];
220 
221         boolean bEscaping = false,
222                 bPercent  = false;
223 
224         for (int i = 0; i < l; i++) {
225             char c = s.charAt(i);
226 
227             if (bEscaping == false) {
228                 if (b && (c == e)) {
229                     bEscaping = true;
230 
231                     continue;
232                 } else if (c == '_') {
233                     iType[iLen] = 1;
234                 } else if (c == '%') {
235                     if (bPercent) {
236                         continue;
237                     }
238 
239                     bPercent    = true;
240                     iType[iLen] = 2;
241                 } else {
242                     bPercent = false;
243                 }
244             } else {
245                 bPercent  = false;
246                 bEscaping = false;
247             }
248 
249             cLike[iLen++] = c;
250         }
251 
252         for (int i = 0; i < iLen - 1; i++) {
253             if ((iType[i] == 2) && (iType[i + 1] == 1)) {
254                 iType[i]     = 1;
255                 iType[i + 1] = 2;
256             }
257         }
258     }
259 }