All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.dell.doradus.olap.aggregate.MetricCounter Maven / Gradle / Ivy

The newest version!
/*
 * Copyright (C) 2014 Dell, Inc.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *     http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.dell.doradus.olap.aggregate;

import com.dell.doradus.common.FieldDefinition;
import com.dell.doradus.common.FieldType;
import com.dell.doradus.olap.search.Result;
import com.dell.doradus.olap.store.CubeSearcher;
import com.dell.doradus.olap.store.FieldSearcher;
import com.dell.doradus.olap.store.IntIterator;
import com.dell.doradus.olap.store.NumSearcherMV;

public abstract class MetricCounter {
	
	public abstract void add(int doc, IMetricValue value);

	public static class FilteredCounter extends MetricCounter {
		private Result m_filter;
		private MetricCounter m_inner;
		public FilteredCounter(Result filter, MetricCounter inner) {
			m_filter = filter;
			m_inner = inner;
		}
		
		@Override public void add(int doc, IMetricValue value) {
			if(doc < 0 || m_filter.get(doc)) m_inner.add(doc, value);
		}
	}
	
	
	public static class Count extends MetricCounter {
		
		public Count() { }
		
		@Override public void add(int doc, IMetricValue value) {
			value.add(1);
		}
	}
	
	public static class Link extends MetricCounter {
		private Result m_filter;
		private FieldSearcher m_fs;
		private MetricCounter m_inner;
		private IntIterator m_iter;
		
		public Link(Result filter, FieldDefinition fieldDef, CubeSearcher cs, MetricCounter inner) {
			m_filter = filter;
			m_fs = cs.getFieldSearcher(fieldDef.getTableName(), fieldDef.getName());
			m_inner = inner;
			m_iter = new IntIterator();
		}
		
		@Override public void add(int doc, IMetricValue value) {
			m_fs.fields(doc, m_iter);
			for(int i = 0; i < m_iter.count(); i++) {
				int d = m_iter.get(i);
				if(m_filter != null && !m_filter.get(d)) continue;
				m_inner.add(d, value);
			}
		}
	}

	public static class Num extends MetricCounter {
		private NumSearcherMV m_ns;
		
		public Num(FieldDefinition fieldDef, CubeSearcher cs) {
			m_ns = cs.getNumSearcher(fieldDef.getTableName(), fieldDef.getName());
		}
		
		@Override public void add(int doc, IMetricValue value) {
			int fcount = m_ns.size((int)doc);
			for(int index = 0; index < fcount; index++) {
				value.add(m_ns.get(doc, index));
			}
		}
	}


    public static class NumRoundup extends MetricCounter {
        private NumSearcherMV m_ns;
        private boolean m_bFloat = false;
        private boolean m_bDouble = false;
        private long m_roundup;
        
        public NumRoundup(FieldDefinition fieldDef, CubeSearcher cs, long roundup) {
            m_ns = cs.getNumSearcher(fieldDef.getTableName(), fieldDef.getName());
            m_roundup = roundup;
            m_bFloat = FieldType.FLOAT.equals(fieldDef.getType());
            m_bDouble = FieldType.DOUBLE.equals(fieldDef.getType());
        }
        
        private long roundup(long value) {
            if(m_bFloat) {
                float fValue = Float.intBitsToFloat((int)value);
                float remainder = fValue % m_roundup;
                fValue -= remainder;
                if(remainder != 0) fValue += m_roundup;
                return Float.floatToIntBits(fValue);
            }
            else if(m_bDouble) {
                double dValue = Double.longBitsToDouble(value);
                double remainder = dValue % m_roundup;
                dValue -= remainder;
                if(remainder != 0) dValue += m_roundup;
                return Double.doubleToLongBits(dValue);
            }
            else {
                value += m_roundup - 1;
                value = value - value % m_roundup;
                return value;
            }
        }
        
        @Override public void add(int doc, IMetricValue value) {
            int fcount = m_ns.size((int)doc);
            for(int index = 0; index < fcount; index++) {
                long number = m_ns.get(doc, index);
                number = roundup(number);
                value.add(number);
            }
        }
    }

    
	
	public static class NumCount extends MetricCounter {
		private NumSearcherMV m_ns;
		
		public NumCount(FieldDefinition fieldDef, CubeSearcher cs) {
			m_ns = cs.getNumSearcher(fieldDef.getTableName(), fieldDef.getName());
		}
		
		@Override public void add(int doc, IMetricValue value) {
			int fcount = m_ns.size((int)doc);
			value.add(fcount);
		}
	}
	
	public static class FieldCount extends MetricCounter {
		private Result m_filter;
		private FieldSearcher m_fs;
		private IntIterator m_iter;
		
		public FieldCount(Result filter, FieldDefinition fieldDef, CubeSearcher cs) {
			m_filter = filter;
			m_fs = cs.getFieldSearcher(fieldDef.getTableName(), fieldDef.getName());
			m_iter = new IntIterator();
		}
		
		@Override public void add(int doc, IMetricValue value) {
			m_fs.fields(doc, m_iter);
			int val = 0;
			if(m_filter == null) val = m_iter.count();
			else {
				for(int i = 0; i < m_iter.count(); i++) {
					int d = m_iter.get(i);
					if(m_filter != null && !m_filter.get(d)) continue;
					val++;
				}
			}
			value.add(val);
		}
	}
	
	public static class FieldValue extends MetricCounter {
		private Result m_filter;
		private FieldSearcher m_fs;
		private IntIterator m_iter;
		
		public FieldValue(Result filter, FieldDefinition fieldDef, CubeSearcher cs) {
			m_filter = filter;
			m_fs = cs.getFieldSearcher(fieldDef.getTableName(), fieldDef.getName());
			m_iter = new IntIterator();
		}
		
		@Override public void add(int doc, IMetricValue value) {
			m_fs.fields(doc, m_iter);

			for(int i = 0; i < m_iter.count(); i++) {
				int d = m_iter.get(i);
				if(m_filter != null && !m_filter.get(d)) continue;
				value.add(d);
			}
		}
	}
	

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy