You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@eagle.apache.org by ha...@apache.org on 2015/11/19 11:47:17 UTC
[10/55] [abbrv] [partial] incubator-eagle git commit: [EAGLE-46]
Rename package name as "org.apache.eagle"
http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/afe86834/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/ListQueryCompiler.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/ListQueryCompiler.java b/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/ListQueryCompiler.java
deleted file mode 100755
index 22e5e9f..0000000
--- a/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/ListQueryCompiler.java
+++ /dev/null
@@ -1,380 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 eagle.query;
-
-import eagle.log.entity.filter.HBaseFilterBuilder;
-import eagle.log.entity.meta.EntityDefinition;
-import eagle.log.entity.meta.EntityDefinitionManager;
-import eagle.log.expression.ExpressionParser;
-import eagle.query.aggregate.timeseries.SortOption;
-import eagle.query.aggregate.timeseries.SortOptionsParser;
-import eagle.query.parser.EagleQueryParseException;
-import eagle.query.parser.EagleQueryParser;
-import eagle.query.parser.ORExpression;
-import eagle.query.parser.TokenConstant;
-import eagle.query.aggregate.AggregateFunctionType;
-import eagle.query.aggregate.AggregateFunctionTypeMatcher;
-import org.apache.hadoop.hbase.filter.Filter;
-import org.apache.hadoop.hbase.filter.FilterList;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.*;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-public class ListQueryCompiler {
- private final static Logger LOG = LoggerFactory.getLogger(ListQueryCompiler.class);
- /**
- * syntax is <EntityName>[<Filter>]{<Projection>}
- */
- private final static String listRegex = "^([^\\[]+)\\[([^\\]]*)\\]\\{(.+)\\}$";
- private final static Pattern _listPattern = Pattern.compile(listRegex);
-
- /**
- * syntax is @<fieldname>
- */
- private final static String _fnAnyPattern = "*";
- private final static Pattern _fnPattern = TokenConstant.ID_PATTERN;
-
- /**
- * syntax is @<expression>
- */
- private final static String expRegex = "^(EXP\\{.*\\})(\\s+AS)?(\\s+.*)?$";
- private final static Pattern _expPattern = Pattern.compile(expRegex,Pattern.CASE_INSENSITIVE);
-
- /**
- * syntax is <EntityName>[<Filter>]<GroupbyFields>{<AggregateFunctions>}
- */
-
- /** The regular expression before add EXP{<Expression>} in query **/
- private final static String aggRegex = "^([^\\[]+)\\[([^\\]]*)\\]<([^>]*)>\\{(.+)\\}$";
- private final static Pattern _aggPattern = Pattern.compile(aggRegex);
-
- private final static String sortRegex = "^([^\\[]+)\\[([^\\]]*)\\]<([^>]*)>\\{(.+)\\}\\.\\{(.+)\\}$";
- private final static Pattern _sortPattern = Pattern.compile(sortRegex);
-
- private String _serviceName;
- private Filter _filter;
- private List<String> _outputFields;
- private List<String> _groupbyFields;
- private List<AggregateFunctionType> _aggregateFunctionTypes;
- private List<String> _aggregateFields;
- private List<AggregateFunctionType> _sortFunctionTypes;
- private List<String> _sortFields;
- private Map<String,String> _outputAlias;
-
- /**
- * Filed that must be required in filter
- *
- * @return
- */
- public Set<String> getFilterFields() {
- return _filterFields;
- }
-
- private Set<String> _filterFields;
- private List<SortOption> _sortOptions;
- private boolean _hasAgg;
- private List<String[]> _partitionValues;
- private boolean _filterIfMissing;
- private ORExpression _queryExpression;
- private boolean _outputAll = false;
-
- public ListQueryCompiler(String query) throws Exception {
- this(query, false);
- }
-
- public ListQueryCompiler(String query, boolean filterIfMissing) throws Exception{
- this._filterIfMissing = filterIfMissing;
- Matcher m = _listPattern.matcher(query);
- if(m.find()){
- if(m.groupCount() != 3)
- throw new IllegalArgumentException("List query syntax is <EntityName>[<Filter>]{<Projection>}");
- compileCollectionQuery(m);
- _hasAgg = false;
- partitionConstraintValidate(query);
- return;
- }
-
- /** match sort pattern fist, otherwise some sort query will be mismatch as agg pattern */
- m = _sortPattern.matcher(query);
- if(m.find()){
- if(m.groupCount() != 5)
- throw new IllegalArgumentException("Aggregate query syntax is <EntityName>[<Filter>]<GroupbyFields>{<AggregateFunctions>}.{<SortOptions>}");
- compileAggregateQuery(m);
- _hasAgg = true;
- partitionConstraintValidate(query);
- return;
- }
-
- m = _aggPattern.matcher(query);
- if(m.find()){
- if(m.groupCount() != 4)
- //if(m.groupCount() < 4 || m.groupCount() > 5)
- throw new IllegalArgumentException("Aggregate query syntax is <EntityName>[<Filter>]<GroupbyFields>{<AggregateFunctions>}.{<SortOptions>}");
- compileAggregateQuery(m);
- _hasAgg = true;
- partitionConstraintValidate(query);
- return;
- }
-
- throw new IllegalArgumentException("List query syntax is <EntityName>[<Filter>]{<Projection>} \n Aggregate query syntax is <EntityName>[<Filter>]<GroupbyFields>{<AggregateFunctions>}.{<SortOptions>}");
- }
-
- /**
- * TODO: For now we don't support one query to query multiple partitions. In future if partition is defined
- * for the entity, internally We need to spawn multiple queries and send one query for each search condition
- * for each partition
- *
- * @param query input query to compile
- */
- private void partitionConstraintValidate(String query) {
- if (_partitionValues != null && _partitionValues.size() > 1) {
- final String[] values = _partitionValues.get(0);
- for (int i = 1; i < _partitionValues.size(); ++i) {
- final String[] tmpValues = _partitionValues.get(i);
- for (int j = 0; j < values.length; ++j) {
- if (values[j] == null || (!values[j].equals(tmpValues[j]))) {
- final String errMsg = "One query for multiple partitions is NOT allowed for now! Query: " + query;
- LOG.error(errMsg);
- throw new IllegalArgumentException(errMsg);
- }
- }
- }
- }
- }
-
- public boolean hasAgg(){
- return _hasAgg;
- }
-
- public List<String[]> getQueryPartitionValues() {
- return _partitionValues;
- }
-
- public ORExpression getQueryExpression() {
- return _queryExpression;
- }
-
- private void checkEntityExistence(String entityName) throws EagleQueryParseException {
- try {
- if(EntityDefinitionManager.getEntityByServiceName(entityName) == null)
- throw new EagleQueryParseException(entityName + " entity does not exist!");
- } catch (InstantiationException e) {
- final String errMsg = "Got an InstantiationException: " + e.getMessage();
- throw new EagleQueryParseException(entityName + " entity does not exist! " + errMsg);
- } catch (IllegalAccessException e) {
- final String errMsg = "Got an IllegalAccessException: " + e.getMessage();
- throw new EagleQueryParseException(entityName + " entity does not exist! " + errMsg);
- }
- }
-
- public String deleteAtSign(String expression) {
- return expression.replace("@", "");
- }
-
- private void compileCollectionQuery(Matcher m) throws EagleQueryParseException{
- _serviceName = m.group(1);
- checkEntityExistence(_serviceName);
- if(_outputFields==null) _outputFields = new ArrayList<String>();
- String qy = m.group(2);
- _filter = compileQy(qy);
- String prjFields = m.group(3);
- String[] tmp = prjFields.split(",");
- for(String str : tmp){
- str = str.trim();
- Matcher fnMatcher = _fnPattern.matcher(str);
- Matcher expMatcher = _expPattern.matcher(str);
- if(fnMatcher.find()) {
- if (fnMatcher.groupCount() == 1)
- _outputFields.add(fnMatcher.group(1));
- }else if(_fnAnyPattern.equals(str)){
- if(LOG.isDebugEnabled()) LOG.debug("Output all fields");
- // _outputFields.add(_fnAnyPattern);
- this._outputAll = true;
- }else if (expMatcher.find()) {
- String expr = deleteAtSign(expMatcher.group(1));
- String alias = expMatcher.group(3);
- try {
- String exprContent = TokenConstant.parseExpressionContent(expr);
- _outputFields.addAll(ExpressionParser.parse(exprContent).getDependentFields());
- if(alias!=null) {
- if(_outputAlias == null) _outputAlias = new HashMap<String, String>();
- _outputAlias.put(exprContent,alias.trim());
- }
- } catch (Exception ex){
- LOG.error("Failed to parse expression: " + expr + ", exception: " + ex.getMessage(), ex);
- } finally {
- _outputFields.add(expr);
- }
- } else {
- throw new IllegalArgumentException("Field name syntax must be @<FieldName> or * or Expression in syntax EXP{<Expression>}");
- }
- }
- }
-
- private void compileAggregateQuery(Matcher m) throws EagleQueryParseException{
- _serviceName = m.group(1);
- checkEntityExistence(_serviceName);
- String qy = m.group(2);
- _filter = compileQy(qy);
- String groupbyFields = m.group(3);
- // groupbyFields could be empty
- List<String> groupbyFieldList = null;
- _groupbyFields = new ArrayList<String>();
- if(!groupbyFields.isEmpty()){
- groupbyFieldList = Arrays.asList(groupbyFields.split(","));
- for(String str : groupbyFieldList){
- Matcher fnMatcher = _fnPattern.matcher(str.trim());
- if(!fnMatcher.find() || fnMatcher.groupCount() != 1)
- throw new IllegalArgumentException("Field name syntax must be @<FieldName>");
- _groupbyFields.add(fnMatcher.group(1));
- }
- }
- String functions = m.group(4);
- // functions
- List<String> functionList = Arrays.asList(functions.split(","));
- _aggregateFunctionTypes = new ArrayList<AggregateFunctionType>();
- _aggregateFields = new ArrayList<String>();
- for(String function : functionList){
- AggregateFunctionTypeMatcher matcher = AggregateFunctionType.matchAll(function.trim());
- if(!matcher.find()){
- throw new IllegalArgumentException("Aggregate function must have format of count|sum|avg|max|min(<fieldname|expression>)");
- }
- _aggregateFunctionTypes.add(matcher.type());
- String aggField = deleteAtSign(matcher.field().trim());
- try {
- if(_outputFields == null) _outputFields = new ArrayList<String>();
- if(TokenConstant.isExpression(aggField)) {
- _outputFields.addAll(ExpressionParser.parse(TokenConstant.parseExpressionContent(aggField)).getDependentFields());
- }else{
- _outputFields.add(aggField);
- }
- } catch (Exception ex){
- LOG.error("Failed to parse expression: " + aggField + ", exception: " + ex.getMessage(), ex);
- } finally {
- _aggregateFields.add(aggField);
- }
- }
-
- // sort options
- if(m.groupCount() < 5 || m.group(5) == null) // no sort options
- return;
- String sortOptions = m.group(5);
- if(sortOptions != null){
- LOG.info("SortOptions: " + sortOptions);
- List<String> sortOptionList = Arrays.asList(sortOptions.split(","));
- List<String> rawSortFields = new ArrayList<String>();
- this._sortOptions = SortOptionsParser.parse(groupbyFieldList, functionList, sortOptionList, rawSortFields);
- this._sortFunctionTypes = new ArrayList<>();
- this._sortFields = new ArrayList<>();
- for (String sortField : rawSortFields) {
- AggregateFunctionTypeMatcher matcher = AggregateFunctionType.matchAll(sortField);
- if(matcher.find()) {
- _sortFunctionTypes.add(matcher.type());
- _sortFields.add(deleteAtSign(matcher.field().trim()));
- }
- }
- }
- }
-
- /**
- * 1. syntax level - use antlr to pass the queries
- * 2. semantics level - can't distinguish tag or qualifier
- * @param qy
- * @return
- */
- private Filter compileQy(String qy) throws EagleQueryParseException{
- try {
- EntityDefinition ed = EntityDefinitionManager.getEntityByServiceName(_serviceName);
- if(qy == null || qy.isEmpty()){
- if (ed.getPartitions() == null) {
- if(LOG.isDebugEnabled()) LOG.warn("Query string is empty, full table scan query: " + qy);
- // For hbase 0.98+, empty FilterList() will filter all rows, so we need return null instead
- return null;
- } else {
- final String errMsg = "Entity " + ed.getEntityClass().getSimpleName() + " defined partition, "
- + "but query doesn't provide partition condition! Query: " + qy;
- LOG.error(errMsg);
- throw new IllegalArgumentException(errMsg);
- }
- }
- EagleQueryParser parser = new EagleQueryParser(qy);
- _queryExpression = parser.parse();
-
- //TODO: build customize filter for EXP{<Expression>}
- HBaseFilterBuilder builder = new HBaseFilterBuilder(ed, _queryExpression, _filterIfMissing);
- FilterList flist = builder.buildFilters();
- _partitionValues = builder.getPartitionValues();
- _filterFields = builder.getFilterFields();
- return flist;
- } catch (InstantiationException e) {
- final String errMsg = "Got an InstantiationException: " + e.getMessage();
- throw new EagleQueryParseException(_serviceName + " entity does not exist! " + errMsg);
- } catch (IllegalAccessException e) {
- final String errMsg = "Got an IllegalAccessException: " + e.getMessage();
- throw new EagleQueryParseException(_serviceName + " entity does not exist! " + errMsg);
- }
- }
-
- public String serviceName(){
- return _serviceName;
- }
-
- public List<String> outputFields(){
- return _outputFields;
- }
-
- public Filter filter(){
- return _filter;
- }
-
- public List<String> groupbyFields(){
- return _groupbyFields;
- }
-
- public List<AggregateFunctionType> aggregateFunctionTypes(){
- return _aggregateFunctionTypes;
- }
-
- public List<String> aggregateFields(){
- return _aggregateFields;
- }
-
- public List<SortOption> sortOptions(){
- return _sortOptions;
- }
-
- public List<AggregateFunctionType> sortFunctions() {
- return _sortFunctionTypes;
- }
-
- public List<String> sortFields() {
- return _sortFields;
- }
-
- /**
- * Output all fields (i.e. has * in out fields)
- *
- * @return
- */
- public boolean isOutputAll(){ return _outputAll;}
- public Map<String,String> getOutputAlias(){
- return _outputAlias;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/afe86834/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/QueryConstants.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/QueryConstants.java b/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/QueryConstants.java
deleted file mode 100644
index d059179..0000000
--- a/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/QueryConstants.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 eagle.query;
-
-/**
- * @since 3/25/15
- */
-public class QueryConstants {
- public final static String CHARSET ="UTF-8";
-}
http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/afe86834/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/AggregateAPIEntity.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/AggregateAPIEntity.java b/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/AggregateAPIEntity.java
deleted file mode 100644
index aabe59d..0000000
--- a/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/AggregateAPIEntity.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 eagle.query.aggregate;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.SortedMap;
-import java.util.TreeMap;
-
-import org.codehaus.jackson.annotate.JsonProperty;
-import org.codehaus.jackson.map.annotate.JsonSerialize;
-
-@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
-public class AggregateAPIEntity {
- private long numDirectDescendants;
- private long numTotalDescendants;
- private String key;
- private SortedMap<String, AggregateAPIEntity> entityList = new TreeMap<String, AggregateAPIEntity>();
- private List<AggregateAPIEntity> sortedList = new ArrayList<AggregateAPIEntity>();
-
- public String getKey() {
- return key;
- }
- public void setKey(String key) {
- this.key = key;
- }
- @JsonProperty("sL")
- public List<AggregateAPIEntity> getSortedList() {
- return sortedList;
- }
- public void setSortedList(List<AggregateAPIEntity> sortedList) {
- this.sortedList = sortedList;
- }
- @JsonProperty("eL")
- public SortedMap<String, AggregateAPIEntity> getEntityList() {
- return entityList;
- }
- public void setEntityList(SortedMap<String, AggregateAPIEntity> entityList) {
- this.entityList = entityList;
- }
- @JsonProperty("nDD")
- public long getNumDirectDescendants() {
- return numDirectDescendants;
- }
- public void setNumDirectDescendants(long numDirectDescendants) {
- this.numDirectDescendants = numDirectDescendants;
- }
- @JsonProperty("nTD")
- public long getNumTotalDescendants() {
- return numTotalDescendants;
- }
- public void setNumTotalDescendants(long numTotalDescendants) {
- this.numTotalDescendants = numTotalDescendants;
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/afe86834/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/AggregateAPIEntityFactory.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/AggregateAPIEntityFactory.java b/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/AggregateAPIEntityFactory.java
deleted file mode 100644
index f07101b..0000000
--- a/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/AggregateAPIEntityFactory.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 eagle.query.aggregate;
-
-public interface AggregateAPIEntityFactory {
- public AggregateAPIEntity create();
-}
http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/afe86834/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/AggregateCondition.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/AggregateCondition.java b/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/AggregateCondition.java
deleted file mode 100755
index 74959b6..0000000
--- a/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/AggregateCondition.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 eagle.query.aggregate;
-
-import java.io.Serializable;
-import java.util.List;
-
-/**
- *
- * @since : 11/7/14,2014
- */
-public class AggregateCondition implements Serializable{
- private static final long serialVersionUID = 1L;
- private List<String> groupbyFields;
- private List<AggregateFunctionType> aggregateFunctionTypes;
- private List<String> aggregateFields;
- private boolean timeSeries;
- private long intervalMS;
-
- public List<String> getGroupbyFields() {
- return groupbyFields;
- }
-
- public void setGroupbyFields(List<String> groupbyFields) {
- this.groupbyFields = groupbyFields;
- }
-
- public List<AggregateFunctionType> getAggregateFunctionTypes() {
- return aggregateFunctionTypes;
- }
-
- public void setAggregateFunctionTypes(List<AggregateFunctionType> aggregateFunctionTypes) {
- this.aggregateFunctionTypes = aggregateFunctionTypes;
- }
-
- public List<String> getAggregateFields() {
- return aggregateFields;
- }
-
- public void setAggregateFields(List<String> aggregateFields) {
- this.aggregateFields = aggregateFields;
- }
-
- public boolean isTimeSeries() {
- return timeSeries;
- }
-
- public void setTimeSeries(boolean timeSeries) {
- this.timeSeries = timeSeries;
- }
-
- public long getIntervalMS() {
- return intervalMS;
- }
-
- public void setIntervalMS(long intervalMS) {
- this.intervalMS = intervalMS;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/afe86834/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/AggregateFunctionNotSupportedException.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/AggregateFunctionNotSupportedException.java b/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/AggregateFunctionNotSupportedException.java
deleted file mode 100644
index e976297..0000000
--- a/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/AggregateFunctionNotSupportedException.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 eagle.query.aggregate;
-
-public class AggregateFunctionNotSupportedException extends RuntimeException{
- static final long serialVersionUID = -4548788354899625887L;
- public AggregateFunctionNotSupportedException(){
- super();
- }
-
- public AggregateFunctionNotSupportedException(String message){
- super(message);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/afe86834/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/AggregateFunctionType.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/AggregateFunctionType.java b/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/AggregateFunctionType.java
deleted file mode 100755
index 9988082..0000000
--- a/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/AggregateFunctionType.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 eagle.query.aggregate;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-public enum AggregateFunctionType{
- count("^(count)$"),
- sum("^sum\\((.*)\\)$"),
- avg("^avg\\((.*)\\)$"),
- max("^max\\((.*)\\)$"),
- min("^min\\((.*)\\)$");
-
- private Pattern pattern;
- private AggregateFunctionType(String patternString){
- this.pattern = Pattern.compile(patternString);
- }
-
- /**
- * This method is thread safe
- * match and retrieve back the aggregated fields, for count, aggregateFields can be null
- * @param function
- * @return
- */
- public AggregateFunctionTypeMatcher matcher(String function){
- Matcher m = pattern.matcher(function);
-
- if(m.find()){
- return new AggregateFunctionTypeMatcher(this, true, m.group(1));
- }else{
- return new AggregateFunctionTypeMatcher(this, false, null);
- }
- }
-
- public static AggregateFunctionTypeMatcher matchAll(String function){
- for(AggregateFunctionType type : values()){
- Matcher m = type.pattern.matcher(function);
- if(m.find()){
- return new AggregateFunctionTypeMatcher(type, true, m.group(1));
- }
- }
- return new AggregateFunctionTypeMatcher(null, false, null);
- }
-
- public static byte[] serialize(AggregateFunctionType type){
- return type.name().getBytes();
- }
-
- public static AggregateFunctionType deserialize(byte[] type){
- return valueOf(new String(type));
- }
-
- public static List<byte[]> toBytesList(List<AggregateFunctionType> types){
- List<byte[]> result = new ArrayList<byte[]>();
- for(AggregateFunctionType type:types){
- result.add(serialize(type));
- }
- return result;
- }
-
- public static List<AggregateFunctionType> fromBytesList(List<byte[]> types){
- List<AggregateFunctionType> result = new ArrayList<AggregateFunctionType>();
- for(byte[] bs:types){
- result.add(deserialize(bs));
- }
- return result;
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/afe86834/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/AggregateFunctionTypeMatcher.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/AggregateFunctionTypeMatcher.java b/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/AggregateFunctionTypeMatcher.java
deleted file mode 100644
index e04d383..0000000
--- a/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/AggregateFunctionTypeMatcher.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 eagle.query.aggregate;
-
-public class AggregateFunctionTypeMatcher {
- private final AggregateFunctionType type;
- private final boolean matched;
- private final String field;
-
- public AggregateFunctionTypeMatcher(AggregateFunctionType type, boolean matched, String field){
- this.type = type;
- this.matched = matched;
- this.field = field;
- }
-
- public boolean find(){
- return this.matched;
- }
-
- public String field(){
- return this.field;
- }
-
- public AggregateFunctionType type(){
- return this.type;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/afe86834/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/AggregateParams.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/AggregateParams.java b/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/AggregateParams.java
deleted file mode 100644
index ebe0d1e..0000000
--- a/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/AggregateParams.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 eagle.query.aggregate;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class AggregateParams{
- List<String> groupbyFields;
- boolean counting;
- List<String> sumFunctionFields = new ArrayList<String>();
- List<SortFieldOrder> sortFieldOrders = new ArrayList<SortFieldOrder>();
-
- public List<SortFieldOrder> getSortFieldOrders() {
- return sortFieldOrders;
- }
- public void setSortFieldOrders(List<SortFieldOrder> sortFieldOrders) {
- this.sortFieldOrders = sortFieldOrders;
- }
- public List<String> getGroupbyFields() {
- return groupbyFields;
- }
- public void setGroupbyFields(List<String> groupbyFields) {
- this.groupbyFields = groupbyFields;
- }
- public boolean isCounting() {
- return counting;
- }
- public void setCounting(boolean counting) {
- this.counting = counting;
- }
- public List<String> getSumFunctionFields() {
- return sumFunctionFields;
- }
- public void setSumFunctionFields(List<String> sumFunctionFields) {
- this.sumFunctionFields = sumFunctionFields;
- }
-
- public static class SortFieldOrder{
- public static final String SORT_BY_AGGREGATE_KEY = "key";
- public static final String SORT_BY_COUNT = "count";
- private String field;
- private boolean ascendant;
-
- public SortFieldOrder(String field, boolean ascendant) {
- super();
- this.field = field;
- this.ascendant = ascendant;
- }
- public String getField() {
- return field;
- }
- public void setField(String field) {
- this.field = field;
- }
- public boolean isAscendant() {
- return ascendant;
- }
- public void setAscendant(boolean ascendant) {
- this.ascendant = ascendant;
- }
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/afe86834/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/AggregateParamsValidator.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/AggregateParamsValidator.java b/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/AggregateParamsValidator.java
deleted file mode 100644
index f5a5d44..0000000
--- a/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/AggregateParamsValidator.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 eagle.query.aggregate;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class AggregateParamsValidator {
- /**
- * This method handle the following sytle syntax
- * sum(numConfiguredMapSlots), count group by cluster, rack
- * 1. ensure that all gb fields must occur in outputField or outputTag
- * 2. ensure that all summarized fields must occur in outputField,
- * for example, for function=sum(numConfiguredMapSlots), numConfiguredMapSlots must occur in outputField
- * 3. groupby should be pre-appended with a root groupby field
- * @param outputTags
- * @param outputFields
- * @param groupbys
- * @param functions
- * @throws IllegalArgumentException
- */
- public static AggregateParams compileAggregateParams(List<String> outputTags, List<String> outputFields, List<String> groupbys, List<String> functions, List<String> sortFieldOrders)
- throws IllegalArgumentException, AggregateFunctionNotSupportedException{
- AggregateParams aggParams = new AggregateParams();
- // ensure that all gb fields must occur in outputField or outputTag
- for(String groupby : groupbys){
- if(!outputTags.contains(groupby) && !outputFields.contains(groupby)){
- throw new IllegalArgumentException(groupby + ", All gb fields should appear in outputField list or outputTag list");
- }
- }
-
- // parse functions and ensure that all summarized fields must occur in outputField
- for(String function : functions){
- AggregateFunctionTypeMatcher m = AggregateFunctionType.count.matcher(function);
- if(m.find()){
- aggParams.setCounting(true);
- continue;
- }
-
- m = AggregateFunctionType.sum.matcher(function);
- if(m.find()){
- if(!outputFields.contains(m.field())){
- throw new IllegalArgumentException(m.field() + ", All summary function fields should appear in outputField list");
- }
- aggParams.getSumFunctionFields().add(m.field());
- continue;
- }
-
- throw new AggregateFunctionNotSupportedException("function " + function + " is not supported, only count, sum aggregate functions are now supported");
- }
-
- // groupby should be pre-appended with a root groupby field
- List<String> groupbyFields = new ArrayList<String>();
- groupbyFields.add(Aggregator.GROUPBY_ROOT_FIELD_NAME);
- groupbyFields.addAll(groupbys);
- aggParams.setGroupbyFields(groupbyFields);
-
- // check sort field orders
- boolean byKeySorting = false;
- for(String sortFieldOrder : sortFieldOrders){
- AggregateParams.SortFieldOrder sfo = SortFieldOrderType.matchAll(sortFieldOrder);
- if(sfo == null){
- throw new IllegalArgumentException(sortFieldOrder + ", All sort field order should be <field>=(asc|desc)");
- }
- if(sfo.getField().equals(AggregateParams.SortFieldOrder.SORT_BY_AGGREGATE_KEY)){
- byKeySorting = true;
- }else if(!sfo.getField().equals(AggregateParams.SortFieldOrder.SORT_BY_COUNT)){
- if(!groupbys.contains(sfo.getField()) && !aggParams.getSumFunctionFields().contains(sfo.getField())){
- throw new IllegalArgumentException(sortFieldOrder + ", All sort field order should appear in gb or function fields");
- }
- }
- aggParams.getSortFieldOrders().add(sfo);
- }
- // always add key ascendant to the last aggregation key if not specified
- if(!byKeySorting){
- aggParams.getSortFieldOrders().add(new AggregateParams.SortFieldOrder(AggregateParams.SortFieldOrder.SORT_BY_AGGREGATE_KEY, true));
- }
- return aggParams;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/afe86834/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/AggregateResultAPIEntity.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/AggregateResultAPIEntity.java b/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/AggregateResultAPIEntity.java
deleted file mode 100644
index 9e22465..0000000
--- a/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/AggregateResultAPIEntity.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 eagle.query.aggregate;
-
-import org.codehaus.jackson.map.annotate.JsonSerialize;
-
-@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
-public class AggregateResultAPIEntity {
- private boolean success;
- private String exception;
- private long elapsedms;
- private AggregateAPIEntity entity;
-
- public long getElapsedms() {
- return elapsedms;
- }
- public void setElapsedms(long elapsedms) {
- this.elapsedms = elapsedms;
- }
- public AggregateAPIEntity getEntity() {
- return entity;
- }
- public void setEntity(AggregateAPIEntity entity) {
- this.entity = entity;
- }
- public boolean isSuccess() {
- return success;
- }
- public void setSuccess(boolean success) {
- this.success = success;
- }
- public String getException() {
- return exception;
- }
- public void setException(String exception) {
- this.exception = exception;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/afe86834/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/Aggregator.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/Aggregator.java b/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/Aggregator.java
deleted file mode 100644
index c2147e0..0000000
--- a/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/Aggregator.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 eagle.query.aggregate;
-
-import java.lang.reflect.Method;
-import java.util.List;
-import java.util.Map;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import eagle.log.base.taggedlog.TaggedLogAPIEntity;
-
-public class Aggregator {
- private static final Logger LOG = LoggerFactory.getLogger(Aggregator.class);
- public static final String GROUPBY_ROOT_FIELD_NAME = "site";
- public static final String GROUPBY_ROOT_FIELD_VALUE = "xyz";
- public static final String UNASSIGNED_GROUPBY_ROOT_FIELD_NAME = "unassigned";
-
- private final AggregateAPIEntityFactory factory;
- private final AggregateAPIEntity root;
- private final List<String> groupbys;
- private final List<String> sumFunctionFields;
- private final boolean counting;
-
- public Aggregator(AggregateAPIEntityFactory factory, AggregateAPIEntity root, List<String> groupbys, boolean counting, List<String> sumFunctionFields){
- this.factory = factory;
- this.root = root;
- this.groupbys = groupbys;
- this.sumFunctionFields = sumFunctionFields;
- this.counting = counting;
- }
-
- /**
- * this locate result can be cached? we don't need check if it's TaggedLogAPIEntity each time when iterating entities
- * @param groupby
- * @param obj
- * @return
- * @throws Exception
- */
- private String locateGroupbyField(String groupby, TaggedLogAPIEntity obj){
- if(groupby.equals(GROUPBY_ROOT_FIELD_NAME)){
- return GROUPBY_ROOT_FIELD_VALUE;
- }
- // check tag first
- String tagv = obj.getTags().get(groupby);
- if(tagv != null)
- return tagv;
- // check against pojo, or qualifierValues
- String fn = groupby.substring(0,1).toUpperCase()+groupby.substring(1, groupby.length());
- try{
- Method getM = obj.getClass().getMethod("get"+fn);
- Object value = getM.invoke(obj);
- return (String)value;
- }catch(Exception ex){
- LOG.warn(groupby + " field is in neither tags nor fields, " + ex.getMessage());
- return null;
- }
- }
-
- /**
- * accumulate a list of entities
- * @param entities
- * @throws Exception
- */
- public void accumulateAll(List<TaggedLogAPIEntity> entities) throws Exception{
- for(TaggedLogAPIEntity entity : entities){
- accumulate(entity);
- }
- }
-
- /**
- * currently only group by tags
- * groupbys' first item always is site, which is a reserved field
- */
- public void accumulate(TaggedLogAPIEntity entity) throws Exception{
- AggregateAPIEntity current = root;
- for(String groupby : groupbys){
- // TODO tagv is empty, so what to do? use a reserved field_name "unassigned" ?
- // TODO we should support all Pojo with java bean style object
- String tagv = locateGroupbyField(groupby, entity);
- if(tagv == null || tagv.isEmpty()){
- tagv = UNASSIGNED_GROUPBY_ROOT_FIELD_NAME;
- }
- Map<String, AggregateAPIEntity> children = current.getEntityList();
- if(children.get(tagv) == null){
- children.put(tagv, factory.create());
- current.setNumDirectDescendants(current.getNumDirectDescendants()+1);
- }
- AggregateAPIEntity child = children.get(tagv);
- // go through all aggregate functions including count, summary etc.
- if(counting)
- count(child);
- for(String sumFunctionField : sumFunctionFields){
- sum(child, entity, sumFunctionField);
- }
-
- current = child;
- }
-
- }
-
-
- /**
- * use java bean specifications?
- * reflection is not efficient, let us find out solutions
- */
- private void sum(Object targetObj, TaggedLogAPIEntity srcObj, String fieldName) throws Exception{
- try{
- String fn = fieldName.substring(0,1).toUpperCase()+fieldName.substring(1, fieldName.length());
- Method srcGetMethod = srcObj.getClass().getMethod("get"+fn);
- Object srcValue = srcGetMethod.invoke(srcObj);
- if(srcValue == null){
- return; // silently don't count this source object
- }
- Method targetGetMethod = targetObj.getClass().getMethod("get"+fn);
- Object targetValue = targetGetMethod.invoke(targetObj);
- if(targetValue instanceof Long){
- Method setM = targetObj.getClass().getMethod("set"+fn, long.class);
- Long tmp1 = (Long)targetValue;
- // TODO, now source object always have type "java.lang.String", later on we should support various type including integer type
- Long tmp2 = null;
- if(srcValue instanceof String){
- tmp2 = Long.valueOf((String)srcValue);
- }else if(srcValue instanceof Long){
- tmp2 = (Long)srcValue;
- }else{
- throw new IllegalAggregateFieldTypeException(srcValue.getClass().toString() + " type is not support. The source type must be Long or String");
- }
- setM.invoke(targetObj, tmp1.longValue()+tmp2.longValue());
- }else if(targetValue instanceof Double){
- Method setM = targetObj.getClass().getMethod("set"+fn, double.class);
- Double tmp1 = (Double)targetValue;
- String src = (String) srcValue;
- Double tmp2 = Double.valueOf(src);
- setM.invoke(targetObj, tmp1.doubleValue()+tmp2.doubleValue());
- }else{
- throw new IllegalAggregateFieldTypeException(targetValue.getClass().toString() + " type is not support. The target type must be long or double");
- }
- }catch(Exception ex){
- LOG.error("Cannot do sum aggregation for field " + fieldName, ex);
- throw ex;
- }
- }
-
- /**
- * count possible not only count for number of descendants but also count for not-null fields
- * @param targetObj
- * @throws Exception
- */
- private void count(AggregateAPIEntity targetObj) throws Exception{
- targetObj.setNumTotalDescendants(targetObj.getNumTotalDescendants()+1);
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/afe86834/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/BucketQuery.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/BucketQuery.java b/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/BucketQuery.java
deleted file mode 100644
index ee9a7d5..0000000
--- a/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/BucketQuery.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 eagle.query.aggregate;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import eagle.log.base.taggedlog.TaggedLogAPIEntity;
-
-public class BucketQuery {
- public final static String UNASSIGNED_BUCKET = "unassigned";
- private List<String> bucketFields;
- private int limit;
- private Map<String, Object> root = new HashMap<String, Object>();
-
- public BucketQuery(List<String> bucketFields, int limit){
- this.bucketFields = bucketFields;
- this.limit = limit;
- }
-
- @SuppressWarnings("unchecked")
- public void put(TaggedLogAPIEntity entity){
- Map<String, Object> current = root;
- int bucketCount = bucketFields.size();
- if(bucketCount <= 0)
- return; // silently return
- int i = 0;
- String bucketFieldValue = null;
- for(; i<bucketCount; i++){
- String bucketField = bucketFields.get(i);
- bucketFieldValue = entity.getTags().get(bucketField);
- if(bucketFieldValue == null || bucketFieldValue.isEmpty()){
- bucketFieldValue = UNASSIGNED_BUCKET;
- }
- // for last bucket, bypass the following logic
- if(i == bucketCount-1){
- break;
- }
-
- if(current.get(bucketFieldValue) == null){
- current.put(bucketFieldValue, new HashMap<String, Object>());
- }
- // for the last level of bucket, it is not Map, instead it is List<TaggedLogAPIEntity>
- current = (Map<String, Object>)current.get(bucketFieldValue);
- }
- List<TaggedLogAPIEntity> bucketContent = (List<TaggedLogAPIEntity>)current.get(bucketFieldValue);
- if(bucketContent == null){
- bucketContent = new ArrayList<TaggedLogAPIEntity>();
- current.put(bucketFieldValue, bucketContent);
- }
-
- if(bucketContent.size() >= limit){
- return;
- }else{
- bucketContent.add(entity);
- }
- }
-
- public void batchPut(List<TaggedLogAPIEntity> entities){
- for(TaggedLogAPIEntity entity : entities){
- put(entity);
- }
- }
-
- public Map<String, Object> get(){
- return root;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/afe86834/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/IllegalAggregateFieldTypeException.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/IllegalAggregateFieldTypeException.java b/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/IllegalAggregateFieldTypeException.java
deleted file mode 100644
index 13c6e6d..0000000
--- a/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/IllegalAggregateFieldTypeException.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 eagle.query.aggregate;
-
-public class IllegalAggregateFieldTypeException extends RuntimeException{
- static final long serialVersionUID = -4548788354899625887L;
- public IllegalAggregateFieldTypeException(){
- super();
- }
-
- public IllegalAggregateFieldTypeException(String message){
- super(message + ", only count and sum are support");
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/afe86834/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/PostAggregateSorting.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/PostAggregateSorting.java b/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/PostAggregateSorting.java
deleted file mode 100644
index 8ce533b..0000000
--- a/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/PostAggregateSorting.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 eagle.query.aggregate;
-
-import java.lang.reflect.Method;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Map;
-import java.util.SortedSet;
-import java.util.TreeSet;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class PostAggregateSorting {
- private static final Logger LOG = LoggerFactory.getLogger(PostAggregateSorting.class);
-
- private static SortedSet<Map.Entry<String, AggregateAPIEntity>> sortByValue(Map<String, AggregateAPIEntity> map, List<AggregateParams.SortFieldOrder> sortedFields) {
- SortedSet<Map.Entry<String, AggregateAPIEntity>> sortedEntries = new TreeSet<Map.Entry<String, AggregateAPIEntity>>(new MapKeyValueComparator(sortedFields));
- sortedEntries.addAll(map.entrySet());
- return sortedEntries;
- }
-
- /**
- * recursively populate sorted list from entity list
- * @param entity
- */
- public static void sort(AggregateAPIEntity entity, List<AggregateParams.SortFieldOrder> sortFieldOrders){
- // sort should internally add key field to AggregateAPIEntity before the sorting starts as "key" could be sorted against
- Map<String, AggregateAPIEntity> children = entity.getEntityList();
- for(Map.Entry<String, AggregateAPIEntity> e : children.entrySet()){
- e.getValue().setKey(e.getKey());
- }
- SortedSet<Map.Entry<String, AggregateAPIEntity>> set = sortByValue(children, sortFieldOrders);
- for(Map.Entry<String, AggregateAPIEntity> entry : set){
- entity.getSortedList().add(entry.getValue());
- }
- for(Map.Entry<String, AggregateAPIEntity> entry : entity.getEntityList().entrySet()){
- sort(entry.getValue(), sortFieldOrders);
- }
- entity.setEntityList(null);
- }
-
- private static class MapKeyValueComparator implements Comparator<Map.Entry<String, AggregateAPIEntity>>{
- private List<AggregateParams.SortFieldOrder> sortedFieldOrders;
- public MapKeyValueComparator(List<AggregateParams.SortFieldOrder> sortedFields){
- this.sortedFieldOrders = sortedFields;
- }
- @Override
- public int compare(Map.Entry<String, AggregateAPIEntity> e1, Map.Entry<String, AggregateAPIEntity> e2){
- int r = 0;
- AggregateAPIEntity entity1 = e1.getValue();
- AggregateAPIEntity entity2 = e2.getValue();
- for(AggregateParams.SortFieldOrder sortFieldOrder : sortedFieldOrders){
- // TODO count should not be literal, compare numTotalDescendants
- if(sortFieldOrder.getField().equals(AggregateParams.SortFieldOrder.SORT_BY_COUNT)){
- long tmp = entity1.getNumTotalDescendants() - entity2.getNumTotalDescendants();
- r = (tmp == 0) ? 0 : ((tmp > 0) ? 1 : -1);
- }else if(sortFieldOrder.getField().equals(AggregateParams.SortFieldOrder.SORT_BY_AGGREGATE_KEY)){
- r = entity1.getKey().compareTo(entity2.getKey());
- }else{
- try{
- String sortedField = sortFieldOrder.getField();
- String tmp1 = sortedField.substring(0, 1).toUpperCase()+sortedField.substring(1);
- Method getMethod1 = entity1.getClass().getMethod("get"+tmp1);
- Object r1 = getMethod1.invoke(entity1);
- Long comp1 = (Long)r1;
- String tmp2 = sortedField.substring(0, 1).toUpperCase()+sortedField.substring(1);
- Method getMethod2 = entity2.getClass().getMethod("get"+tmp2);
- Object r2 = getMethod2.invoke(entity2);
- Long comp2 = (Long)r2;
- r = comp1.compareTo(comp2);
- }catch(Exception ex){
- LOG.error("Can not get corresponding field for sorting", ex);
- r = 0;
- }
- }
- if(r == 0) continue;
- if(!sortFieldOrder.isAscendant()){
- r = -r;
- }
- return r;
- }
- return r;
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/afe86834/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/SortFieldOrderType.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/SortFieldOrderType.java b/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/SortFieldOrderType.java
deleted file mode 100644
index 87be007..0000000
--- a/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/SortFieldOrderType.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 eagle.query.aggregate;
-
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-public enum SortFieldOrderType {
- key("^(key)=(asc|desc)$"),
- count("^(count)=(asc|desc)$"),
- sum("^sum\\((.*)\\)=(asc|desc)$"),
- avg("^avg\\((.*)\\)(asc|desc)$"),
- max("^max\\((.*)\\)(asc|desc)$"),
- min("^min\\((.*)\\)(asc|desc)$");
-
- private Pattern pattern;
- private SortFieldOrderType(String patternString){
- this.pattern = Pattern.compile(patternString);
- }
-
- /**
- * This method is thread safe
- * match and retrieve back the aggregated fields, for count, aggregateFields can be null
- * @param sortFieldOrder
- * @return
- */
- public SortFieldOrderTypeMatcher matcher(String sortFieldOrder){
- Matcher m = pattern.matcher(sortFieldOrder);
-
- if(m.find()){
- return new SortFieldOrderTypeMatcher(true, m.group(1), m.group(2));
- }else{
- return new SortFieldOrderTypeMatcher(false, null, null);
- }
- }
-
- public static AggregateParams.SortFieldOrder matchAll(String sortFieldOrder){
- for(SortFieldOrderType type : SortFieldOrderType.values()){
- SortFieldOrderTypeMatcher m = type.matcher(sortFieldOrder);
- if(m.find())
- return m.sortFieldOrder();
- }
- return null;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/afe86834/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/SortFieldOrderTypeMatcher.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/SortFieldOrderTypeMatcher.java b/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/SortFieldOrderTypeMatcher.java
deleted file mode 100644
index 2e3afc7..0000000
--- a/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/SortFieldOrderTypeMatcher.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 eagle.query.aggregate;
-
-
-public class SortFieldOrderTypeMatcher {
- private boolean matched;
- private AggregateParams.SortFieldOrder sortFieldOrder;
-
- public SortFieldOrderTypeMatcher(boolean matched, String field, String order){
- this.matched = matched;
- if(matched){
- this.sortFieldOrder = new AggregateParams.SortFieldOrder(field, order.equals("asc"));
- }
- }
-
- public boolean find(){
- return this.matched;
- }
-
- public AggregateParams.SortFieldOrder sortFieldOrder(){
- return this.sortFieldOrder;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/afe86834/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/raw/Function.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/raw/Function.java b/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/raw/Function.java
deleted file mode 100755
index e4ae04a..0000000
--- a/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/raw/Function.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 eagle.query.aggregate.raw;
-
-public abstract class Function{
- private int count = 0;
- protected void incrCount(int num){ count += num; }
- public int count(){ return count; }
- public abstract void run(double v,int count);
- public void run(double v){ run(v,1); }
- public abstract double result();
-
- public static class Avg extends Function {
- private double total;
- public Avg(){
- this.total = 0.0;
- }
- @Override
- public void run(double v,int count){
- this.incrCount(count);
- total += v;
- }
- @Override
- public double result(){
- return this.total/this.count();
- }
- }
-
- public static class Max extends Function {
- private double maximum;
- public Max(){
- // TODO is this a bug, or only positive numeric calculation is supported
- this.maximum = 0.0;
- }
-
- @Override
- public void run(double v,int count){
- this.incrCount(count);
- if(v > maximum){
- maximum = v;
- }
- }
-
- @Override
- public double result(){
- return maximum;
- }
- }
-
- public static class Min extends Function {
- private double minimum;
- public Min(){
- // TODO is this a bug, or only positive numeric calculation is supported
- this.minimum = Double.MAX_VALUE;
- }
- @Override
- public void run(double v,int count){
- this.incrCount(count);
- if(v < minimum){
- minimum = v;
- }
- }
-
- @Override
- public double result(){
- return minimum;
- }
- }
-
- public static class Sum extends Function {
- private double summary;
- public Sum(){
- this.summary = 0.0;
- }
- @Override
- public void run(double v,int count){
- this.incrCount(count);
- this.summary += v;
- }
-
- @Override
- public double result(){
- return this.summary;
- }
- }
-
- public static class Count extends Sum{
- public Count(){
- super();
- }
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/afe86834/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/raw/FunctionFactory.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/raw/FunctionFactory.java b/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/raw/FunctionFactory.java
deleted file mode 100755
index 2680f8f..0000000
--- a/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/raw/FunctionFactory.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 eagle.query.aggregate.raw;
-
-import eagle.query.aggregate.AggregateFunctionType;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public abstract class FunctionFactory{
- public abstract Function createFunction();
-
- public static class AvgFactory extends FunctionFactory {
- @Override
- public Function createFunction(){
- return new Function.Avg();
- }
- }
-
- public static class MaxFactory extends FunctionFactory {
- @Override
- public Function createFunction(){
- return new Function.Max();
- }
- }
-
- public static class MinFactory extends FunctionFactory {
- @Override
- public Function createFunction(){
- return new Function.Min();
- }
- }
-
- public static class CountFactory extends FunctionFactory {
- @Override
- public Function createFunction(){
- return new Function.Count();
- }
- }
-
- public static class SumFactory extends FunctionFactory {
- @Override
- public Function createFunction(){
- return new Function.Sum();
- }
- }
-
- public static FunctionFactory locateFunctionFactory(AggregateFunctionType funcType){
- return _functionFactories.get(funcType.name());
- }
-
- private static Map<String, FunctionFactory> _functionFactories = new HashMap<String, FunctionFactory>();
- static{
- _functionFactories.put(AggregateFunctionType.count.name(), new CountFactory());
- _functionFactories.put(AggregateFunctionType.sum.name(), new SumFactory());
- _functionFactories.put(AggregateFunctionType.min.name(), new MinFactory());
- _functionFactories.put(AggregateFunctionType.max.name(), new MaxFactory());
- _functionFactories.put(AggregateFunctionType.avg.name(), new AvgFactory());
- }
-}
-
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/afe86834/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/raw/GroupbyKey.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/raw/GroupbyKey.java b/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/raw/GroupbyKey.java
deleted file mode 100755
index 859aac7..0000000
--- a/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/raw/GroupbyKey.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 eagle.query.aggregate.raw;
-
-import org.apache.hadoop.io.BytesWritable;
-import org.apache.hadoop.io.Writable;
-
-import java.io.DataInput;
-import java.io.DataOutput;
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.List;
-import java.util.ListIterator;
-
-/**
- * <h3>Structure</h3>
- * <pre>
- * {
- * List[byte[],...]
- * }
- * </pre>
- */
-public class GroupbyKey implements Writable {
- private final WritableList<BytesWritable> value;
-
- public void addValue(byte[] value){
- this.value.add(new BytesWritable(value));
- }
- public void addAll(List<BytesWritable> list){
- this.value.addAll(list);
- }
-
- public List<BytesWritable> getValue(){
- return value;
- }
-
- /**
- * empty constructor
- */
- public GroupbyKey(){
- this.value = new WritableList<BytesWritable>(BytesWritable.class);
- }
-
- /**
- * clear for reuse
- */
- public void clear(){
- value.clear();
- }
-
- /**
- * copy constructor
- * @param key
- */
- public GroupbyKey(GroupbyKey key){
- this();
- ListIterator<BytesWritable> it = key.value.listIterator();
-// ListIterator<byte[]> it = key.value.listIterator();
- while(it.hasNext()){
- this.value.add(it.next());
- }
- }
-
- public GroupbyKey(List<byte[]> bytes){
- this();
- for(byte[] bt:bytes){
- this.addValue(bt);
- }
- }
-
- @Override
- public boolean equals(Object obj){
- if(obj == this)
- return true;
- if(!(obj instanceof GroupbyKey)){
- return false;
- }
- GroupbyKey that = (GroupbyKey)obj;
-// ListIterator<byte[]> e1 = this.value.listIterator();
-// ListIterator<byte[]> e2 = that.value.listIterator();
- ListIterator<BytesWritable> e1 = this.value.listIterator();
- ListIterator<BytesWritable> e2 = that.value.listIterator();
- while(e1.hasNext() && e2.hasNext()){
- if(!Arrays.equals(e1.next().getBytes(), e2.next().getBytes()))
- return false;
- }
- return !(e1.hasNext() || e2.hasNext());
- }
-
- @Override
- public int hashCode(){
- ListIterator<BytesWritable> e1 = this.value.listIterator();
- int hash = 0xFFFFFFFF;
- while(e1.hasNext()){
- hash ^= Arrays.hashCode(e1.next().getBytes());
- }
- return hash;
- }
-
- /**
- * Serialize the fields of this object to <code>out</code>.
- *
- * @param out <code>DataOuput</code> to serialize this object into.
- * @throws java.io.IOException
- */
- @Override
- public void write(DataOutput out) throws IOException {
- this.value.write(out);
- }
-
- /**
- * Deserialize the fields of this object from <code>in</code>.
- * <p/>
- * <p>For efficiency, implementations should attempt to re-use storage in the
- * existing object where possible.</p>
- *
- * @param in <code>DataInput</code> to deseriablize this object from.
- * @throws java.io.IOException
- */
- @Override
- public void readFields(DataInput in) throws IOException {
- this.value.readFields(in);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/afe86834/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/raw/GroupbyKeyAggregatable.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/raw/GroupbyKeyAggregatable.java b/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/raw/GroupbyKeyAggregatable.java
deleted file mode 100755
index ac86e13..0000000
--- a/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/raw/GroupbyKeyAggregatable.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 eagle.query.aggregate.raw;
-
-import java.util.List;
-
-/**
- * The generic interface to unify the GroupbyKeyValue-based results of different
- * business logic aggregates like RawAggregator or TimeSeriesAggregator
- *
- * @see eagle.query.aggregate.timeseries.TimeSeriesAggregator
- * @see RawAggregator
- *
- * @since : 11/3/14,2014
- *
- */
-public interface GroupbyKeyAggregatable {
- /**
- * @see RawAggregator#getGroupbyKeyValues()
- * @see eagle.query.aggregate.timeseries.TimeSeriesAggregator#getGroupbyKeyValues()
- *
- * @return
- */
- public List<GroupbyKeyValue> getGroupbyKeyValues();
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/afe86834/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/raw/GroupbyKeyComparator.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/raw/GroupbyKeyComparator.java b/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/raw/GroupbyKeyComparator.java
deleted file mode 100755
index 57dc9e0..0000000
--- a/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/raw/GroupbyKeyComparator.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 eagle.query.aggregate.raw;
-
-import org.apache.hadoop.hbase.util.Bytes;
-import org.apache.hadoop.io.BytesWritable;
-
-import java.util.Comparator;
-import java.util.List;
-import java.util.ListIterator;
-
-public class GroupbyKeyComparator implements Comparator<GroupbyKey>{
- @Override
- public int compare(GroupbyKey key1, GroupbyKey key2){
- List<BytesWritable> list1 = key1.getValue();
- List<BytesWritable> list2 = key2.getValue();
-
- if(list1 == null || list2 == null || list1.size() != list2.size())
- throw new IllegalArgumentException("2 list of groupby fields must be non-null and have the same size");
- ListIterator<BytesWritable> e1 = list1.listIterator();
- ListIterator<BytesWritable> e2 = list2.listIterator();
- while(e1.hasNext() && e2.hasNext()){
- int r = Bytes.compareTo(e1.next().copyBytes(), e2.next().copyBytes());
- if(r != 0)
- return r;
- }
- return 0;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/afe86834/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/raw/GroupbyKeyValue.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/raw/GroupbyKeyValue.java b/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/raw/GroupbyKeyValue.java
deleted file mode 100755
index 519bc78..0000000
--- a/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/raw/GroupbyKeyValue.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 eagle.query.aggregate.raw;
-
-import org.apache.hadoop.io.Writable;
-
-import java.io.DataInput;
-import java.io.DataOutput;
-import java.io.IOException;
-
-/**
- * <h3>Groupby KeyValue Structure</h3>
- * <pre>
- * {
- * key: GroupbyKey
- * value: GroupbyValue
- * }
- * </pre>
- * @see GroupbyKey
- * @see GroupbyValue
- *
- * @since : 11/4/14,2014
- */
-public class GroupbyKeyValue implements Writable {
- private GroupbyKey key;
- private GroupbyValue value;
- public GroupbyKeyValue(){
- this.key = new GroupbyKey();
- this.value = new GroupbyValue();
- }
- public GroupbyKeyValue(GroupbyKey key,GroupbyValue value){
- this.key = key;
- this.value = value;
- }
- public GroupbyKey getKey() {
- return key;
- }
-
- public void setKey(GroupbyKey key) {
- this.key = key;
- }
-
- public GroupbyValue getValue() {
- return value;
- }
-
- public void setValue(GroupbyValue value) {
- this.value = value;
- }
-
- /**
- * Serialize the fields of this object to <code>out</code>.
- *
- * @param out <code>DataOuput</code> to serialize this object into.
- * @throws java.io.IOException
- */
- @Override
- public void write(DataOutput out) throws IOException {
- this.key.write(out);
- this.value.write(out);
- }
-
- /**
- * Deserialize the fields of this object from <code>in</code>.
- * <p/>
- * <p>For efficiency, implementations should attempt to re-use storage in the
- * existing object where possible.</p>
- *
- * @param in <code>DataInput</code> to deseriablize this object from.
- * @throws java.io.IOException
- */
- @Override
- public void readFields(DataInput in) throws IOException {
- this.key.readFields(in);
- this.value.readFields(in);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/afe86834/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/raw/GroupbyKeyValueCreationListener.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/raw/GroupbyKeyValueCreationListener.java b/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/raw/GroupbyKeyValueCreationListener.java
deleted file mode 100755
index 6598315..0000000
--- a/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/raw/GroupbyKeyValueCreationListener.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 eagle.query.aggregate.raw;
-
-/**
- * @since : 11/11/14,2014
- */
-public interface GroupbyKeyValueCreationListener {
- void keyValueCreated(GroupbyKeyValue kv);
-}
http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/afe86834/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/raw/GroupbyValue.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/raw/GroupbyValue.java b/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/raw/GroupbyValue.java
deleted file mode 100755
index bfd1623..0000000
--- a/eagle-core/eagle-query/eagle-query-base/src/main/java/eagle/query/aggregate/raw/GroupbyValue.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 eagle.query.aggregate.raw;
-
-import eagle.common.ByteUtil;
-import org.apache.hadoop.io.BytesWritable;
-import org.apache.hadoop.io.DoubleWritable;
-import org.apache.hadoop.io.Writable;
-
-import java.io.DataInput;
-import java.io.DataOutput;
-import java.io.IOException;
-
-/**
- * <h3>Strucutre</h3>
- * <pre>
- * {
- * value: List[byte[],...],
- * meta : List[byte[],...] // byte[] may be serialized value
- * // of any type of value like:
- * // Integer,Double or Object
- * // and so on
- * }
- * </pre>
- *
- * TODO: Add self-described serializer or deserializer for meta bytes array, so that any side of the RPC will know how to read/write meta information
- *
- * @since : 11/4/14,2014
- */
-public class GroupbyValue implements Writable{
- private final WritableList<DoubleWritable> value;
- private WritableList<BytesWritable> meta;
- private int initialCapacity=1;
- public GroupbyValue(){
- this(1);
- }
- /**
- * Constructs an empty list with the specified initial capacity.
- *
- * @param initialCapacity the initial capacity of the list
- * @exception IllegalArgumentException if the specified initial capacity
- * is negative
- */
- public GroupbyValue(int initialCapacity ){
- this.initialCapacity = initialCapacity;
- this.value = new WritableList<DoubleWritable>(DoubleWritable.class,this.initialCapacity);
- this.meta = new WritableList<BytesWritable>(BytesWritable.class,this.initialCapacity);
- }
-
- public WritableList<DoubleWritable> getValue(){
- return this.value;
- }
-
- public WritableList<BytesWritable> getMeta(){
- return this.meta;
- }
-
- public DoubleWritable get(int index){
- return this.value.get(index);
- }
-
- public BytesWritable getMeta(int index){
- if(this.meta==null) return null;
- return this.meta.get(index);
- }
-
- // Values
- public void add(DoubleWritable value){
- this.value.add(value);
- }
- public void add(Double value){
- this.value.add(new DoubleWritable(value));
- }
-
- public void set(int index,DoubleWritable value){
- this.value.set(index, value);
- }
-
- //////////////
- // Meta
- /////////////
- public void addMeta(BytesWritable meta){
- this.meta.add(meta);
- }
-
- public void addMeta(int meta){
- this.meta.add(new BytesWritable(ByteUtil.intToBytes(meta)));
- }
-
- public void setMeta(int index,BytesWritable meta){
- this.meta.set(index,meta);
- }
- public void setMeta(int index,int meta){
- this.meta.set(index, new BytesWritable(ByteUtil.intToBytes(meta)));
- }
-
- /**
- * Serialize the fields of this object to <code>out</code>.
- *
- * @param out <code>DataOuput</code> to serialize this object into.
- * @throws java.io.IOException
- */
- @Override
- public void write(DataOutput out) throws IOException {
- out.writeInt(this.initialCapacity);
- this.value.write(out);
- this.meta.write(out);
- }
-
- /**
- * Deserialize the fields of this object from <code>in</code>.
- * <p/>
- * <p>For efficiency, implementations should attempt to re-use storage in the
- * existing object where possible.</p>
- *
- * @param in <code>DataInput</code> to deseriablize this object from.
- * @throws java.io.IOException
- */
- @Override
- public void readFields(DataInput in) throws IOException {
- this.initialCapacity = in.readInt();
- this.value.readFields(in);
- this.meta.readFields(in);
- }
-}
\ No newline at end of file