package com.senseidb.clue.commands; import java.io.PrintStream; import java.util.ArrayList; import java.util.List; import org.apache.lucene.index.LeafReader; import org.apache.lucene.index.LeafReaderContext; import org.apache.lucene.index.FieldInfo; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.NumericDocValues; import com.senseidb.clue.ClueContext; public class NormsCommand extends ClueCommand { public NormsCommand(ClueContext ctx) { super(ctx); } @Override public String getName() { return "norm"; } @Override public String help() { return "displays norm values for a field for a list of documents"; } private void showDocId(int docid, int docBase, NumericDocValues docVals, PrintStream out, int segmentid) throws Exception { int subid = docid - docBase; if (docVals != null) { String val = String.valueOf(docVals.get(subid)); if (val == null) { out.println("cannot read norm for docid: " + docid + ", subid: " + subid); } else { out.println("norm: "+val + ", segment: " + segmentid + ", docid: " + docid + ", subid: " + subid); } } else { out.println("doc value unavailable"); } } @Override public void execute(String[] args, PrintStream out) throws Exception { if (args.length < 1) { out.println("usage: field doc1,doc2..."); return; } String field = args[0]; IndexReader reader = getContext().getIndexReader(); List<Integer> docidList = new ArrayList<Integer>(); int numPerPage = 20; try { String[] docListStrings = args[1].split(","); for (String s : docListStrings) { docidList.add(Integer.parseInt(s)); } } catch (Exception e) { out.println("invalid docid, all docs are shown"); docidList = null; } List<LeafReaderContext> leaves = reader.leaves(); if (docidList != null && !docidList.isEmpty()) { for (int i = leaves.size() - 1; i >= 0; --i) { LeafReaderContext ctx = leaves.get(i); for (Integer docid : docidList) { if (ctx.docBase <= docid) { LeafReader atomicReader = ctx.reader(); FieldInfo finfo = atomicReader.getFieldInfos().fieldInfo(field); if (finfo == null || !finfo.hasNorms()) { out.println("norm does not exist for field: " + field); return; } showDocId(docid, ctx.docBase, atomicReader.getNormValues(field), out, i); } } } out.flush(); return; } else { for (int i = 0; i < leaves.size(); ++i) { LeafReaderContext ctx = leaves.get(i); LeafReader atomicReader = ctx.reader(); FieldInfo finfo = atomicReader.getFieldInfos().fieldInfo(field); if (finfo == null || !finfo.hasNorms()) { out.println("norm does not exist for field: " + field); break; } int maxDoc = atomicReader.maxDoc(); for (int k = 0; k < maxDoc; ++k) { showDocId(k + ctx.docBase, ctx.docBase, atomicReader.getNormValues(field), out, i); if (getContext().isInteractiveMode() && (k+1) % numPerPage == 0){ out.println("Ctrl-D to break"); int ch = System.in.read(); if (ch == -1) { out.flush(); return; } } } out.flush(); } return; } } }