view src/main/java/de/mpiwg/indexmeta/utils/QuadMap.java @ 0:dfce13a5f5f9

nit project!
author Jorge Urzua <jurzua@mpiwg-berlin.mpg.de>
date Thu, 11 Apr 2013 15:25:26 +0200
parents
children
line wrap: on
line source

package de.mpiwg.indexmeta.utils;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class QuadMap<V> implements IQuadMap<V>{
	
	private Map<QuadKey, V> map;
	private Map<Object, List<QuadKey>> mapFirstKey;
	private Map<Object, List<QuadKey>> mapSecondKey;
	private Map<Object, List<QuadKey>> mapThirdKey;
	private Map<Object, QuadKey> mapOwnKey;
	
	public QuadMap(){
		this.map  = new HashMap<QuadKey, V>();
		this.mapFirstKey = new HashMap<Object, List<QuadKey>>();
		this.mapSecondKey = new HashMap<Object, List<QuadKey>>();
		this.mapThirdKey = new HashMap<Object, List<QuadKey>>();
		this.mapOwnKey = new HashMap<Object, QuadKey>();
	}
	
	public QuadMap(QuadMap<? extends V> m) {
		this.map  = new HashMap<QuadKey, V>();
		this.mapFirstKey = new HashMap<Object, List<QuadKey>>();
		this.mapSecondKey = new HashMap<Object, List<QuadKey>>();
		this.mapThirdKey = new HashMap<Object, List<QuadKey>>();
		this.mapOwnKey = new HashMap<Object, QuadKey>();
		this.putAllForCreate(m);
	}

	private void putAllForCreate(QuadMap<? extends V> m) {
		for(Map.Entry<QuadKey, ? extends V> e : m.entrySet()){
			QuadKey tKey = e.getKey(); 
			 this.map.put(tKey, e.getValue());
			 this.mapOwnKey.put(tKey.getOwnKey(), tKey);
			 
			 if(!mapFirstKey.containsKey(tKey.getFirstKey())){
				 mapFirstKey.put(tKey.getFirstKey(), new ArrayList<QuadKey>());
			 }
			 if(!mapFirstKey.get(tKey.getFirstKey()).contains(tKey)){
				 mapFirstKey.get(tKey.getFirstKey()).add(tKey);	 
			 }
			 
			 if(!mapSecondKey.containsKey(tKey.getSecondKey())){
				 mapSecondKey.put(tKey.getSecondKey(), new ArrayList<QuadKey>());
			 }
			 if(!mapSecondKey.get(tKey.getSecondKey()).contains(tKey)){
				 mapSecondKey.get(tKey.getSecondKey()).add(tKey);	 
			 }
			 
			 if(!mapThirdKey.containsKey(tKey.getThirdKey())){
				 mapThirdKey.put(tKey.getThirdKey(), new ArrayList<QuadKey>());
			 }
			 if(!mapThirdKey.get(tKey.getThirdKey()).contains(tKey)){
				 mapThirdKey.get(tKey.getThirdKey()).add(tKey);	 
			 }
		}
	}
	
	public List<V> getValuesByFirstKey(Object srcKey){
		List<V> list = new ArrayList<V>();
		if(mapFirstKey.containsKey(srcKey)){
			for(QuadKey tKey : mapFirstKey.get(srcKey)){
				list.add(map.get(tKey));
			}
		}
		return list;
	}
	
	public List<V> getValuesBySecondKey(Object tarKey){
		List<V> list = new ArrayList<V>();
		if(mapSecondKey.containsKey(tarKey)){
			for(QuadKey tKey : mapSecondKey.get(tarKey)){
				list.add(map.get(tKey));
			}
		}
		return list;
	}
	
	public List<V> getValuesByThirdKey(Object thirdKey){
		List<V> list = new ArrayList<V>();
		if(mapThirdKey.containsKey(thirdKey)){
			for(QuadKey tKey : mapThirdKey.get(thirdKey)){
				list.add(map.get(tKey));
			}
		}
		return list;
	}
	
	public V getValuesByOwnKey(Object ownKey){
		QuadKey tKey = mapOwnKey.get(ownKey);
		if(tKey != null){
			return this.map.get(tKey);
		}
		return null;
	}
	
	public Set<QuadKey> keySet(){
		return this.map.keySet();
	}
	
	public Set<Map.Entry<QuadKey, V>> entrySet() {
		return this.map.entrySet();
	}	
	
	@Override
	public int size() {
		return this.map.size();
	}

	@Override
	public boolean isEmpty() {
		return this.map.isEmpty();
	}

	@Override
	public boolean containsKey(QuadKey key) {
		return this.map.containsKey(key);
	}

	@Override
	public boolean containsValue(Object value) {
		return this.map.containsValue(value);
	}

	@Override
	public V get(QuadKey key) {
		return map.get(key);
	}

	@Override
	public V put(QuadKey tKey, V value) {

		if(!mapFirstKey.containsKey(tKey.getFirstKey())){
			 mapFirstKey.put(tKey.getFirstKey(), new ArrayList<QuadKey>());
		 }
		 if(!mapFirstKey.get(tKey.getFirstKey()).contains(tKey)){
			 mapFirstKey.get(tKey.getFirstKey()).add(tKey);	 
		 }
		 
		 if(!mapSecondKey.containsKey(tKey.getSecondKey())){
			 mapSecondKey.put(tKey.getSecondKey(), new ArrayList<QuadKey>());
		 }
		 if(!mapSecondKey.get(tKey.getSecondKey()).contains(tKey)){
			 mapSecondKey.get(tKey.getSecondKey()).add(tKey);	 
		 }
		 
		 if(!mapThirdKey.containsKey(tKey.getThirdKey())){
			 mapThirdKey.put(tKey.getThirdKey(), new ArrayList<QuadKey>());
		 }
		 if(!mapThirdKey.get(tKey.getThirdKey()).contains(tKey)){
			 mapThirdKey.get(tKey.getThirdKey()).add(tKey);	 
		 }
		 
		 this.mapOwnKey.put(tKey.getOwnKey(), tKey);
		 return this.map.put(tKey, value);
	}

	@Override
	public V remove(QuadKey key) {
		if(mapFirstKey.containsKey(key.getFirstKey())){
			mapFirstKey.get(key.getFirstKey()).remove(key);
		}
		if(mapSecondKey.containsKey(key.getSecondKey())){
			mapSecondKey.get(key.getSecondKey()).remove(key);
		}
		if(mapThirdKey.containsKey(key.getThirdKey())){
			mapThirdKey.get(key.getThirdKey()).remove(key);
		}
		this.mapOwnKey.remove(key.getOwnKey());
		return this.map.remove(key);
	}

	@Override
	public void clear() {
		this.map.clear();
		this.mapFirstKey.clear();
		this.mapSecondKey.clear();
		this.mapThirdKey.clear();
		this.mapOwnKey.clear();
	}

	@Override
	public Collection<V> values() {
		return this.map.values();
	}
}