
org.lealone.sql.expression.aggregate.ACount Maven / Gradle / Ivy
/*
* Copyright Lealone Database Group.
* Licensed under the Server Side Public License, v 1.
* Initial Developer: zhh
*/
package org.lealone.sql.expression.aggregate;
import org.lealone.db.session.ServerSession;
import org.lealone.db.util.ValueHashMap;
import org.lealone.db.value.Value;
import org.lealone.db.value.ValueLong;
import org.lealone.db.value.ValueNull;
import org.lealone.sql.expression.Expression;
import org.lealone.sql.query.Select;
// COUNT(x)
public class ACount extends BuiltInAggregate {
public ACount(int type, Expression on, Select select, boolean distinct) {
super(type, on, select, distinct);
}
@Override
public Expression optimize(ServerSession session) {
super.optimize(session);
dataType = Value.LONG;
scale = 0;
precision = ValueLong.PRECISION;
displaySize = ValueLong.DISPLAY_SIZE;
return this;
}
@Override
protected AggregateData createAggregateData() {
return new AggregateDataCount();
}
@Override
public String getSQL() {
return getSQL("COUNT");
}
public class AggregateDataCount extends AggregateData {
private long count;
private ValueHashMap distinctValues;
public long getCount() {
return count;
}
public void setCount(long count) {
this.count = count;
}
public ValueHashMap getDistinctValues() {
return distinctValues;
}
public void setDistinctValues(ValueHashMap distinctValues) {
this.distinctValues = distinctValues;
}
public boolean isDistinct() {
return distinct;
}
@Override
public void add(ServerSession session, Value v) {
if (v == ValueNull.INSTANCE) {
return;
}
count++;
if (distinct) {
if (distinctValues == null) {
distinctValues = ValueHashMap.newInstance();
}
distinctValues.put(v, this);
}
}
@Override
Value getValue(ServerSession session) {
if (distinct) {
if (distinctValues != null) {
count = distinctValues.size();
} else {
count = 0;
}
}
return ValueLong.get(count);
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy