2 * Copyright (c) 2010, 2011 Oracle and/or its affiliates. All rights reserved.
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; version 2 of the License.
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18 package com.mysql.clusterj.tie;
20 import java.math.BigDecimal;
21 import java.math.BigInteger;
22 import java.nio.ByteBuffer;
23 import java.util.Arrays;
25 import com.mysql.ndbjtie.ndbapi.NdbScanFilter;
27 import com.mysql.clusterj.ClusterJFatalInternalException;
29 import com.mysql.clusterj.core.store.Column;
30 import com.mysql.clusterj.core.store.ScanFilter;
31 import com.mysql.clusterj.core.util.I18NHelper;
32 import com.mysql.clusterj.core.util.Logger;
33 import com.mysql.clusterj.core.util.LoggerFactoryService;
38 class ScanFilterImpl implements ScanFilter {
40 /** My message translator */
41 static final I18NHelper local = I18NHelper
42 .getInstance(ScanFilterImpl.class);
45 static final Logger logger = LoggerFactoryService.getFactory()
46 .getInstance(ScanFilterImpl.class);
48 private NdbScanFilter ndbScanFilter;
50 public ScanFilterImpl(NdbScanFilter ndbScanFilter) {
51 this.ndbScanFilter = ndbScanFilter;
55 int returnCode = ndbScanFilter.begin(NdbScanFilter.Group.AND);
56 handleError(returnCode, ndbScanFilter);
59 public void begin(Group group) {
60 int returnCode = ndbScanFilter.begin(convertGroup(group));
61 handleError(returnCode, ndbScanFilter);
64 public void cmpBigInteger(BinaryCondition condition, Column storeColumn, BigInteger value) {
65 ByteBuffer buffer = Utility.convertValue(storeColumn, value);
66 int returnCode = ndbScanFilter.cmp(convertCondition(condition),
67 storeColumn.getColumnId(), buffer, buffer.capacity());
68 handleError(returnCode, ndbScanFilter);
71 public void cmpBoolean(BinaryCondition condition, Column storeColumn, boolean value) {
72 byte byteValue = (value?(byte)0x01:(byte)0x00);
73 cmpByte(condition, storeColumn, byteValue);
76 public void cmpByte(BinaryCondition condition, Column storeColumn, byte value) {
77 ByteBuffer buffer = Utility.convertValue(storeColumn, value);
78 int returnCode = ndbScanFilter.cmp(convertCondition(condition),
79 storeColumn.getColumnId(), buffer, buffer.capacity());
80 handleError(returnCode, ndbScanFilter);
83 public void cmpBytes(BinaryCondition condition, Column storeColumn, byte[] value) {
85 if (condition == BinaryCondition.COND_LIKE) {
86 buffer = Utility.convertValueForLikeFilter(storeColumn, value);
88 buffer = Utility.convertValue(storeColumn, value);
90 int returnCode = ndbScanFilter.cmp(convertCondition(condition),
91 storeColumn.getColumnId(), buffer, buffer.capacity());
92 handleError(returnCode, ndbScanFilter);
95 public void cmpDecimal(BinaryCondition condition, Column storeColumn, BigDecimal value) {
96 ByteBuffer buffer = Utility.convertValue(storeColumn, value);
97 int returnCode = ndbScanFilter.cmp(convertCondition(condition),
98 storeColumn.getColumnId(), buffer, buffer.capacity());
99 handleError(returnCode, ndbScanFilter);
102 public void cmpDouble(BinaryCondition condition, Column storeColumn, double value) {
103 ByteBuffer buffer = Utility.convertValue(storeColumn, value);
104 int returnCode = ndbScanFilter.cmp(convertCondition(condition),
105 storeColumn.getColumnId(), buffer, buffer.capacity());
106 handleError(returnCode, ndbScanFilter);
109 public void cmpFloat(BinaryCondition condition, Column storeColumn, float value) {
110 ByteBuffer buffer = Utility.convertValue(storeColumn, value);
111 int returnCode = ndbScanFilter.cmp(convertCondition(condition),
112 storeColumn.getColumnId(), buffer, buffer.capacity());
113 handleError(returnCode, ndbScanFilter);
116 public void cmpShort(BinaryCondition condition, Column storeColumn, short value) {
117 ByteBuffer buffer = Utility.convertValue(storeColumn, value);
118 int returnCode = ndbScanFilter.cmp(convertCondition(condition),
119 storeColumn.getColumnId(), buffer, buffer.capacity());
120 handleError(returnCode, ndbScanFilter);
123 public void cmpInt(BinaryCondition condition, Column storeColumn, int value) {
124 ByteBuffer buffer = Utility.convertValue(storeColumn, value);
125 int returnCode = ndbScanFilter.cmp(convertCondition(condition),
126 storeColumn.getColumnId(), buffer, buffer.capacity());
127 handleError(returnCode, ndbScanFilter);
130 public void cmpLong(BinaryCondition condition, Column storeColumn, long value) {
131 ByteBuffer buffer = Utility.convertValue(storeColumn, value);
132 if (logger.isDetailEnabled()) {
133 int bufferLength = buffer.limit() - buffer.position();
134 byte[] array = new byte[bufferLength];
137 logger.detail("column: " + storeColumn.getName() + " condition: " + condition.toString() + " value: " + value + Arrays.toString(array) + "(" + buffer.capacity() + ")");
139 int returnCode = ndbScanFilter.cmp(convertCondition(condition),
140 storeColumn.getColumnId(), buffer, buffer.capacity());
141 handleError(returnCode, ndbScanFilter);
144 public void cmpString(BinaryCondition condition, Column storeColumn, String value) {
145 if (logger.isDebugEnabled())
146 logger.debug(storeColumn.getName() + " " + condition + " " + value);
148 if (condition == BinaryCondition.COND_LIKE) {
149 buffer = Utility.convertValueForLikeFilter(storeColumn, value);
151 buffer = Utility.convertValue(storeColumn, value);
153 int returnCode = ndbScanFilter.cmp(convertCondition(condition),
154 storeColumn.getColumnId(), buffer, buffer.limit());
155 handleError(returnCode, ndbScanFilter);
158 public void isNull(Column storeColumn) {
159 int returnCode = ndbScanFilter.isnull(storeColumn.getColumnId());
160 handleError(returnCode, ndbScanFilter);
164 int returnCode = ndbScanFilter.end();
165 handleError(returnCode, ndbScanFilter);
168 private int convertCondition(BinaryCondition condition) {
171 return NdbScanFilter.BinaryCondition.COND_EQ;
173 return NdbScanFilter.BinaryCondition.COND_LE;
175 return NdbScanFilter.BinaryCondition.COND_LT;
177 return NdbScanFilter.BinaryCondition.COND_GE;
179 return NdbScanFilter.BinaryCondition.COND_GT;
181 return NdbScanFilter.BinaryCondition.COND_LIKE;
183 throw new ClusterJFatalInternalException(
184 local.message("ERR_Implementation_Should_Not_Occur"));
188 private int convertGroup(Group group) {
191 return NdbScanFilter.Group.AND;
193 return NdbScanFilter.Group.NAND;
195 return NdbScanFilter.Group.OR;
197 throw new ClusterJFatalInternalException(
198 local.message("ERR_Implementation_Should_Not_Occur"));
202 protected static void handleError(int returnCode, NdbScanFilter ndbScanFilter) {
203 if (returnCode == 0) {
206 Utility.throwError(returnCode, ndbScanFilter.getNdbError());
210 protected static void handleError(Object object, NdbScanFilter ndbScanFilter) {
211 if (object != null) {
214 Utility.throwError(null, ndbScanFilter.getNdbError());
218 public void delete() {
219 NdbScanFilter.delete(ndbScanFilter);