/** * 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 com.alibaba.jstorm.common.metric.old; import java.util.ArrayList; import java.util.Collection; import java.util.Comparator; import java.util.List; import java.util.TreeSet; import com.alibaba.jstorm.common.metric.old.operator.convert.Convertor; import com.alibaba.jstorm.common.metric.old.operator.merger.Merger; import com.alibaba.jstorm.common.metric.old.operator.updater.Updater; import com.alibaba.jstorm.common.metric.old.window.Metric; public class Top<T> extends Metric<List<T>, TreeSet<T>> { private static final long serialVersionUID = 4990212679365713831L; final protected Comparator<T> comparator; final protected int n; public Top(Comparator<T> comparator, int n) { this.comparator = comparator; this.n = n; this.defaultValue = new TreeSet<T>(comparator); this.updater = new Top.TopUpdator<T>(comparator, n); this.merger = new Top.TopMerger<T>(comparator, n); this.convertor = new Top.SetToList<T>(); init(); } public static class TopUpdator<T> implements Updater<TreeSet<T>> { private static final long serialVersionUID = -3940041101182079146L; final protected Comparator<T> comparator; final protected int n; public TopUpdator(Comparator<T> comparator, int n) { this.comparator = comparator; this.n = n; } @SuppressWarnings("unchecked") @Override public TreeSet<T> update(Number object, TreeSet<T> cache, Object... others) { // TODO Auto-generated method stub if (cache == null) { cache = new TreeSet<T>(comparator); } cache.add((T) object); if (cache.size() > n) { cache.remove(cache.last()); } return cache; } @Override public TreeSet<T> updateBatch(TreeSet<T> object, TreeSet<T> cache, Object... objects) { // TODO Auto-generated method stub if (cache == null) { cache = new TreeSet<T>(comparator); } cache.addAll(object); while (cache.size() > n) { cache.remove(cache.last()); } return cache; } } public static class TopMerger<T> implements Merger<TreeSet<T>> { private static final long serialVersionUID = 4478867986986581638L; final protected Comparator<T> comparator; final protected int n; public TopMerger(Comparator<T> comparator, int n) { this.comparator = comparator; this.n = n; } @Override public TreeSet<T> merge(Collection<TreeSet<T>> objs, TreeSet<T> unflushed, Object... others) { // TODO Auto-generated method stub TreeSet<T> temp = new TreeSet<T>(comparator); if (unflushed != null) { temp.addAll(unflushed); } for (TreeSet<T> set : objs) { temp.addAll(set); } if (temp.size() <= n) { return temp; } TreeSet<T> ret = new TreeSet<T>(comparator); int i = 0; for (T item : temp) { if (i < n) { ret.add(item); i++; } else { break; } } return ret; } } public static class SetToList<T> implements Convertor<TreeSet<T>, List<T>> { private static final long serialVersionUID = 4968816655779625255L; @Override public List<T> convert(TreeSet<T> set) { // TODO Auto-generated method stub List<T> ret = new ArrayList<T>(); if (set != null) { for (T item : set) { ret.add(item); } } return ret; } } }