/*
* 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.cassandra.index.sasi.utils;
import java.nio.ByteBuffer;
import java.util.*;
import org.apache.cassandra.index.sasi.disk.*;
import org.apache.cassandra.index.sasi.disk.OnDiskIndex.DataTerm;
import org.apache.cassandra.db.marshal.AbstractType;
public class CombinedTerm implements CombinedValue<DataTerm>
{
private final AbstractType<?> comparator;
private final DataTerm term;
private final List<DataTerm> mergedTerms = new ArrayList<>();
public CombinedTerm(AbstractType<?> comparator, DataTerm term)
{
this.comparator = comparator;
this.term = term;
}
public ByteBuffer getTerm()
{
return term.getTerm();
}
public boolean isPartial()
{
return term.isPartial();
}
public RangeIterator<Long, Token> getTokenIterator()
{
RangeIterator.Builder<Long, Token> union = RangeUnionIterator.builder();
union.add(term.getTokens());
mergedTerms.stream().map(OnDiskIndex.DataTerm::getTokens).forEach(union::add);
return union.build();
}
public TokenTreeBuilder getTokenTreeBuilder()
{
return new StaticTokenTreeBuilder(this).finish();
}
public void merge(CombinedValue<DataTerm> other)
{
if (!(other instanceof CombinedTerm))
return;
CombinedTerm o = (CombinedTerm) other;
assert comparator == o.comparator;
mergedTerms.add(o.term);
}
public DataTerm get()
{
return term;
}
public int compareTo(CombinedValue<DataTerm> o)
{
return term.compareTo(comparator, o.get().getTerm());
}
}