/** * 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.tajo.engine.planner.physical; import com.google.common.base.Preconditions; import org.apache.tajo.catalog.Schema; import org.apache.tajo.datum.Datum; import org.apache.tajo.datum.NullDatum; import org.apache.tajo.storage.Tuple; import java.util.Comparator; public class SetTupleComparator implements Comparator<Tuple> { private int numCompKey; private Datum outer; private Datum inner; private int compVal; public SetTupleComparator(Schema leftschema, Schema rightschema) { Preconditions.checkArgument(leftschema.size() == rightschema.size(), "The size of both side schema must be equals, but they are different: " + leftschema.size() + " and " + rightschema.size()); this.numCompKey = leftschema.size(); // because it is guaranteed that the size of both schemas are the same } @Override public int compare(Tuple outerTuple, Tuple innerTuple) { for (int i = 0; i < numCompKey; i++) { outer = (outerTuple == null) ? NullDatum.get() : outerTuple.asDatum(i); inner = (innerTuple == null) ? NullDatum.get() : innerTuple.asDatum(i); if (outer.isNull()) { // NullDatum can handle comparison with all types of Datum compVal = outer.compareTo(inner); } else if(inner.isNull()) { // NullDatum is greater than any non NullDatums in Tajo compVal = -1; } else { // Both tuple are not NullDatum compVal = outer.compareTo(inner); } if (compVal != 0) { return compVal; } } return 0; } }