// Path: src/java/org/apache/cassandra/db/index/sasi/analyzer/AbstractAnalyzer.java
// public abstract class AbstractAnalyzer implements Iterator<ByteBuffer>
// {
//     protected ByteBuffer next = null;
// 
//     @Override
//     public ByteBuffer next()
//     {
//         return next;
//     }
// 
//     @Override
//     public void remove()
//     {
//         throw new UnsupportedOperationException();
//     }
// 
//     public abstract void init(Map<String, String> options, AbstractType validator);
// 
//     public abstract void reset(ByteBuffer input);
// 
//     public static String normalize(String original)
//     {
//         return Normalizer.isNormalized(original, Normalizer.Form.NFC)
//                 ? original
//                 : Normalizer.normalize(original, Normalizer.Form.NFC);
//     }
// }
// 
// Path: src/java/org/apache/cassandra/db/index/sasi/conf/view/View.java
// public class View implements Iterable<SSTableIndex>
// {
//     private final Map<Descriptor, SSTableIndex> view;
// 
//     private final TermTree termTree;
//     private final IntervalTree<ByteBuffer, SSTableIndex, Interval<ByteBuffer, SSTableIndex>> keyIntervalTree;
// 
//     public View(ColumnIndex index, AbstractType<?> keyValidator, Set<SSTableIndex> indexes)
//     {
//         this(index, keyValidator, Collections.<SSTableIndex>emptyList(), Collections.<SSTableReader>emptyList(), indexes);
//     }
// 
//     public View(ColumnIndex index, AbstractType<?> keyValidator,
//                 Collection<SSTableIndex> currentView,
//                 Collection<SSTableReader> oldSSTables,
//                 Set<SSTableIndex> newIndexes)
//     {
//         Map<Descriptor, SSTableIndex> newView = new HashMap<>();
// 
//         AbstractType<?> validator = index.getValidator();
//         TermTree.Builder termTreeBuilder = (validator instanceof AsciiType || validator instanceof UTF8Type)
//                                             ? new PrefixTermTree.Builder(index.getMode().mode, validator)
//                                             : new RangeTermTree.Builder(index.getMode().mode, validator);
// 
//         List<Interval<ByteBuffer, SSTableIndex>> keyIntervals = new ArrayList<>();
//         for (SSTableIndex sstableIndex : Iterables.concat(currentView, newIndexes))
//         {
//             SSTableReader sstable = sstableIndex.getSSTable();
//             if (oldSSTables.contains(sstable) || sstable.isMarkedCompacted() || newView.containsKey(sstable.descriptor))
//             {
//                 sstableIndex.release();
//                 continue;
//             }
// 
//             newView.put(sstable.descriptor, sstableIndex);
// 
//             termTreeBuilder.add(sstableIndex);
//             keyIntervals.add(Interval.create(sstableIndex.minKey(), sstableIndex.maxKey(), sstableIndex));
//         }
// 
//         this.view = newView;
//         this.termTree = termTreeBuilder.build();
//         this.keyIntervalTree = IntervalTree.build(keyIntervals, keyValidator);
// 
//         if (keyIntervalTree.intervalCount() != termTree.intervalCount())
//             throw new IllegalStateException(String.format("mismatched sizes for intervals tree for keys vs terms: %d != %d", keyIntervalTree.intervalCount(), termTree.intervalCount()));
//     }
// 
//     public Set<SSTableIndex> match(final Set<SSTableReader> scope, Expression expression)
//     {
//         return Sets.filter(termTree.search(expression), new Predicate<SSTableIndex>()
//         {
//             @Override
//             public boolean apply(SSTableIndex index)
//             {
//                 return scope.contains(index.getSSTable());
//             }
//         });
//     }
// 
//     public List<SSTableIndex> match(ByteBuffer minKey, ByteBuffer maxKey)
//     {
//         return keyIntervalTree.search(Interval.create(minKey, maxKey, (SSTableIndex) null));
//     }
// 
//     @Override
//     public Iterator<SSTableIndex> iterator()
//     {
//         return view.values().iterator();
//     }
// 
//     public Collection<SSTableIndex> getIndexes()
//     {
//         return view.values();
//     }
// }


import java.util.*;
import org.apache.cassandra.config.ColumnDefinition;
import org.apache.cassandra.db.index.sasi.analyzer.AbstractAnalyzer;
import org.apache.cassandra.db.index.sasi.conf.view.View;
import org.apache.cassandra.db.marshal.AbstractType;
import org.apache.cassandra.db.marshal.AsciiType;
import org.apache.cassandra.db.marshal.UTF8Type;
import org.apache.cassandra.exceptions.ConfigurationException;
import org.apache.cassandra.io.sstable.Component;
import org.apache.cassandra.io.sstable.Descriptor;
import org.apache.cassandra.io.sstable.SSTableReader;
    public ColumnDefinition getDefinition()
    {
        return column;
    }

    public AbstractType<?> getValidator()
    {
        return column.getValidator();
    }

    public Component getComponent()
    {
        return component;
    }

    public IndexMode getMode()
    {
        return mode;
    }

    public String getColumnName()
    {
        return comparator.getString(column.name);
    }

    public String getIndexName()
    {
        return column.getIndexName();
    }

// Path: src/java/org/apache/cassandra/db/index/sasi/analyzer/AbstractAnalyzer.java
// public abstract class AbstractAnalyzer implements Iterator<ByteBuffer>
// {
//     protected ByteBuffer next = null;
// 
//     @Override
//     public ByteBuffer next()
//     {
//         return next;
//     }
// 
//     @Override
//     public void remove()
//     {
//         throw new UnsupportedOperationException();
//     }
// 
//     public abstract void init(Map<String, String> options, AbstractType validator);
// 
//     public abstract void reset(ByteBuffer input);
// 
//     public static String normalize(String original)
//     {
//         return Normalizer.isNormalized(original, Normalizer.Form.NFC)
//                 ? original
//                 : Normalizer.normalize(original, Normalizer.Form.NFC);
//     }
// }
// 
// Path: src/java/org/apache/cassandra/db/index/sasi/conf/view/View.java
// public class View implements Iterable<SSTableIndex>
// {
//     private final Map<Descriptor, SSTableIndex> view;
// 
//     private final TermTree termTree;
//     private final IntervalTree<ByteBuffer, SSTableIndex, Interval<ByteBuffer, SSTableIndex>> keyIntervalTree;
// 
//     public View(ColumnIndex index, AbstractType<?> keyValidator, Set<SSTableIndex> indexes)
//     {
//         this(index, keyValidator, Collections.<SSTableIndex>emptyList(), Collections.<SSTableReader>emptyList(), indexes);
//     }
// 
//     public View(ColumnIndex index, AbstractType<?> keyValidator,
//                 Collection<SSTableIndex> currentView,
//                 Collection<SSTableReader> oldSSTables,
//                 Set<SSTableIndex> newIndexes)
//     {
//         Map<Descriptor, SSTableIndex> newView = new HashMap<>();
// 
//         AbstractType<?> validator = index.getValidator();
//         TermTree.Builder termTreeBuilder = (validator instanceof AsciiType || validator instanceof UTF8Type)
//                                             ? new PrefixTermTree.Builder(index.getMode().mode, validator)
//                                             : new RangeTermTree.Builder(index.getMode().mode, validator);
// 
//         List<Interval<ByteBuffer, SSTableIndex>> keyIntervals = new ArrayList<>();
//         for (SSTableIndex sstableIndex : Iterables.concat(currentView, newIndexes))
//         {
//             SSTableReader sstable = sstableIndex.getSSTable();
//             if (oldSSTables.contains(sstable) || sstable.isMarkedCompacted() || newView.containsKey(sstable.descriptor))
//             {
//                 sstableIndex.release();
//                 continue;
//             }
// 
//             newView.put(sstable.descriptor, sstableIndex);
// 
//             termTreeBuilder.add(sstableIndex);
//             keyIntervals.add(Interval.create(sstableIndex.minKey(), sstableIndex.maxKey(), sstableIndex));
//         }
// 
//         this.view = newView;
//         this.termTree = termTreeBuilder.build();
//         this.keyIntervalTree = IntervalTree.build(keyIntervals, keyValidator);
// 
//         if (keyIntervalTree.intervalCount() != termTree.intervalCount())
//             throw new IllegalStateException(String.format("mismatched sizes for intervals tree for keys vs terms: %d != %d", keyIntervalTree.intervalCount(), termTree.intervalCount()));
//     }
// 
//     public Set<SSTableIndex> match(final Set<SSTableReader> scope, Expression expression)
//     {
//         return Sets.filter(termTree.search(expression), new Predicate<SSTableIndex>()
//         {
//             @Override
//             public boolean apply(SSTableIndex index)
//             {
//                 return scope.contains(index.getSSTable());
//             }
//         });
//     }
// 
//     public List<SSTableIndex> match(ByteBuffer minKey, ByteBuffer maxKey)
//     {
//         return keyIntervalTree.search(Interval.create(minKey, maxKey, (SSTableIndex) null));
//     }
// 
//     @Override
//     public Iterator<SSTableIndex> iterator()
//     {
//         return view.values().iterator();
//     }
// 
//     public Collection<SSTableIndex> getIndexes()
//     {
//         return view.values();
//     }
// }


// Path: src/java/org/apache/cassandra/db/index/sasi/conf/ColumnIndex.java
import java.util.*;
import org.apache.cassandra.config.ColumnDefinition;
import org.apache.cassandra.db.index.sasi.analyzer.AbstractAnalyzer;
import org.apache.cassandra.db.index.sasi.conf.view.View;
import org.apache.cassandra.db.marshal.AbstractType;
import org.apache.cassandra.db.marshal.AsciiType;
import org.apache.cassandra.db.marshal.UTF8Type;
import org.apache.cassandra.exceptions.ConfigurationException;
import org.apache.cassandra.io.sstable.Component;
import org.apache.cassandra.io.sstable.Descriptor;
import org.apache.cassandra.io.sstable.SSTableReader;

    public ColumnDefinition getDefinition()
    {
        return column;
    }

    public AbstractType<?> getValidator()
    {
        return column.getValidator();
    }

    public Component getComponent()
    {
        return component;
    }

    public IndexMode getMode()
    {
        return mode;
    }

    public String getColumnName()
    {
        return comparator.getString(column.name);
    }

    public String getIndexName()
    {
        return column.getIndexName();
    }

    public AbstractAnalyzer getAnalyzer()