/* * Copyright (c) www.bugull.com * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package net.tooan.ynpay.third.mongodb.lucene.backend; import net.tooan.ynpay.third.mongodb.lucene.annotations.Compare; import net.tooan.ynpay.third.mongodb.mapper.DataType; import net.tooan.ynpay.third.mongodb.mapper.FieldUtil; import java.lang.reflect.Field; /** * @author Frank Wen(xbwen@hotmail.com) */ public class CompareChecker { private Object obj; public CompareChecker(Object obj) { this.obj = obj; } public boolean isFit(Field f, Compare compare, String value) { boolean fit = false; switch (compare) { case IS_EQUALS: fit = isEquals(f, value); break; case NOT_EQUALS: fit = notEquals(f, value); break; case GREATER_THAN: fit = greaterThan(f, value); break; case GREATER_THAN_EQUALS: fit = greaterThanEquals(f, value); break; case LESS_THAN: fit = lessThan(f, value); break; case LESS_THAN_EQUALS: fit = lessThanEquals(f, value); break; case IS_NULL: fit = isNull(FieldUtil.get(obj, f)); break; case NOT_NULL: fit = notNull(FieldUtil.get(obj, f)); break; default: break; } return fit; } private boolean isEquals(Field f, String value) { Object objValue = FieldUtil.get(obj, f); if (objValue == null) { return false; } String objStr = objValue.toString(); Class type = f.getType(); if (DataType.isString(type)) { return value.equals(objStr); } else if (DataType.isBoolean(type) || DataType.isBooleanObject(type)) { return Boolean.parseBoolean(objStr) == Boolean.parseBoolean(value); } else if (DataType.isChar(type) || DataType.isCharObject(type)) { return objStr.charAt(0) == value.charAt(0); } else if (DataType.isInteger(type) || DataType.isIntegerObject(type)) { return Integer.parseInt(objStr) == Integer.parseInt(value); } else if (DataType.isLong(type) || DataType.isLongObject(type)) { return Long.parseLong(objStr) == Long.parseLong(value); } else if (DataType.isShort(type) || DataType.isShortObject(type)) { return Short.parseShort(objStr) == Short.parseShort(value); } else if (DataType.isFloat(type) || DataType.isFloatObject(type)) { return Float.parseFloat(objStr) == Float.parseFloat(value); } else if (DataType.isDouble(type) || DataType.isDoubleObject(type)) { return Double.parseDouble(objStr) == Double.parseDouble(value); } else { return false; } } private boolean notEquals(Field f, String value) { Object objValue = FieldUtil.get(obj, f); if (objValue == null) { return false; } else { return !isEquals(f, value); } } private boolean greaterThan(Field f, String value) { Object objValue = FieldUtil.get(obj, f); if (objValue == null) { return false; } String objStr = objValue.toString(); Class type = f.getType(); if (DataType.isInteger(type) || DataType.isIntegerObject(type)) { return Integer.parseInt(objStr) > Integer.parseInt(value); } else if (DataType.isLong(type) || DataType.isLongObject(type)) { return Long.parseLong(objStr) > Long.parseLong(value); } else if (DataType.isShort(type) || DataType.isShortObject(type)) { return Short.parseShort(objStr) > Short.parseShort(value); } else if (DataType.isFloat(type) || DataType.isFloatObject(type)) { return Float.parseFloat(objStr) > Float.parseFloat(value); } else if (DataType.isDouble(type) || DataType.isDoubleObject(type)) { return Double.parseDouble(objStr) > Double.parseDouble(value); } else { return false; } } private boolean greaterThanEquals(Field f, String value) { Object objValue = FieldUtil.get(obj, f); if (objValue == null) { return false; } String objStr = objValue.toString(); Class type = f.getType(); if (DataType.isInteger(type) || DataType.isIntegerObject(type)) { return Integer.parseInt(objStr) >= Integer.parseInt(value); } else if (DataType.isLong(type) || DataType.isLongObject(type)) { return Long.parseLong(objStr) >= Long.parseLong(value); } else if (DataType.isShort(type) || DataType.isShortObject(type)) { return Short.parseShort(objStr) >= Short.parseShort(value); } else if (DataType.isFloat(type) || DataType.isFloatObject(type)) { return Float.parseFloat(objStr) >= Float.parseFloat(value); } else if (DataType.isDouble(type) || DataType.isDoubleObject(type)) { return Double.parseDouble(objStr) >= Double.parseDouble(value); } else { return false; } } private boolean lessThan(Field f, String value) { Object objValue = FieldUtil.get(obj, f); if (objValue == null) { return false; } else { return !greaterThanEquals(f, value); } } private boolean lessThanEquals(Field f, String value) { Object objValue = FieldUtil.get(obj, f); if (objValue == null) { return false; } else { return !greaterThan(f, value); } } private boolean isNull(Object objValue) { return objValue == null ? true : false; } private boolean notNull(Object objValue) { return !isNull(objValue); } }