view lucene/src/luan/modules/lucene/FieldTable.java @ 416:91af5337b9ae

add LuanMeta.__tostring()
author Franklin Schmidt <fschmidt@gmail.com>
date Thu, 30 Apr 2015 06:28:25 -0600
parents ce8e19567911
children df95199ca4c0
line wrap: on
line source

package luan.modules.lucene;

import java.util.Map;
import java.util.HashMap;
import java.util.concurrent.ConcurrentHashMap;
import java.util.Iterator;
import luan.LuanState;
import luan.LuanTable;
import luan.LuanMeta;


class FieldTable extends LuanMeta {
	final Map<String,String> map = new ConcurrentHashMap<String,String>();
	final Map<String,String> reverseMap = new ConcurrentHashMap<String,String>();

	FieldTable() {
		put("type","type index");
		put("id","id index");
	}

	@Override public boolean canNewindex() {
		return true;
	}

	@Override public void __newindex(LuanState luan,LuanTable tbl,Object key,Object value) {
		put(key,value);
	}

	private void put(Object key,Object value) {
		if( !(key instanceof String) )
			throw new UnsupportedOperationException("key must be string");
		String name = (String)key;
		if( value==null ) {  // delete
			reverseMap.remove(map.remove(name));
			return;
		}
		if( !(value instanceof String) )
			throw new UnsupportedOperationException("value must be string");
		String field = (String)value;
		String oldField = map.put(name,field);
		if( oldField != null )
			reverseMap.remove(oldField);
		String oldName = reverseMap.put(field,name);
		if( oldName != null ) {
			reverseMap.put(field,oldName);
			map.remove(name);
			throw new IllegalArgumentException("field '"+oldName+"' is already assigned to '"+field+"'");
		}
	}

	@Override public Object __index(LuanState luan,LuanTable tbl,Object key) {
//	@Override public final Object get(Object key) {
		return map.get(key);
	}

	@Override public final Iterator keys(LuanTable tbl) {
		return map.keySet().iterator();
	}

	@Override protected String type(LuanTable tbl) {
		return "lucene-field";
	}

}