org.calrissian.accumulorecipes.eventstore.support.EventQfdHelper.java Source code

Java tutorial

Introduction

Here is the source code for org.calrissian.accumulorecipes.eventstore.support.EventQfdHelper.java

Source

/*
 * Copyright (C) 2013 The Calrissian Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.calrissian.accumulorecipes.eventstore.support;

import static org.apache.commons.lang.StringUtils.splitPreserveAllTokens;
import static org.calrissian.accumulorecipes.commons.support.Constants.ONE_BYTE;
import static org.calrissian.accumulorecipes.commons.support.Constants.PREFIX_E;
import java.util.Set;

import com.esotericsoftware.kryo.Kryo;
import com.google.common.collect.Sets;
import org.apache.accumulo.core.client.AccumuloException;
import org.apache.accumulo.core.client.AccumuloSecurityException;
import org.apache.accumulo.core.client.Connector;
import org.apache.accumulo.core.client.IteratorSetting;
import org.apache.accumulo.core.client.TableExistsException;
import org.apache.accumulo.core.client.TableNotFoundException;
import org.apache.accumulo.core.data.Key;
import org.apache.accumulo.core.iterators.IteratorUtil.IteratorScope;
import org.calrissian.accumulorecipes.commons.domain.StoreConfig;
import org.calrissian.accumulorecipes.commons.iterators.MetadataExpirationFilter;
import org.calrissian.accumulorecipes.commons.iterators.OptimizedQueryIterator;
import org.calrissian.accumulorecipes.commons.iterators.support.NodeToJexl;
import org.calrissian.accumulorecipes.commons.support.attribute.metadata.MetadataSerDe;
import org.calrissian.accumulorecipes.commons.support.qfd.KeyToAttributeStoreQueryXform;
import org.calrissian.accumulorecipes.commons.support.qfd.KeyToAttributeStoreWholeColFXform;
import org.calrissian.accumulorecipes.commons.support.qfd.KeyValueIndex;
import org.calrissian.accumulorecipes.commons.support.qfd.QfdHelper;
import org.calrissian.accumulorecipes.commons.support.qfd.ShardBuilder;
import org.calrissian.mango.domain.event.Event;
import org.calrissian.mango.domain.event.EventBuilder;
import org.calrissian.mango.types.TypeRegistry;

public class EventQfdHelper extends QfdHelper<Event> {

    public static final String FI_TYPE_KEY_SEP = "__$";

    public EventQfdHelper(Connector connector, String indexTable, String shardTable, StoreConfig config,
            ShardBuilder<Event> shardBuilder, TypeRegistry<String> typeRegistry, KeyValueIndex<Event> keyValueIndex)
            throws TableExistsException, AccumuloSecurityException, AccumuloException, TableNotFoundException {
        super(connector, indexTable, shardTable, config, shardBuilder, typeRegistry, keyValueIndex,
                new EventNodeToJexl(typeRegistry));
    }

    public static class EventNodeToJexl extends NodeToJexl {

        public EventNodeToJexl(TypeRegistry<String> registry) {
            super(registry);
        }

        @Override
        protected String buildKey(String type, String key) {
            return buildAttributeKey(type, key);
        }
    }

    public QueryXform buildQueryXform() {
        return new QueryXform(getKryo(), getTypeRegistry(), getMetadataSerDe());
    }

    public WholeColFXForm buildWholeColFXform() {
        return new WholeColFXForm(getKryo(), getTypeRegistry(), getMetadataSerDe());
    }

    @Override
    protected String buildId(Event item) {
        return PREFIX_E + ONE_BYTE + item.getType() + ONE_BYTE + item.getId();
    }

    @Override
    protected String buildAttributeKey(Event item, String key) {
        return buildAttributeKey(item.getType(), key);
    }

    @Override
    protected long buildAttributeTimestampForEntity(Event e) {
        return e.getTimestamp();
    }

    private static final String buildAttributeKey(String type, String key) {
        return type + FI_TYPE_KEY_SEP + key;
    }

    @Override
    protected void configureShardTable(Connector connector, String tableName)
            throws AccumuloSecurityException, AccumuloException, TableNotFoundException {
        Set<IteratorScope> scopes = Sets.newHashSet(IteratorScope.majc, IteratorScope.minc);
        IteratorSetting expirationFilter = new IteratorSetting(7, "metaExpiration", MetadataExpirationFilter.class);
        connector.tableOperations().attachIterator(tableName, expirationFilter,
                Sets.newEnumSet(scopes, IteratorScope.class));
    }

    @Override
    protected void configureIndexTable(Connector connector, String tableName)
            throws AccumuloSecurityException, AccumuloException, TableNotFoundException {
    }

    public static class QueryXform extends KeyToAttributeStoreQueryXform<Event, EventBuilder> {

        public QueryXform(Kryo kryo, TypeRegistry<String> typeRegistry, MetadataSerDe metadataSerDe) {
            super(kryo, typeRegistry, metadataSerDe);
        }

        @Override
        protected EventBuilder buildAttributeCollectionFromKey(Key k) {
            return createEventFromkey(k);
        }
    }

    public static class WholeColFXForm extends KeyToAttributeStoreWholeColFXform<Event, EventBuilder> {
        public WholeColFXForm(Kryo kryo, TypeRegistry<String> typeRegistry, MetadataSerDe metadataSerDe) {
            super(kryo, typeRegistry, metadataSerDe);
        }

        @Override
        protected EventBuilder buildEntryFromKey(Key k) {
            return createEventFromkey(k);
        }
    }

    @Override
    protected Class<? extends OptimizedQueryIterator> getOptimizedQueryIteratorClass() {
        return EventOptimizedQueryIterator.class;
    }

    private static final EventBuilder createEventFromkey(Key key) {
        String cf = key.getColumnFamily().toString();
        String cfParts[] = splitPreserveAllTokens(cf, ONE_BYTE);

        String type = cfParts[1];
        String uuid = cfParts[2];
        return EventBuilder.create(type, uuid, key.getTimestamp());
    }

}