/* * 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 org.apache.hadoop.hbase.codec.prefixtree.encode.tokenize; import java.util.Comparator; import org.apache.hadoop.hbase.classification.InterfaceAudience; /** * Determines order of nodes in the output array. Maybe possible to optimize further. */ @InterfaceAudience.Private public class TokenDepthComparator implements Comparator<TokenizerNode> { @Override public int compare(TokenizerNode a, TokenizerNode b) { if(a==null){ throw new IllegalArgumentException("a cannot be null"); } if(b==null){ throw new IllegalArgumentException("b cannot be null"); } // put leaves at the end if (!a.isLeaf() && b.isLeaf()) { return -1; } if (a.isLeaf() && !b.isLeaf()) { return 1; } if (a.isLeaf() && b.isLeaf()) {// keep leaves in sorted order (for debugability) return a.getId() < b.getId() ? -1 : 1; } // compare depth if (a.getTokenOffset() < b.getTokenOffset()) { return -1; } if (a.getTokenOffset() > b.getTokenOffset()) { return 1; } // if same depth, return lower id first. ids are unique return a.getId() < b.getId() ? -1 : 1; } }