Skip to content

Commit

Permalink
improved performance.
Browse files Browse the repository at this point in the history
  • Loading branch information
wenshao committed Aug 20, 2018
1 parent ee614b6 commit bf9a900
Show file tree
Hide file tree
Showing 6 changed files with 50 additions and 26 deletions.
30 changes: 18 additions & 12 deletions src/main/java/com/alibaba/fastjson/JSONArray.java
Expand Up @@ -302,11 +302,12 @@ public Byte getByte(int index) {
public byte getByteValue(int index) {
Object value = get(index);

if (value == null) {
Byte byteVal = castToByte(value);
if (byteVal == null) {
return 0;
}

return castToByte(value).byteValue();
return byteVal.byteValue();
}

public Short getShort(int index) {
Expand All @@ -318,11 +319,12 @@ public Short getShort(int index) {
public short getShortValue(int index) {
Object value = get(index);

if (value == null) {
Short shortVal = castToShort(value);
if (shortVal == null) {
return 0;
}

return castToShort(value).shortValue();
return shortVal.shortValue();
}

public Integer getInteger(int index) {
Expand All @@ -334,11 +336,12 @@ public Integer getInteger(int index) {
public int getIntValue(int index) {
Object value = get(index);

if (value == null) {
Integer intVal = castToInt(value);
if (intVal == null) {
return 0;
}

return castToInt(value).intValue();
return intVal.intValue();
}

public Long getLong(int index) {
Expand All @@ -350,11 +353,12 @@ public Long getLong(int index) {
public long getLongValue(int index) {
Object value = get(index);

if (value == null) {
Long longVal = castToLong(value);
if (longVal == null) {
return 0L;
}

return castToLong(value).longValue();
return longVal.longValue();
}

public Float getFloat(int index) {
Expand All @@ -366,11 +370,12 @@ public Float getFloat(int index) {
public float getFloatValue(int index) {
Object value = get(index);

if (value == null) {
Float floatValue = castToFloat(value);
if (floatValue == null) {
return 0F;
}

return castToFloat(value).floatValue();
return floatValue.floatValue();
}

public Double getDouble(int index) {
Expand All @@ -382,11 +387,12 @@ public Double getDouble(int index) {
public double getDoubleValue(int index) {
Object value = get(index);

if (value == null) {
Double doubleValue = castToDouble(value);
if (doubleValue == null) {
return 0D;
}

return castToDouble(value);
return doubleValue.doubleValue();
}

public BigDecimal getBigDecimal(int index) {
Expand Down
24 changes: 13 additions & 11 deletions src/main/java/com/alibaba/fastjson/JSONPath.java
Expand Up @@ -782,8 +782,10 @@ Object parseArrayAccessFilter(boolean acceptBracket) {
}

if (isInt(startValue.getClass()) && isInt(endValue.getClass())) {
Filter filter = new IntBetweenSegement(propertyName, ((Number) startValue).longValue(),
((Number) endValue).longValue(), not);
Filter filter = new IntBetweenSegement(propertyName
, TypeUtils.longExtractValue((Number) startValue)
, TypeUtils.longExtractValue((Number) endValue)
, not);
return filter;
}

Expand Down Expand Up @@ -864,7 +866,7 @@ Object parseArrayAccessFilter(boolean acceptBracket) {

if (isInt) {
if (valueList.size() == 1) {
long value = ((Number) valueList.get(0)).longValue();
long value = TypeUtils.longExtractValue((Number) valueList.get(0));
Operator intOp = not ? Operator.NE : Operator.EQ;
Filter filter = new IntOpSegement(propertyName, value, intOp);
while (ch == ' ') {
Expand All @@ -889,7 +891,7 @@ Object parseArrayAccessFilter(boolean acceptBracket) {

long[] values = new long[valueList.size()];
for (int i = 0; i < values.length; ++i) {
values[i] = ((Number) valueList.get(i)).longValue();
values[i] = TypeUtils.longExtractValue((Number) valueList.get(i));
}

Filter filter = new IntInSegement(propertyName, values, not);
Expand Down Expand Up @@ -971,7 +973,7 @@ Object parseArrayAccessFilter(boolean acceptBracket) {
for (int i = 0; i < values.length; ++i) {
Number item = (Number) valueList.get(i);
if (item != null) {
values[i] = item.longValue();
values[i] = TypeUtils.longExtractValue(item);
}
}

Expand Down Expand Up @@ -1847,7 +1849,7 @@ public boolean apply(JSONPath path, Object rootObject, Object currentObject, Obj
}

if (propertyValue instanceof Number) {
long longPropertyValue = ((Number) propertyValue).longValue();
long longPropertyValue = TypeUtils.longExtractValue((Number) propertyValue);
for (long value : values) {
if (value == longPropertyValue) {
return !not;
Expand Down Expand Up @@ -1883,7 +1885,7 @@ public boolean apply(JSONPath path, Object rootObject, Object currentObject, Obj
}

if (propertyValue instanceof Number) {
long longPropertyValue = ((Number) propertyValue).longValue();
long longPropertyValue = TypeUtils.longExtractValue((Number) propertyValue);
if (longPropertyValue >= startValue && longPropertyValue <= endValue) {
return !not;
}
Expand Down Expand Up @@ -1921,7 +1923,7 @@ public boolean apply(JSONPath path, Object rootObject, Object currentObject, Obj
}

if (propertyValue instanceof Number) {
long longPropertyValue = ((Number) propertyValue).longValue();
long longPropertyValue = TypeUtils.longExtractValue((Number) propertyValue);
for (Long value : values) {
if (value == null) {
continue;
Expand Down Expand Up @@ -2067,7 +2069,7 @@ public boolean apply(JSONPath path, Object rootObject, Object currentObject, Obj
return false;
}

long longValue = ((Number) propertyValue).longValue();
long longValue = TypeUtils.longExtractValue((Number) propertyValue);

switch (op) {
case EQ:
Expand Down Expand Up @@ -2547,7 +2549,7 @@ static boolean eqNotNull(Number a, Number b) {
BigDecimal decimalA = (BigDecimal) a;

if (isIntB) {
return decimalA.equals(BigDecimal.valueOf(b.longValue()));
return decimalA.equals(BigDecimal.valueOf(TypeUtils.longExtractValue(b)));
}
}

Expand All @@ -2567,7 +2569,7 @@ static boolean eqNotNull(Number a, Number b) {
if (isIntB) {
if (a instanceof BigInteger) {
BigInteger bigIntA = (BigInteger) a;
BigInteger bigIntB = BigInteger.valueOf(b.longValue());
BigInteger bigIntB = BigInteger.valueOf(TypeUtils.longExtractValue(b));

return bigIntA.equals(bigIntB);
}
Expand Down
Expand Up @@ -1420,7 +1420,7 @@ public Object parse(Object fieldName) {
lexer.nextToken(JSONToken.LPAREN);

accept(JSONToken.LPAREN);
long time = ((Number) lexer.integerValue()).longValue();
long time = lexer.integerValue().longValue();
accept(JSONToken.LITERAL_INT);

accept(JSONToken.RPAREN);
Expand Down
@@ -1,6 +1,7 @@
package com.alibaba.fastjson.parser.deserializer;

import java.lang.reflect.Type;
import java.math.BigDecimal;

import com.alibaba.fastjson.JSONException;
import com.alibaba.fastjson.parser.DefaultJSONParser;
Expand Down Expand Up @@ -47,6 +48,8 @@ public <T> T deserialze(DefaultJSONParser parser, Type clazz, Object fieldName)

if (val instanceof java.sql.Time) {
return (T) val;
} else if (val instanceof BigDecimal) {
return (T) new java.sql.Time(((BigDecimal) val).longValueExact());
} else if (val instanceof Number) {
return (T) new java.sql.Time(((Number) val).longValue());
} else if (val instanceof String) {
Expand Down
3 changes: 2 additions & 1 deletion src/main/java/com/alibaba/fastjson/util/IOUtils.java
Expand Up @@ -727,7 +727,8 @@ public static int decodeUTF8(byte[] sa, int sp, int len, char[] da) {
if (((b2 & 0xc0) != 0x80 || (b3 & 0xc0) != 0x80 || (b4 & 0xc0) != 0x80) // isMalformed4
||
// shortest form check
!Character.isSupplementaryCodePoint(uc)) {
!(uc >= 0x010000 && uc < 0X10FFFF + 1) // !Character.isSupplementaryCodePoint(uc)
) {
return -1;
} else {
da[dp++] = (char) ((uc >>> 10) + ('\uD800' - (0x010000 >>> 10))); // Character.highSurrogate(uc);
Expand Down
14 changes: 13 additions & 1 deletion src/main/java/com/alibaba/fastjson/util/TypeUtils.java
Expand Up @@ -458,6 +458,14 @@ public static java.sql.Date castToSqlDate(Object value){
return new java.sql.Date(longValue);
}

public static long longExtractValue(Number number) {
if (number instanceof BigDecimal) {
return ((BigDecimal) number).longValueExact();
}

return number.longValue();
}

public static java.sql.Time castToSqlTime(Object value){
if(value == null){
return null;
Expand All @@ -471,10 +479,14 @@ public static java.sql.Time castToSqlTime(Object value){
if(value instanceof Calendar){
return new java.sql.Time(((Calendar) value).getTimeInMillis());
}

long longValue = 0;
if(value instanceof Number){
if(value instanceof BigDecimal){
longValue = ((BigDecimal) value).longValueExact();
} else if(value instanceof Number){
longValue = ((Number) value).longValue();
}

if(value instanceof String){
String strVal = (String) value;
if(strVal.length() == 0 //
Expand Down

0 comments on commit bf9a900

Please sign in to comment.