Mercurial Hosting > luan
diff src/luan/modules/lucene/LuceneIndex.java @ 1271:48f302bdc187
fix indexed_only_field
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Mon, 12 Nov 2018 21:19:52 -0700 |
parents | 9fa8b8389578 |
children | 25746915a241 |
line wrap: on
line diff
--- a/src/luan/modules/lucene/LuceneIndex.java Mon Nov 12 20:02:50 2018 -0700 +++ b/src/luan/modules/lucene/LuceneIndex.java Mon Nov 12 21:19:52 2018 -0700 @@ -72,6 +72,7 @@ import luan.LuanState; import luan.LuanTable; import luan.LuanFunction; +import luan.LuanCloner; import luan.LuanException; import luan.LuanRuntimeException; import org.slf4j.Logger; @@ -94,7 +95,6 @@ private final ThreadLocal<IndexSearcher> threadLocalSearcher = new ThreadLocal<IndexSearcher>(); private boolean isClosed = true; private final MultiFieldParser mfp; - public final LuanTable indexed_only_fields; private final Analyzer analyzer; private final Exception created = new Exception("created"); @@ -102,10 +102,13 @@ private File fileDir; private int writeCount; + private final ConcurrentMap<String,Map<String,LuanFunction>> indexedOnlyFields = new ConcurrentHashMap<String,Map<String,LuanFunction>>(); + private final LuanState luanMine = new LuanState(); + private final LuanCloner cloner = new LuanCloner(LuanCloner.Type.COMPLETE); + public LuceneIndex(LuanState luan,String indexDirStr,FieldParser defaultFieldParser,String[] defaultFields) throws LuanException, IOException { - indexed_only_fields = new LuanTable(luan); // not good, not thread safe mfp = defaultFieldParser==null ? new MultiFieldParser() : new MultiFieldParser(defaultFieldParser,defaultFields); mfp.fields.put( "type", STRING_FIELD_PARSER ); mfp.fields.put( "id", NumberFieldParser.LONG ); @@ -178,6 +181,13 @@ } } + public void indexed_only_field(String type,String field,LuanFunction fn) { + fn = (LuanFunction)cloner.get(fn); + indexedOnlyFields.putIfAbsent(type,new ConcurrentHashMap<String,LuanFunction>()); + Map<String,LuanFunction> map = indexedOnlyFields.get(type); + map.put(field,fn); + } + public void save(LuanState luan,LuanTable doc) throws LuanException, IOException { Set indexedOnlySet = new HashSet(); Object typeObj = doc.get("type"); @@ -186,21 +196,12 @@ if( !(typeObj instanceof String) ) throw new LuanException("type must be string"); String type = (String)typeObj; - Object indexedOnlyObj = indexed_only_fields.get(type); - if( indexedOnlyObj != null ) { - if( !(indexedOnlyObj instanceof LuanTable) ) - throw new LuanException("indexed_only_fields elements must be tables"); - LuanTable indexedOnly = (LuanTable)indexedOnlyObj; - for( Map.Entry<Object,Object> entry : indexedOnly.iterable() ) { - Object key = entry.getKey(); - if( !(key instanceof String) ) - throw new LuanException("indexed_only_fields."+type+" entries must be strings"); - String name = (String)key; - Object value = entry.getValue(); - if( !(value instanceof LuanFunction) ) - throw new LuanException("indexed_only_fields."+type+" values must be functions"); - LuanFunction fn = (LuanFunction)value; - value = Luan.first(fn.call(luan,new Object[]{doc})); + Map<String,LuanFunction> map = indexedOnlyFields.get(type); + if( map != null ) { + for( Map.Entry<String,LuanFunction> entry : map.entrySet() ) { + String name = entry.getKey(); + LuanFunction fn = entry.getValue(); + Object value = Luan.first(fn.call(luan,new Object[]{doc})); doc.put( name, value ); indexedOnlySet.add(name); }