org.apache.lens.server.query.collect.DefaultQueryCollection.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.lens.server.query.collect.DefaultQueryCollection.java

Source

/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.apache.lens.server.query.collect;

import java.util.*;

import org.apache.lens.server.api.query.QueryContext;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.map.MultiValueMap;

import com.google.common.collect.Sets;
import lombok.NonNull;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;

/**
 * Implementation which creates multiple in memory views of queries existing in lens system and owns responsibility of
 * keeping all the views consistent with each other. This implementation is not thread-safe.
 *
 * @see QueryCollection
 */
@Slf4j
@ToString
public class DefaultQueryCollection implements QueryCollection {

    private final Set<QueryContext> queries;
    private final MultiValueMap queriesByUser = MultiValueMap.decorate(new HashMap(), LinkedHashSet.class);

    public DefaultQueryCollection() {
        this.queries = Sets.newLinkedHashSet();
    }

    public DefaultQueryCollection(@NonNull final Set<QueryContext> queries) {
        this();
        addAll(queries);
    }

    public DefaultQueryCollection(final TreeSet<QueryContext> treeSet) {
        this.queries = treeSet;
        for (QueryContext query : treeSet) {
            queriesByUser.put(query.getSubmittedUser(), query);
        }
    }

    @Override
    public boolean add(final QueryContext query) {

        queriesByUser.put(query.getSubmittedUser(), query);
        return queries.add(query);
    }

    @Override
    public boolean addAll(final Set<QueryContext> queries) {

        boolean modified = false;
        for (QueryContext query : queries) {
            modified |= add(query);
        }
        return modified;
    }

    @Override
    public boolean remove(final QueryContext query) {
        queriesByUser.remove(query.getSubmittedUser(), query);
        return queries.remove(query);
    }

    @Override
    public boolean removeAll(Set<QueryContext> queries) {

        boolean modified = false;
        for (QueryContext query : queries) {
            modified |= remove(query);
        }
        return modified;
    }

    @Override
    public Set<QueryContext> getQueries() {
        return Sets.newHashSet(queries);
    }

    @Override
    public Set<QueryContext> getQueries(final String user) {
        final Collection<QueryContext> userQueries = getQueriesCollectionForUser(user);
        return Sets.newLinkedHashSet(userQueries);
    }

    @Override
    public int getQueriesCount() {
        return queries.size();
    }

    /**
     *  Since the collection is a linkedHashSet, the order of queries is always maintained.
     * @param query
     * @return
     */
    @Override
    public Integer getQueryIndex(QueryContext query) {
        Iterator iterator = queries.iterator();
        int index = 1;
        while (iterator.hasNext()) {
            QueryContext queuedQuery = (QueryContext) iterator.next();
            if (queuedQuery.getQueryHandle().equals(query.getQueryHandle())) {
                return index;
            }
            index += 1;
        }
        return null;
    }

    private Collection<QueryContext> getQueriesCollectionForUser(final String user) {

        final Collection<QueryContext> userQueries = queriesByUser.getCollection(user);
        return userQueries != null ? userQueries : CollectionUtils.EMPTY_COLLECTION;
    }
}