/**********************************************************************
 * Copyright (c) 2018 Ericsson
 *
 * All rights reserved. This program and the accompanying materials are
 * made available under the terms of the Eclipse Public License 2.0 which
 * accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 **********************************************************************/
package org.eclipse.tracecompass.internal.tmf.core.model.filters;

import java.util.Collection;
import java.util.List;

import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.tracecompass.tmf.core.model.filters.SelectionTimeQueryFilter;
import org.eclipse.tracecompass.tmf.core.model.timegraph.IFilterProperty;

import com.google.common.collect.Multimap;

/**
 * Selection query filter implementation with a given regex to filter the data.
 *
 * @author Jean-Christian Kouame
 *
 */
public class SelectionTimeQueryRegexFilter extends SelectionTimeQueryFilter implements IRegexQuery {

    private final Multimap<@NonNull Integer, @NonNull String> fRegexes;

    /**
     * Build a XYTimeQueryFilter
     *
     * @param start
     *                    The starting value
     * @param end
     *                    The ending value
     * @param n
     *                    The number of entries
     * @param items
     *                    The unique keys of the selected entries
     * @param regexes
     *                    The regexes use to filter the queried data. It is a
     *                    multimap of filter strings by property. The data provider
     *                    will use the filter strings to determine whether the
     *                    property should be activated or not. See
     *                    {@link IFilterProperty} for supported properties.
     */
    public SelectionTimeQueryRegexFilter(long start, long end, int n, Collection<Long> items, Multimap<@NonNull Integer, @NonNull String> regexes) {
        super(start, end, n, items);
        fRegexes = regexes;
    }

    /**
     * Create a {@link SelectionTimeQueryFilter} from a sorted list of times.
     *
     * @param times
     *                    sorted list of times to query.
     * @param items
     *                    The unique keys of the selected entries.
     * @param regexes
     *                    The regexes use to filter the queried data. It is a
     *                    multimap of filter strings by property. The data provider
     *                    will use the filter strings to determine whether the
     *                    property should be activated or not. See
     *                    {@link IFilterProperty} for supported properties.
     */
    public SelectionTimeQueryRegexFilter(List<Long> times, Collection<Long> items, Multimap<@NonNull Integer, @NonNull String> regexes) {
        super(times, items);
        fRegexes = regexes;
    }

    @Override
    public Multimap<Integer, String> getRegexes() {
        return fRegexes;
    }

}
