///*
// * To change this template, choose Tools | Templates
// * and open the template in the editor.
// */
//package com.taobao.ustore.repo.je;
//
//import java.io.StringReader;
//import java.util.ArrayList;
//import java.util.Arrays;
//import java.util.List;
//
//import org.apache.lucene.analysis.Analyzer;
//import org.apache.lucene.analysis.TokenStream;
//import org.apache.lucene.analysis.cjk.CJKAnalyzer;
//import org.apache.lucene.analysis.tokenattributes.TermAttribute;
//import org.apache.lucene.util.Version;
//
//import com.taobao.ustore.common.config.schema.internal.ColumnMeta;
//import com.taobao.ustore.common.config.schema.internal.IndexMeta;
//import com.taobao.ustore.common.inner.CodecFactory;
//import com.taobao.ustore.common.inner.KVPair;
//import com.taobao.ustore.common.inner.bean.CloneableRecord;
//import com.taobao.ustore.common.inner.bean.RecordCodec;
//import com.taobao.ustore.common.util.ExecUtil;
//
///**
// * 从主索引记录中生成二级索引键值
// *
// * @author jianxing <jianxing.qx@taobao.com>
// */
//public class SecondaryKeyGen {
//
// IndexMeta secondaryMeta;
// IndexMeta primaryMeta;
// static Analyzer analyzer = new CJKAnalyzer(Version.LUCENE_35);
//
// public SecondaryKeyGen(IndexMeta primaryMeta, IndexMeta secondaryMeta) {
// this.primaryMeta = primaryMeta;
// this.secondaryMeta = secondaryMeta;
// }
//
// final String getCacheKey(ColumnMeta[] columns, String prefix) {
// String cacheKey = primaryMeta.getTableName() + "_" + prefix;
// for (ColumnMeta column : columns) {
// cacheKey += "_" + column.getName();
// }
// return cacheKey;
// }
//
// /**
// * todo:这里默认把主键作为二级索引的值,需要改成指定列的值。
// *
// * @param primaryKey
// * @param primaryValue
// * @return
// */
// public KVPair createSecondaryRecord(CloneableRecord primaryKey, CloneableRecord primaryValue) {
// //RecordCodec secondaryKeyCodec = ThreadLocalCodec.getThreadLocalCodec(cache_key_sk, secondaryMeta.getKeyColumns())[0];
// RecordCodec secondaryKeyCodec = CodecFactory.getInstance(CodecFactory.FIXED_LENGTH).getCodec(Arrays.asList(secondaryMeta.getKeyColumns()));
// CloneableRecord record = secondaryKeyCodec.newEmptyRecord();
// for (ColumnMeta column : secondaryMeta.getKeyColumns()) {
// String columnName = column.getName();
// Object value = null;
//
// if( (value =ExecUtil.get(column, primaryValue)) == null ){
//
// value = ExecUtil.get(column, primaryKey);
// }
//
// record.put(columnName, value);
// }
//
// //System.out.println("生成二级索引:"+record+","+primaryKey);
// return new KVPair(record, primaryKey);
// }
//
// public KVPair createSecondaryRecord(byte[] primaryKey, byte[] primaryValue) {
// //RecordCodec primaryKeyCodec = ThreadLocalCodec.getThreadLocalCodec(cache_key_pk, primaryMeta.getKeyColumns())[0];
// RecordCodec primaryKeyCodec = CodecFactory.getInstance(CodecFactory.FIXED_LENGTH).getCodec(Arrays.asList(primaryMeta.getKeyColumns()));
// RecordCodec primaryValueCodec = CodecFactory.getInstance(CodecFactory.FIXED_LENGTH).getCodec(Arrays.asList(primaryMeta.getValueColumns()));
// return createSecondaryRecord(primaryKeyCodec.decode(primaryKey, true), primaryValueCodec.decode(primaryValue, true));
// }
//
// public List<KVPair> createSecondaryRecords(byte[] primaryKey, byte[] primaryValue) {
// //RecordCodec primaryKeyCodec = ThreadLocalCodec.getThreadLocalCodec(cache_key_pk, primaryMeta.getKeyColumns())[0];
// RecordCodec primaryKeyCodec = CodecFactory.getInstance(CodecFactory.FIXED_LENGTH).getCodec(Arrays.asList(primaryMeta.getKeyColumns()));
// RecordCodec primaryValueCodec = CodecFactory.getInstance(CodecFactory.FIXED_LENGTH).getCodec(Arrays.asList(primaryMeta.getValueColumns()));
// return createSecondaryRecords(primaryKeyCodec.decode(primaryKey, true), primaryValueCodec.decode(primaryValue, true));
// }
//
// public List<KVPair> createSecondaryRecords(CloneableRecord primaryKey, CloneableRecord primaryValue) {
// List<KVPair> ret = new ArrayList();
// RecordCodec secondaryKeyCodec = CodecFactory.getInstance(CodecFactory.FIXED_LENGTH).getCodec(Arrays.asList(secondaryMeta.getKeyColumns()));
// for (ColumnMeta column : secondaryMeta.getKeyColumns()) {
// String columnName = column.getName();
// Object value = null;
// if (ExecUtil.get(column, primaryValue) != null) {
// value = ExecUtil.get(column, primaryValue).toString();
// } else if (ExecUtil.get(column, primaryKey) != null) {
// value = ExecUtil.get(column, primaryKey).toString();
// }
// //analyze value.
// if (!(value instanceof String)) {
// throw new RuntimeException("secondary key field must be string.");
// }
// TokenStream ts = analyzer.tokenStream("", new StringReader((String) value));
// ts.addAttribute(TermAttribute.class);
// try {
// while (ts.incrementToken()) {
// CloneableRecord record = secondaryKeyCodec.newEmptyRecord();
// String term = ts.getAttribute(TermAttribute.class).term();
// record.put(columnName, term);
// ret.add(new KVPair(record, primaryKey));
// }
// } catch (Exception ex) {
// throw new RuntimeException("analyze error", ex);
// }
// }
// //System.out.println("生成二级索引:"+kv.key+","+kv.value);
// //return new KVPair(record, primaryKey);
// return ret;
// }
//
// public RecordCodec getSecondaryKeyCodec() {
// return CodecFactory.getInstance(CodecFactory.FIXED_LENGTH).getCodec(Arrays.asList(secondaryMeta.getKeyColumns()));
// }
//
// public static List<String> analyze(String s) {
// List<String> ret = new ArrayList();
//
// TokenStream ts = analyzer.tokenStream("", new StringReader(s));
// ts.addAttribute(TermAttribute.class);
// try {
// while (ts.incrementToken()) {
// String term = ts.getAttribute(TermAttribute.class).term();
// ret.add(term);
// }
// } catch (Exception ex) {
// throw new RuntimeException("analyze error", ex);
// }
// return ret;
// }
//
// public static void main(String[] args) {
// System.out.println(analyze("0,1 1"));
// }
//
// public static Analyzer getAnalyzer() {
// return analyzer;
// }
//
// public static void setAnalyzer(Analyzer analyzer) {
// SecondaryKeyGen.analyzer = analyzer;
// }
//}