DataAccessModel.java

package eu.javaexperience.database.accessModel;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

/**
 * Cél: ismétlődő lekérdezések egyszerűsítése, rendezéssel, szűréssel.
 * 
 * */
public abstract class DataAccessModel<M, ENV>
{
	protected final String name;
	
	protected Map<String, OptionGroup> queryOptions = new HashMap<>();
	
	
	public String getName()
	{
		return name;
	}
	
	public DataAccessModel(String modelName)
	{
		this.name = modelName;
	}		
	
	public DataAccessModel
	(
		String modelName,
		OptionGroup... options
	)
	{
		this.name = modelName;
		for(OptionGroup g:options)
		{
			queryOptions.put(g.systemName, g);
		}
	}
	
	protected abstract AccessRequest<M, ENV> createAccessRequest();
	
	public AccessRequest<M, ENV> createRequest()
	{
		AccessRequest<M, ENV> req = createAccessRequest();
		req.model = this;
		return req;
	}
	
	
	public void addOption(OptionGroup optionGroup)
	{
		queryOptions.put(optionGroup.systemName, optionGroup);
	}

	
	/**
	 * fills the list with the available options and returns the number of
	 * filled options.
	 * returns -1 if OptionGroup not available
	 * 
	 * */
	public int fillAvailableOptionsOf(String entity, Collection<OptionEntry> orderings)
	{
		OptionGroup og = queryOptions.get(entity);
		if(null == og)
		{
			return -1;
		}
		
		int n = 0;
		for(OptionEntry f:og.options)
		{
			orderings.add(f);
			++n;
		}
		
		return n;
	}
	
	public int fillAvailableOptionsOf(WellKnownAccessQueryOptions entitiy, Collection<OptionEntry> options)
	{
		return fillAvailableOptionsOf(entitiy.name(), options);
	}
	
	public OptionGroup getOptionByName(String name)
	{
		return queryOptions.get(name);
	}

	public Iterable<String> getOptionNames()
	{
		return queryOptions.keySet();
	}
}