package com.senseidb.clue.commands; import java.io.PrintStream; import java.util.Random; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.search.Query; import com.senseidb.clue.ClueContext; import com.senseidb.clue.util.MatchSomeDocsQuery; public class IndexTrimCommand extends ClueCommand { public IndexTrimCommand(ClueContext ctx) { super(ctx); } @Override public String getName() { return "trim"; } @Override public String help() { return "trims the index, <TRIM PERCENTAGE>"; } private static Query buildDeleteQuery(final int percentToDelete) { assert percentToDelete >= 0 && percentToDelete <= 100; final Random rand = new Random(); return new MatchSomeDocsQuery() { @Override public String toString(String field) { return null; } @Override protected boolean match(int docId) { int guess = rand.nextInt(100); if (guess < percentToDelete) { return true; } return false; } }; } @Override public void execute(String[] args, PrintStream out) throws Exception { if (args.length < 1) { out.println("usage: <TRIM PERCENTAGE>"); return; } int trimPercent = Integer.parseInt(args[0]); if (trimPercent < 0 || trimPercent > 100) { throw new IllegalArgumentException("invalid percent: " + trimPercent); } IndexWriter writer = ctx.getIndexWriter(); if (writer != null) { IndexReader reader = ctx.getIndexReader(); writer.deleteDocuments(buildDeleteQuery(trimPercent)); writer.commit(); ctx.refreshReader(); reader = ctx.getIndexReader(); out.println("trim successful, index now contains: " + reader.numDocs() + " docs."); } else { out.println("unable to open writer, index is in readonly mode"); } } }