com.barchart.feed.ddf.resolver.provider.CodecHelper.java Source code

Java tutorial

Introduction

Here is the source code for com.barchart.feed.ddf.resolver.provider.CodecHelper.java

Source

/**
 * Copyright (C) 2011-2012 Barchart, Inc. <http://www.barchart.com/>
 *
 * All rights reserved. Licensed under the OSI BSD License.
 *
 * http://www.opensource.org/licenses/bsd-license.php
 */
package com.barchart.feed.ddf.resolver.provider;

import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.PrefixQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.WildcardQuery;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.barchart.feed.api.model.meta.Instrument;
import com.barchart.feed.base.enums.ParaEnumBase;
import com.barchart.feed.base.values.api.PriceValue;
import com.barchart.feed.base.values.api.SizeValue;
import com.barchart.feed.base.values.api.TimeValue;
import com.barchart.feed.base.values.api.Value;
import com.barchart.feed.base.values.provider.ValueBuilder;

class CodecHelper {

    @SuppressWarnings("unused")
    private static Logger log = LoggerFactory.getLogger(CodecHelper.class);

    //

    static String SEPARATOR_ALPHA = "|";

    static String SEPARATOR_REGEX = "\\" + SEPARATOR_ALPHA;

    //

    /** lucene doc uuid */
    static final String FIELD_INST_ID = "@INST_ID";

    /** lucene doc index */
    static final String FIELD_INST_BODY = "@INST_BODY";

    //

    static <T extends Enum<T>> T enumFrom(final Class<T> klaz, final String name) {
        try {
            return Enum.valueOf(klaz, name);
        } catch (final Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    static String encode(final PriceValue price) {
        return price.mantissa() + SEPARATOR_ALPHA + price.exponent();
    }

    static String encode(final SizeValue size) {
        return Long.toString(size.asLong());
    }

    static String encode(final TimeValue time) {
        return Long.toString(time.asMillisUTC());
    }

    static String encode(final Enum<?> num) {
        return num.name();
    }

    static String encode(final ParaEnumBase<?, ?> num) {
        return num.guid();
    }

    //   static String encode(final Tag<?> field, final Object value) {
    //
    //      if (field.classType().equals(TextValue.class)) {
    //         return value.toString();
    //      }
    //
    //      if (field.classType().equals(PriceValue.class)) {
    //         return encode((PriceValue) value);
    //      }
    //
    //      if (field.classType().equals(SizeValue.class)) {
    //         return encode((SizeValue) value);
    //      }
    //
    //      if (field.classType().equals(TimeValue.class)) {
    //         return encode((TimeValue) value);
    //      }
    //
    //      if (field.isEnum()) {
    //         return encode((Enum<?>) value);
    //      }
    //
    //      if (field.classType().equals(ParaEnumBase.class)) {
    //         return encode((ParaEnumBase<?, ?>) value);
    //      }
    //
    //      throw new RuntimeException("wrong field : " + field);
    //
    //   }

    //   @SuppressWarnings("unchecked")
    //   static Object decode(final Tag<?> field, final String value) {
    //
    //      if (field.classType().equals(TextValue.class)) {
    //         return ValueBuilder.newText(value);
    //      }
    //
    //      if (field.classType().equals(PriceValue.class)) {
    //         return decodePrice(value);
    //      }
    //
    //      if (field.classType().equals(SizeValue.class)) {
    //         return decodeSize(value);
    //      }
    //
    //      if (field.classType().equals(TimeValue.class)) {
    //         return decodeTime(value);
    //      }
    //
    //      if (field.isEnum()) {
    //         @SuppressWarnings("rawtypes")
    //         final Class klaz = field.classType();
    //         final Enum<?> enuma = enumFrom(klaz, value);
    //         return enuma;
    //      }
    //
    //      if (field.classType().equals(ParaEnumBase.class)) {
    //         @SuppressWarnings("rawtypes")
    //         final Class klaz = field.classType();
    //         final DictEnum<?>[] array = ParaEnumBase.valuesFor(klaz);
    //         for (final DictEnum<?> dict : array) {
    //            if (field.name().equals(dict.name())) {
    //               return dict;
    //            }
    //         }
    //         return null;
    //      }
    //
    //      throw new RuntimeException("wrong field : " + field);
    //
    //   }

    static PriceValue decodePrice(final String value) {
        final String[] array = value.split(SEPARATOR_REGEX);
        final long mantissa = Long.parseLong(array[0]);
        final int exponent = Integer.parseInt(array[1]);
        return ValueBuilder.newPrice(mantissa, exponent);
    }

    static SizeValue decodeSize(final String value) {
        final long size = Long.parseLong(value);
        return ValueBuilder.newSize(size);
    }

    static TimeValue decodeTime(final String value) {
        final long time = Long.parseLong(value);
        return ValueBuilder.newTime(time);
    }

    static String removeLeading(final String value, final char alpha) {
        final char[] chars = value.toCharArray();
        int index = 0;
        for (; index < value.length(); index++) {
            if (chars[index] != alpha) {
                break;
            }
        }
        return (index == 0) ? value : value.substring(index);
    }

    static String removeTrailing(final String value, final char alpha) {
        final char[] chars = value.toCharArray();
        int length, index;
        length = value.length();
        index = length - 1;
        for (; index >= 0; index--) {
            if (chars[index] != alpha) {
                break;
            }
        }
        return (index == length - 1) ? value : value.substring(0, index + 1);
    }

    static boolean hasWildcard(final String term) {
        return term.contains("*") || term.contains("?");
    }

    static Term getBodyTerm(final String term) {
        return new Term(FIELD_INST_BODY, term);
    }

    static void AND(final BooleanQuery query1, final Query query2) {
        query1.add(query2, BooleanClause.Occur.MUST);
    }

    static void OR(final BooleanQuery query1, final Query query2) {
        query1.add(query2, BooleanClause.Occur.SHOULD);
    }

    static void NOT(final BooleanQuery query1, final Query query2) {
        query1.add(query2, BooleanClause.Occur.MUST_NOT);
    }

    static Query buildQuerySimple(final String source) {

        final String[] termArray = source.split("\\s+");

        final BooleanQuery query = new BooleanQuery();

        for (final String termText : termArray) {

            final Term term = getBodyTerm(termText);

            if (hasWildcard(termText)) {
                AND(query, new WildcardQuery(term));
            } else {
                AND(query, new PrefixQuery(term));
            }

        }

        return query;

    }

    static boolean isValid(final String text) {
        if (text == null || text.length() == 0) {
            return false;
        }
        return true;
    }

    /** must be globally unique */
    static Term getKeyTerm(final Instrument instrument) {

        final String name = CodecHelper.FIELD_INST_ID;
        final String value = instrument.marketGUID();

        final Term term = new Term(name, value);

        return term;

    }

    /** convert instrument into lucene document */
    static Document instrumentEncode(final Instrument instrument) {

        final Document doc = new Document();

        {

            final Term term = getKeyTerm(instrument);

            final String name = term.field();
            final String value = term.text();

            /** store; do not index */
            final Field keyField = new Field(name, value, Field.Store.YES, Field.Index.NOT_ANALYZED);

            doc.add(keyField);

        }

        {

            final String name = CodecHelper.FIELD_INST_BODY;
            final String value = fullText(instrument);

            /** index; do not store */
            final Field bodyField = new Field(name, value, Field.Store.NO, Field.Index.ANALYZED);

            doc.add(bodyField);

        }

        // TODO If this ever need to be used, then some hardcoding
        // for iterating over the instrument fields will need to be written.

        // Currently, this isn't being used.

        //      for (final Tag<?> field : CodecHelper.BASE) {
        //
        //         final String name = field.name();
        //         final String value = encode(field, instrument.get(field));
        //
        //         /** store; do not index */
        //         final Field baseField = new Field(name, value, Field.Store.YES,
        //               Field.Index.NO);
        //
        //         doc.add(baseField);
        //
        //      }

        return doc;

    }

    //TODO
    static String fullText(final Instrument inst) {

        /*@Override
        public String fullText() {
            
           final StringBuilder text = new StringBuilder(256);
            
           text.append(get(DDF_SYMBOL_UNIVERSAL));
           text.append(SPACE);
            
           text.append(get(DDF_SYMBOL_HISTORICAL));
           text.append(SPACE);
            
           text.append(get(DDF_SYMBOL_REALTIME));
           text.append(SPACE);
            
           text.append(get(DESCRIPTION));
           text.append(SPACE);
            
           text.append(get(DDF_EXCHANGE));
           text.append(SPACE);
            
           // text.append(get(DDF_EXCHANGE).kind);
           // text.append(SPACE);
            
           text.append(get(DDF_EXCHANGE).description);
           text.append(SPACE);
            
           text.append(get(DDF_EXCH_DESC));
           text.append(SPACE);
            
           text.append(get(TYPE).getDescription());
           text.append(SPACE);
            
           addSpreadComponents(text);
            
           final TimeValue expire = get(DATE_FINISH);
           if (!expire.isNull()) {
            
        text.append(MarketDisplay.timeMonthFull(expire));
        text.append(SPACE);
            
        text.append(MarketDisplay.timeYearFull(expire));
        text.append(SPACE);
            
        text.append(MarketDisplay.timeYearShort(expire));
        text.append(SPACE);
            
           }
            
           return text.toString();
            
        }*/

        return null;
    }

    /** convert lucene document into instrument */
    static <V extends Value<V>> Instrument instrumentDecode(final Document doc) {

        // TODO Build protobuf from document then call factory
        return Instrument.NULL;

    }

    /** re index instrument in lucene store */
    static void update(final IndexWriter writer, final Instrument entry) throws Exception {

        final Term key = getKeyTerm(entry);

        final Document doc = instrumentEncode(entry);

        writer.updateDocument(key, doc);

    }

    static boolean isPresent(final IndexSearcher searcher, final Instrument instrument) throws Exception {

        final Term term = getKeyTerm(instrument);

        final Query query = new TermQuery(term);

        final int hits = searcher.search(query, 1).totalHits;

        return hits > 0;

    }

    static boolean isPresent(final IndexSearcher searcher, final String symbol) throws Exception {

        final String name = CodecHelper.FIELD_INST_ID;
        final String value = symbol;

        final Term term = new Term(name, value);

        final Query query = new TermQuery(term);

        final int hits = searcher.search(query, 1).totalHits;

        return hits > 0;

    }

}