package org.eclipse.demo.cheatsheets.search.internal.search;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

import org.eclipse.demo.cheatsheets.search.internal.text.Messages;
import org.eclipse.platform.discovery.runtime.api.GroupingHierarchy;
import org.eclipse.platform.discovery.runtime.api.ISearchDestination;
import org.eclipse.platform.discovery.runtime.api.ISearchParameters;
import org.eclipse.platform.discovery.runtime.api.ISearchQuery;
import org.eclipse.platform.discovery.runtime.api.ISearchSubdestination;
import org.eclipse.platform.discovery.runtime.api.impl.SearchProvider;

/**
 * The cheat sheets search provider 
 * @author danail
 */
public class LocalCheatSheetSearchProvider extends SearchProvider
{
	static final GroupingHierarchy FLAT_LIST;
	static final GroupingHierarchy BY_CATEGORIES;
	private static final Set<GroupingHierarchy> HIERARCHIES;
	
	static
	{
		FLAT_LIST = new GroupingHierarchy(Messages.CheatSheetSearchProvider_FlatListGrouping, "flat-list"); //$NON-NLS-2$
		BY_CATEGORIES = new GroupingHierarchy(Messages.CheatSheetSearchProvider_ByCategoryGrouping, "by-categories"); //$NON-NLS-2$
		HIERARCHIES = new HashSet<GroupingHierarchy>(Arrays.asList(new GroupingHierarchy[]{FLAT_LIST, BY_CATEGORIES}));
	}
	
	@Override
	public ISearchQuery createQuery(final ISearchParameters searchParameters)
	{
		return new CheatSheetSearchQuery(searchParameters);
	}

	
	@Override
	public Set<GroupingHierarchy> getGroupingHierarchies(ISearchDestination soco, Set<ISearchSubdestination> subdestinations)
	{
		return HIERARCHIES;
	}
}
