From: <an...@us...> - 2011-02-25 15:46:05
|
Revision: 11988 http://wonder.svn.sourceforge.net/wonder/?rev=11988&view=rev Author: anjo Date: 2011-02-25 15:45:57 +0000 (Fri, 25 Feb 2011) Log Message: ----------- lucene adaptor second cut. should mostly work. need tests and better example. Modified Paths: -------------- branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Examples/Misc/LuceneExample/Resources/LuceneModel.eomodeld/LuceneAsset.plist branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Examples/Misc/LuceneExample/Sources/er/lucenceadaptor/example/DirectAction.java branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/EOAdaptors/JavaLuceneAdaptor/.classpath branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/EOAdaptors/JavaLuceneAdaptor/.settings/org.eclipse.jdt.core.prefs branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/EOAdaptors/JavaLuceneAdaptor/.settings/org.eclipse.jdt.ui.prefs branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/EOAdaptors/JavaLuceneAdaptor/Sources/er/luceneadaptor/ERLuceneAdaptor.java branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/EOAdaptors/JavaLuceneAdaptor/Sources/er/luceneadaptor/ERLuceneAdaptorChannel.java branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/EOAdaptors/JavaLuceneAdaptor/Sources/er/luceneadaptor/ERLuceneAdaptorContext.java Modified: branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Examples/Misc/LuceneExample/Resources/LuceneModel.eomodeld/LuceneAsset.plist =================================================================== --- branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Examples/Misc/LuceneExample/Resources/LuceneModel.eomodeld/LuceneAsset.plist 2011-02-25 10:08:31 UTC (rev 11987) +++ branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Examples/Misc/LuceneExample/Resources/LuceneModel.eomodeld/LuceneAsset.plist 2011-02-25 15:45:57 UTC (rev 11988) @@ -21,10 +21,10 @@ prototypeName = longNumber; } ); - attributesUsedForLocking = (contents, creationDate, id, price, userCount); + attributesUsedForLocking = (creationDate, id, userCount); className = EOGenericRecord; classProperties = (contents, creationDate, price, userCount); - externalName = LuceneAsset; + externalName = LA; fetchSpecificationDictionary = {}; name = LuceneAsset; primaryKeyAttributes = (id); Modified: branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Examples/Misc/LuceneExample/Sources/er/lucenceadaptor/example/DirectAction.java =================================================================== --- branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Examples/Misc/LuceneExample/Sources/er/lucenceadaptor/example/DirectAction.java 2011-02-25 10:08:31 UTC (rev 11987) +++ branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Examples/Misc/LuceneExample/Sources/er/lucenceadaptor/example/DirectAction.java 2011-02-25 15:45:57 UTC (rev 11988) @@ -6,15 +6,17 @@ import org.apache.log4j.Logger; import org.apache.lucene.document.Document; -import org.apache.lucene.document.NumberTools; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.Term; +import org.apache.lucene.search.BooleanClause; +import org.apache.lucene.search.BooleanQuery; import org.apache.lucene.search.Collector; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.NumericRangeQuery; import org.apache.lucene.search.Query; import org.apache.lucene.search.Scorer; import org.apache.lucene.search.TermQuery; +import org.apache.lucene.search.TermRangeQuery; import org.apache.lucene.search.TopDocs; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; @@ -23,16 +25,28 @@ import com.webobjects.appserver.WOActionResults; import com.webobjects.appserver.WORequest; import com.webobjects.directtoweb.D2W; +import com.webobjects.eoaccess.EOEntity; +import com.webobjects.eoaccess.EOModelGroup; import com.webobjects.eoaccess.EOUtilities; +import com.webobjects.eocontrol.EOAndQualifier; import com.webobjects.eocontrol.EOEditingContext; import com.webobjects.eocontrol.EOEnterpriseObject; +import com.webobjects.eocontrol.EOFetchSpecification; +import com.webobjects.eocontrol.EOKeyValueQualifier; +import com.webobjects.eocontrol.EOQualifier; +import com.webobjects.eocontrol.EOSortOrdering; +import com.webobjects.foundation.NSArray; +import com.webobjects.foundation.NSDictionary; import com.webobjects.foundation.NSLog; import com.webobjects.foundation.NSTimestamp; import er.directtoweb.ERD2WDirectAction; import er.extensions.components.ERXLoremIpsumGenerator; import er.extensions.eof.ERXEC; +import er.extensions.eof.qualifiers.ERXBetweenQualifier; import er.lucenceadaptor.example.components.Main; +import er.luceneadaptor.ERLuceneAdaptor; +import er.luceneadaptor.ERLuceneAdaptorChannel; public class DirectAction extends ERD2WDirectAction { @@ -107,42 +121,79 @@ return D2W.factory().defaultPage(session()); } + private static IndexReader reader; + public WOActionResults directQueryAction() throws IOException { - Directory d = FSDirectory.open(new File("/tmp/test")); - IndexReader reader = IndexReader.open(d); + if(reader == null) { + Directory directory = FSDirectory.open(new File("/tmp/test")); + reader = IndexReader.open(directory); + } IndexSearcher searcher = new IndexSearcher(reader); + for(int i = 0; i < searcher.maxDoc() && i < 10; i++) { + Document doc = searcher.doc(i); + // log.info(doc); + } Query query = null; - String key = "Morbi".toLowerCase(); - if(true) { + String key = "ipse".toLowerCase(); + if(false) { NumericRangeQuery q = NumericRangeQuery.newIntRange("userCount", Integer.valueOf(30), Integer.valueOf(10000), true, true); - q = NumericRangeQuery.newLongRange("userCount", Long.valueOf(30), Long.valueOf(10000), true, true); + //q = NumericRangeQuery.newLongRange("userCount", Long.valueOf(30), Long.valueOf(10000), true, true); query = q; } else { - TermQuery q = new TermQuery(new Term("contents", key)); + TermQuery q1 = new TermQuery(new Term("contents", key)); + TermRangeQuery q2 = new TermRangeQuery("userCount", NumericUtils.longToPrefixCoded(30), NumericUtils.longToPrefixCoded(300), false, false); + BooleanQuery q = new BooleanQuery(); + //q.add(q1, BooleanClause.Occur.MUST); + q.add(q2, BooleanClause.Occur.MUST); query = q; } log.info(query); if (true) { TopDocs docs = searcher.search(query, Integer.MAX_VALUE); int hits = docs.totalHits; - for (int i = 0; i < hits; i++) { + for (int i = 0; i < hits && i < 50; i++) { int docId = docs.scoreDocs[i].doc; Document document = searcher.doc(docId); String fieldValue = document.get("userCount"); String content = document.get("contents"); Number userCount = NumericUtils.prefixCodedToLong(fieldValue); boolean contains = content.indexOf(key) >= 0; - log.info(i +"/" + docId + "->" + userCount + "-" + content); + log.info(i +"/" + docId + "->" + userCount + "-" + document); } } else { - Collector streamingHitCollector = new SimpleCollector(searcher); searcher.search(query, streamingHitCollector); } return D2W.factory().defaultPage(session()); } + public WOActionResults eofQueryAction() throws IOException { + EOEditingContext ec = ERXEC.newEditingContext(); + ec.lock(); + try { + EOQualifier q1 = new EOKeyValueQualifier("contents", EOQualifier.QualifierOperatorLike, "suspend*"); + EOQualifier q2 = new ERXBetweenQualifier("userCount", Long.valueOf(30), Long.valueOf(800)); + // EOQualifier q3 = new EOKeyValueQualifier("userCount", EOQualifier.QualifierOperatorEqual, Long.valueOf(82)); + //EOQualifier q3 = new EOKeyValueQualifier("userCount", EOQualifier.QualifierOperatorLessThan, Long.valueOf(82)); + EOQualifier q3 = new EOKeyValueQualifier("userCount", EOQualifier.QualifierOperatorLessThanOrEqualTo, Long.valueOf(802)); + EOQualifier qualifier = new EOAndQualifier(new NSArray<EOQualifier>(new EOQualifier[]{q1, q2, q3})); + EOFetchSpecification fs = new EOFetchSpecification("LuceneAsset", qualifier, null); + fs.setFetchLimit(5); + fs.setSortOrderings(new NSArray(new EOSortOrdering("userCount", EOSortOrdering.CompareAscending))); + Query query = ERLuceneAdaptorChannel.queryForQualifier(new EOKeyValueQualifier("userCount", EOQualifier.QualifierOperatorLessThanOrEqualTo, 802), EOUtilities.entityNamed(ec, "LuceneAsset")); + fs.setHints(new NSDictionary(query, ERLuceneAdaptor.QUERY_HINTS)); + NSArray<EOEnterpriseObject> result = ec.objectsWithFetchSpecification(fs); + log.info(result.count() + ": " + result.valueForKey("userCount")); + for (EOEnterpriseObject eo : result) { + log.info(result.count() + ": " + eo); + } + } finally { + ec.unlock(); + } + return D2W.factory().defaultPage(session()); + } + public WOActionResults createAction() { EOEditingContext ec = ERXEC.newEditingContext(); ec.lock(); @@ -151,7 +202,7 @@ for (int i = 0; i < 100; i++) { EOEnterpriseObject eo = EOUtilities.createAndInsertInstance(ec, "LuceneAsset"); eo.takeValueForKey(new NSTimestamp().timestampByAddingGregorianUnits(0, 0, -random.nextInt(2500), 0, 0, 0, null), "creationDate"); - eo.takeValueForKey(ERXLoremIpsumGenerator.firstParagraph(), "contents"); + eo.takeValueForKey(ERXLoremIpsumGenerator.randomSentence(), "contents"); eo.takeValueForKey(random.nextDouble(), "price"); eo.takeValueForKey(Long.valueOf(random.nextInt(2500)), "userCount"); } Modified: branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/EOAdaptors/JavaLuceneAdaptor/.classpath =================================================================== --- branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/EOAdaptors/JavaLuceneAdaptor/.classpath 2011-02-25 10:08:31 UTC (rev 11987) +++ branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/EOAdaptors/JavaLuceneAdaptor/.classpath 2011-02-25 15:45:57 UTC (rev 11988) @@ -11,8 +11,8 @@ <classpathentry exported="true" kind="con" path="WOFramework/JavaWebObjects"/> <classpathentry exported="true" kind="con" path="WOFramework/JavaXML"/> <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> - <classpathentry exported="true" kind="lib" path="Libraries/lucene-analyzers-3.0.3.jar"/> - <classpathentry exported="true" kind="lib" path="Libraries/lucene-core-3.0.3.jar"/> + <classpathentry exported="true" kind="lib" path="Libraries/lucene-analyzers-3.0.3.jar" sourcepath="Libraries/lucene-3.0.3-src.jar"/> + <classpathentry exported="true" kind="lib" path="Libraries/lucene-core-3.0.3.jar" sourcepath="Libraries/lucene-3.0.3-src.jar"/> <classpathentry exported="true" kind="lib" path="Libraries/lucene-snowball-3.0.3.jar"/> <classpathentry exported="true" kind="lib" path="Libraries/lucene-spellchecker-3.0.3.jar"/> <classpathentry kind="lib" path="Libraries/lucene-memory-3.0.3.jar"/> Modified: branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/EOAdaptors/JavaLuceneAdaptor/.settings/org.eclipse.jdt.core.prefs =================================================================== --- branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/EOAdaptors/JavaLuceneAdaptor/.settings/org.eclipse.jdt.core.prefs 2011-02-25 10:08:31 UTC (rev 11987) +++ branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/EOAdaptors/JavaLuceneAdaptor/.settings/org.eclipse.jdt.core.prefs 2011-02-25 15:45:57 UTC (rev 11988) @@ -1,4 +1,4 @@ -#Tue Feb 17 20:18:11 PST 2009 +#Fri Feb 25 12:40:48 CET 2011 eclipse.preferences.version=1 org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning org.eclipse.jdt.core.compiler.problem.autoboxing=error @@ -58,3 +58,271 @@ org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning +org.eclipse.jdt.core.formatter.align_type_members_on_columns=false +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_assignment=0 +org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80 +org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16 +org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0 +org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 +org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_after_package=1 +org.eclipse.jdt.core.formatter.blank_lines_before_field=0 +org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 +org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 +org.eclipse.jdt.core.formatter.blank_lines_before_method=1 +org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 +org.eclipse.jdt.core.formatter.blank_lines_before_package=0 +org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 +org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 +org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false +org.eclipse.jdt.core.formatter.comment.format_block_comments=true +org.eclipse.jdt.core.formatter.comment.format_header=false +org.eclipse.jdt.core.formatter.comment.format_html=true +org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true +org.eclipse.jdt.core.formatter.comment.format_line_comments=true +org.eclipse.jdt.core.formatter.comment.format_source_code=true +org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true +org.eclipse.jdt.core.formatter.comment.indent_root_tags=true +org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert +org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert +org.eclipse.jdt.core.formatter.comment.line_length=280 +org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true +org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true +org.eclipse.jdt.core.formatter.compact_else_if=true +org.eclipse.jdt.core.formatter.continuation_indentation=2 +org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 +org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off +org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on +org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false +org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true +org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_empty_lines=false +org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true +org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false +org.eclipse.jdt.core.formatter.indentation.size=4 +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert +org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.join_lines_in_comments=true +org.eclipse.jdt.core.formatter.join_wrapped_lines=true +org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false +org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false +org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false +org.eclipse.jdt.core.formatter.lineSplit=280 +org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false +org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false +org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 +org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 +org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true +org.eclipse.jdt.core.formatter.tabulation.char=tab +org.eclipse.jdt.core.formatter.tabulation.size=4 +org.eclipse.jdt.core.formatter.use_on_off_tags=false +org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false +org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true +org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true Modified: branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/EOAdaptors/JavaLuceneAdaptor/.settings/org.eclipse.jdt.ui.prefs =================================================================== --- branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/EOAdaptors/JavaLuceneAdaptor/.settings/org.eclipse.jdt.ui.prefs 2011-02-25 10:08:31 UTC (rev 11987) +++ branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/EOAdaptors/JavaLuceneAdaptor/.settings/org.eclipse.jdt.ui.prefs 2011-02-25 15:45:57 UTC (rev 11988) @@ -1,3 +1,5 @@ -#Wed Nov 28 09:01:06 EST 2007 +#Fri Feb 25 12:40:32 CET 2011 eclipse.preferences.version=1 +formatter_profile=_Wonder +formatter_settings_version=11 internal.default.compliance=default Modified: branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/EOAdaptors/JavaLuceneAdaptor/Sources/er/luceneadaptor/ERLuceneAdaptor.java =================================================================== --- branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/EOAdaptors/JavaLuceneAdaptor/Sources/er/luceneadaptor/ERLuceneAdaptor.java 2011-02-25 10:08:31 UTC (rev 11987) +++ branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/EOAdaptors/JavaLuceneAdaptor/Sources/er/luceneadaptor/ERLuceneAdaptor.java 2011-02-25 15:45:57 UTC (rev 11988) @@ -16,7 +16,6 @@ import org.apache.lucene.store.LockObtainFailedException; import org.apache.lucene.util.Version; -import com.sun.tools.javac.util.Log; import com.webobjects.eoaccess.EOAdaptor; import com.webobjects.eoaccess.EOAdaptorContext; import com.webobjects.eoaccess.EOModel; @@ -33,6 +32,9 @@ */ public class ERLuceneAdaptor extends EOAdaptor { + public static final Object QUERY_HINTS = "query"; + public static final Object SORT_HINTS = "sort"; + private Object _syncFactory; public Directory _directory; public Analyzer _analyzer; Modified: branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/EOAdaptors/JavaLuceneAdaptor/Sources/er/luceneadaptor/ERLuceneAdaptorChannel.java =================================================================== --- branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/EOAdaptors/JavaLuceneAdaptor/Sources/er/luceneadaptor/ERLuceneAdaptorChannel.java 2011-02-25 10:08:31 UTC (rev 11987) +++ branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/EOAdaptors/JavaLuceneAdaptor/Sources/er/luceneadaptor/ERLuceneAdaptorChannel.java 2011-02-25 15:45:57 UTC (rev 11988) @@ -1,7 +1,7 @@ package er.luceneadaptor; import java.io.IOException; -import java.math.BigDecimal; +import java.math.BigInteger; import java.text.Format; import java.text.ParseException; import java.util.Date; @@ -19,16 +19,24 @@ import org.apache.lucene.index.CorruptIndexException; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.Term; +import org.apache.lucene.search.BooleanClause; +import org.apache.lucene.search.BooleanQuery; +import org.apache.lucene.search.DisjunctionMaxQuery; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.MatchAllDocsQuery; -import org.apache.lucene.search.NumericRangeQuery; +import org.apache.lucene.search.MultiPhraseQuery; +import org.apache.lucene.search.PrefixQuery; import org.apache.lucene.search.Query; -import org.apache.lucene.search.QueryWrapperFilter; import org.apache.lucene.search.Sort; import org.apache.lucene.search.SortField; +import org.apache.lucene.search.TermQuery; +import org.apache.lucene.search.TermRangeQuery; +import org.apache.lucene.search.TopDocs; +import org.apache.lucene.search.WildcardQuery; import org.apache.lucene.util.NumericUtils; import org.apache.lucene.util.Version; +import com.ibm.icu.math.BigDecimal; import com.webobjects.eoaccess.EOAdaptorChannel; import com.webobjects.eoaccess.EOAttribute; import com.webobjects.eoaccess.EOEntity; @@ -61,6 +69,7 @@ import com.webobjects.foundation.NSTimestampFormatter; import com.webobjects.foundation._NSUtilities; +import er.extensions.eof.qualifiers.ERXBetweenQualifier; import er.extensions.foundation.ERXKeyValueCodingUtilities; import er.extensions.foundation.ERXPatcher; import er.extensions.qualifiers.ERXQualifierTraversal; @@ -72,56 +81,104 @@ */ public class ERLuceneAdaptorChannel extends EOAdaptorChannel { + private static final String EXTERNAL_NAME_KEY = "_e"; + static Logger log = Logger.getLogger(ERLuceneAdaptorChannel.class); private static class LuceneQualifierTraversal extends ERXQualifierTraversal { - NSMutableArray _qualifiers = new NSMutableArray(); + NSMutableArray _queries; + EOEntity _entity; - public LuceneQualifierTraversal() { + public LuceneQualifierTraversal(EOEntity entity) { + _entity = entity; } - protected NSArray<EOQualifier> qualifiersForLast(NSArray original) { - NSRange range = new NSRange(_qualifiers.count() - original.count(), original.count()); - NSArray<EOQualifier> result = _qualifiers.subarrayWithRange(range); - _qualifiers.removeObjectsInRange(range); + protected NSArray<Query> queriesForCurrent(int count) { + NSRange range = new NSRange(_queries.count() - count, count); + NSArray<Query> result = _queries.subarrayWithRange(range); + _queries.removeObjectsInRange(range); return result; } @Override protected boolean traverseAndQualifier(EOAndQualifier q) { - NSArray quals = qualifiersForLast(q.qualifiers()); - _qualifiers.addObject(quals); + NSArray<Query> queries = queriesForCurrent(q.qualifiers().count()); + BooleanQuery query = new BooleanQuery(); + for (Query current : queries) { + query.add(current, BooleanClause.Occur.MUST); + } + _queries.addObject(query); return true; } @Override - protected void visit(EOQualifierEvaluation q) { - _qualifiers = new NSMutableArray<EOQualifier>(); - super.visit(q); + protected boolean traverseNotQualifier(EONotQualifier q) { + NSArray<Query> queries = queriesForCurrent(1); + BooleanQuery query = new BooleanQuery(); + query.add(queries.lastObject(), BooleanClause.Occur.MUST_NOT); + _queries.addObject(query); + return true; } @Override - protected boolean traverseUnknownQualifier(EOQualifierEvaluation q) { - throw new IllegalArgumentException("Unknown qualifier: " + q); + protected boolean traverseOrQualifier(EOOrQualifier q) { + NSArray<Query> queries = queriesForCurrent(q.qualifiers().count()); + DisjunctionMaxQuery query = new DisjunctionMaxQuery(queries, 0); + _queries.addObject(query); + return true; } @Override - protected boolean traverseNotQualifier(EONotQualifier q) { - _qualifiers.addObject(q); - return super.traverseNotQualifier(q); + protected boolean traverseUnknownQualifier(EOQualifierEvaluation q) { + throw new IllegalArgumentException("Unknown qualifier: " + q); } @Override - protected boolean traverseOrQualifier(EOOrQualifier q) { - NSArray quals = qualifiersForLast(q.qualifiers()); - _qualifiers.addObject(quals); - return true; - } - - @Override protected boolean traverseKeyValueQualifier(EOKeyValueQualifier q) { - _qualifiers.addObject(q); + Query query = null; + String key = _entity.attributeNamed(q.key()).columnName(); + IndexAttribute attr = new IndexAttribute(_entity.attributeNamed(key)); + if (q instanceof ERXBetweenQualifier) { + ERXBetweenQualifier between = (ERXBetweenQualifier) q; + Object min = between.minimumValue(); + Object max = between.maximumValue(); + query = new TermRangeQuery(key, attr.asLuceneValue(min), attr.asLuceneValue(max), false, false); + } else if(q.selector().equals(EOQualifier.QualifierOperatorGreaterThan)) { + query = new TermRangeQuery(key, attr.asLuceneValue(q.value()), null, false, false); + } else if(q.selector().equals(EOQualifier.QualifierOperatorGreaterThanOrEqualTo)) { + query = new TermRangeQuery(key, attr.asLuceneValue(q.value()), null, true, false); + } else if(q.selector().equals(EOQualifier.QualifierOperatorLessThan)) { + query = new TermRangeQuery(key, null, attr.asLuceneValue(q.value()), false, false); + } else if(q.selector().equals(EOQualifier.QualifierOperatorLessThanOrEqualTo)) { + query = new TermRangeQuery(key, null, attr.asLuceneValue(q.value()), false, true); + } else if(q.selector().equals(EOQualifier.QualifierOperatorCaseInsensitiveLike) || q.selector().equals(EOQualifier.QualifierOperatorLike)) { + String value = q.value().toString(); + if(q.selector().equals(EOQualifier.QualifierOperatorLike)) { + value = value.toLowerCase(); + } + int star = value.indexOf('*'); + if(star >= 0) { + if(star < value.length() - 1) { + query = new WildcardQuery(new Term(key, value)); + } else { + query = new PrefixQuery(new Term(key, value.substring(0, star))); + } + } else if(value.contains(" ")) { + MultiPhraseQuery multi = new MultiPhraseQuery(); + query = multi; + String parts[] = value.split(" +"); + for (int i = 0; i < parts.length; i++) { + String part = parts[i]; + multi.add(new Term(key, part)); + } + } else { + query = new TermQuery(new Term(key, value)); + } + } else { + query = new TermQuery(new Term(key, attr.asLuceneValue(q.value()))); + } + _queries.addObjects(query); return true; } @@ -130,11 +187,17 @@ throw new IllegalArgumentException("Unknown qualifier: " + q); } + @Override + public void traverse(EOQualifierEvaluation q, boolean postOrder) { + _queries = new NSMutableArray<Query>(); + super.traverse(q, true); + } + public Query query() { - //TermQuery query = new TermQuery(new Term("", "vessn*")); - NumericRangeQuery query = NumericRangeQuery.newIntRange("userCount", Integer.valueOf(300), Integer.valueOf(2000), true, true); - //query.add(); - return query; + BooleanQuery q = new BooleanQuery(); + q.add(new TermQuery(new Term(EXTERNAL_NAME_KEY, _entity.externalName())), BooleanClause.Occur.MUST); + q.add((Query) _queries.lastObject(), BooleanClause.Occur.MUST); + return q; } } @@ -149,33 +212,34 @@ private static String[] CODES = new String[] { "ar", "br", "cjk", "cn", "cz", "de", "el", "fa", "fr", "nl", "ru", "th" }; private static NSDictionary<String, String> LOCALES = new NSDictionary<String, String>(NAMES, CODES); - String _name; + private String _columnName; - TermVector _termVector; + private TermVector _termVector; - Store _store; + private Store _store; - Index _index; + private Index _index; - Analyzer _analyzer; + private Analyzer _analyzer; - Format _format; + private Format _format; - EOAttribute _attribute; + private EOAttribute _attribute; + @SuppressWarnings("deprecation") public IndexAttribute(EOAttribute attribute) { _attribute = attribute; NSDictionary dict = attribute.userInfo() != null ? attribute.userInfo() : NSDictionary.emptyDictionary(); - _name = attribute.columnName(); + _columnName = attribute.columnName(); boolean isClassProperty = _attribute.entity().classPropertyNames().contains(_attribute.name()); - boolean isDataProperty = _attribute.className().contains("NSData"); - boolean isStringProperty = _attribute.className().contains("String"); - _termVector = (TermVector) classValue(dict, "termVector", TermVector.class, isClassProperty && !isDataProperty && isStringProperty? "YES" : "NO"); + boolean isDataProperty = _attribute.className().endsWith("NSData"); + boolean isStringProperty = _attribute.className().endsWith("String"); + _termVector = (TermVector) classValue(dict, "termVector", TermVector.class, isClassProperty && !isDataProperty && isStringProperty ? "YES" : "NO"); _store = (Store) classValue(dict, "store", Store.class, "YES"); _index = (Index) classValue(dict, "index", Index.class, isClassProperty && !isDataProperty && isStringProperty ? "ANALYZED" : "NOT_ANALYZED"); String analyzerClass = (String) dict.objectForKey("analyzer"); - if (analyzerClass == null && _name.matches("\\w+_(\\w+)")) { - String locale = _name.substring(_name.lastIndexOf('_') + 1).toLowerCase(); + if (analyzerClass == null && _columnName.matches("\\w+_(\\w+)")) { + String locale = _columnName.substring(_columnName.lastIndexOf('_') + 1).toLowerCase(); analyzerClass = LOCALES.objectForKey(locale); if (analyzerClass != null) { analyzerClass = ERXPatcher.classForName("org.apache.lucene.analysis." + locale + "." + analyzerClass).getName(); @@ -234,8 +298,8 @@ return _store; } - public String name() { - return _name; + public String columnName() { + return _columnName; } public Analyzer analyzer() { @@ -246,23 +310,32 @@ if (_format != null) { return _format.format(value); } - if (value instanceof Number) { - if (value instanceof Double) { - return NumericUtils.doubleToPrefixCoded(((Number) value).doubleValue()); - } else if (value instanceof Long) { + if(value == null) { + return null; + } + if (attribute().valueType() != null) { + char valueType = attribute().valueType().charAt(0); + switch (valueType) { + case 'i': + return NumericUtils.intToPrefixCoded(((Number) value).intValue()); + case 'b': return NumericUtils.longToPrefixCoded(((Number) value).longValue()); - } else if (value instanceof BigDecimal) { + case 'l': + return NumericUtils.longToPrefixCoded(((Number) value).longValue()); + case 'd': return NumericUtils.doubleToPrefixCoded(((Number) value).doubleValue()); + case 'B': + return NumericUtils.doubleToPrefixCoded(((Number) value).doubleValue()); } - return NumericUtils.intToPrefixCoded(((Number) value).intValue()); - } else if (value instanceof Date) { + } + if (value instanceof Date) { return DateTools.dateToString((Date) value, Resolution.MILLISECOND); } else if (value instanceof NSData) { return NSPropertyListSerialization.stringFromPropertyList(value); } else if (value instanceof NSArray) { return ((NSArray) value).componentsJoinedByString(" "); } - return (value != null ? value.toString() : null); + return value.toString(); } public Object asEOFValue(String value) { @@ -270,40 +343,45 @@ if (_format != null) { return _format.parseObject(value); } - - if (attribute().className().contains("NSTimestamp")) { - return new NSTimestamp(DateTools.stringToDate(value)); - } else if (attribute().className().contains("NSData")) { - return new NSData((NSData)NSPropertyListSerialization.propertyListFromString(value)); - } else if (attribute().className().contains("NSArray")) { - return NSArray.componentsSeparatedByString(value, " "); - } else { - String valueType = attribute().valueType(); - if ("b".equals(valueType)) { + if(value == null) { + return null; + } + if (attribute().valueType() != null) { + char valueType = attribute().valueType().charAt(0); + switch (valueType) { + case 'i': return Integer.valueOf(NumericUtils.prefixCodedToInt(value)); - } else if ("i".equals(valueType)) { - return Integer.valueOf(NumericUtils.prefixCodedToInt(value)); - } else if ("l".equals(valueType)) { + case 'b': + return BigInteger.valueOf(NumericUtils.prefixCodedToLong(value)); + case 'l': return Long.valueOf(NumericUtils.prefixCodedToLong(value)); - } else if ("d".equals(valueType)) { + case 'd': return Double.valueOf(NumericUtils.prefixCodedToDouble(value)); - } else if ("B".equals(valueType)) { + case 'B': return BigDecimal.valueOf(NumericUtils.prefixCodedToDouble(value)); } } - return (value != null ? value.toString() : null); + if (attribute().className().contains("NSTimestamp")) { + return new NSTimestamp(DateTools.stringToDate(value)); + } else if (attribute().className().contains("NSData")) { + return new NSData((NSData) NSPropertyListSerialization.propertyListFromString(value)); + } else if (attribute().className().contains("NSArray")) { + return NSArray.componentsSeparatedByString(value, " "); + } + return value.toString(); } catch (ParseException ex) { throw NSForwardException._runtimeExceptionForThrowable(ex); } } - public Field valueToField(Object value) { + public Field valueToField(Document doc,Object value) { String stringValue = asLuceneValue(value); - if (stringValue != null) { - Field field = new Field(name(), stringValue, store(), index(), termVector()); - return field; + Field field = doc.getField(columnName()); + if(field == null) { + field = new Field(columnName(), stringValue, store(), index(), termVector()); } - return null; + field.setValue(stringValue); + return field; } public EOAttribute attribute() { @@ -315,10 +393,10 @@ private NSArray<IndexAttribute> _indexAttributes; private EOEntity _entity; private int _fetchIndex; - private int _fetchCount; private boolean _open; private IndexSearcher _searcher; private boolean _fetchInProgress = false; + private TopDocs _fetchedDocs; public ERLuceneAdaptorChannel(ERLuceneAdaptorContext context) { super(context); @@ -342,7 +420,9 @@ } public IndexSearcher searcher() throws CorruptIndexException, IOException { - if (_searcher == null/* || !adaptorContext().adaptor().indexReader().isCurrent()*/) { + if (_searcher == null/* + * || !adaptorContext().adaptor().indexReader().isCurrent () + */) { _searcher = new IndexSearcher(adaptorContext().adaptor().indexReader()); } return _searcher; @@ -370,7 +450,7 @@ private void reset() { _fetchInProgress = false; - _fetchCount = -1; + _fetchedDocs = null; _fetchIndex = -1; _entity = null; _searcher = null; @@ -416,7 +496,8 @@ NSMutableDictionary row = null; if (hasMoreRowsToReturn()) { try { - Document doc = searcher().doc(_fetchIndex++); + int docId = _fetchedDocs.scoreDocs[_fetchIndex++].doc; + Document doc = searcher().doc(docId); EOClassDescription cd = EOClassDescription.classDescriptionForEntityName(_entity.name()); NSMutableDictionary dict = cd._newDictionaryForProperties(); for (IndexAttribute attr : _indexAttributes) { @@ -448,7 +529,7 @@ } private boolean hasMoreRowsToReturn() { - return _fetchIndex < _fetchCount; + return _fetchIndex < _fetchedDocs.totalHits; } @Override @@ -474,7 +555,7 @@ } @Override - public void selectAttributes(NSArray attributesToFetch, EOFetchSpecification fetchSpecification, boolean shouldLock, EOEntity entity) { + public void selectAttributes(NSArray attributesToFetch, EOFetchSpecification fs, boolean shouldLock, EOEntity entity) { if (entity == null) { throw new IllegalArgumentException("null entity."); } @@ -489,38 +570,31 @@ try { _fetchIndex = 0; IndexSearcher searcher = searcher(); - Query query = queryForQualifier(fetchSpecification.qualifier()); - int fetchLimit = fetchSpecification.fetchLimit() > 0 ? fetchSpecification.fetchLimit() : Integer.MAX_VALUE; - fetchLimit = 5; + Query query = null; Sort sort = null; - if (fetchSpecification.sortOrderings().count() > 0) { - NSMutableArray<SortField> fields = new NSMutableArray<SortField>(fetchSpecification.sortOrderings().count()); - for (EOSortOrdering s : (NSArray<EOSortOrdering>) fetchSpecification.sortOrderings()) { - String name = s.key(); - NSSelector sel = s.selector(); - boolean reverse = sel.equals(EOSortOrdering.CompareDescending) || sel.equals(EOSortOrdering.CompareCaseInsensitiveDescending); - SortField sf = new SortField(name, 0, reverse); - fields.addObject(sf); - } - if(fields.count() > 0) { - sort = new Sort(); - sort.setSort(fields.toArray(new SortField[]{})); - } - } else { - searcher.search(query, new QueryWrapperFilter(query), fetchLimit); + + if(fs.hints() != null) { + query = (Query) fs.hints().objectForKey(ERLuceneAdaptor.QUERY_HINTS); + sort = (Sort) fs.hints().objectForKey(ERLuceneAdaptor.SORT_HINTS); } - if(sort != null) { - searcher.search(query, new QueryWrapperFilter(query), fetchLimit, sort); + if(query == null) { + query = queryForQualifier(fs.qualifier(), entity); + } + if(sort == null) { + sort = sortForSortOrderings(fs.sortOrderings()); + } + int fetchLimit = fs.fetchLimit() > 0 ? fs.fetchLimit() : Integer.MAX_VALUE; + if (sort != null) { + _fetchedDocs = searcher.search(query, null, fetchLimit, sort); } else { - searcher.search(query, new QueryWrapperFilter(query), fetchLimit); + _fetchedDocs = searcher.search(query, fetchLimit); } - _fetchCount = searcher.maxDoc(); } catch (EOGeneralAdaptorException e) { cancelFetch(); throw e; } catch (Throwable e) { cancelFetch(); - throw new ERLuceneAdaptorException("Failed to fetch '" + entity.name() + "' with fetch specification '" + fetchSpecification + "': " + e.getMessage(), e); + throw new ERLuceneAdaptorException("Failed to fetch '" + entity.name() + "' with fetch specification '" + fs + "': " + e.getMessage(), e); } } @@ -536,7 +610,7 @@ private Term termForDocument(Document doc, EOEntity entity) { for (IndexAttribute info : attributesForAttributes(entity.primaryKeyAttributes())) { - String name = info.name(); + String name = info.columnName(); String value = doc.get(name); Term term = new Term(name); term = term.createTerm(value); @@ -545,30 +619,17 @@ return null; } - private Query queryForQualifier(EOQualifier qualifier) { - if (qualifier == null && false) { - return new MatchAllDocsQuery(); - } - /* - * if(true) { FilteredQuery query = new FilteredQuery(null, new - * Filter()); query.add(new Term("content", "vessn*")); return query; - * - * } - */ - - LuceneQualifierTraversal traverser = new LuceneQualifierTraversal(); - traverser.traverse(qualifier); - Query query = traverser.query(); - return query; - } - private void fillWithDictionary(Document doc, NSDictionary row, EOEntity entity) { for (IndexAttribute info : attributesForEntity(entity)) { - Object value = row.objectForKey(info.attribute().name()); - - Field field = info.valueToField(value); - if (field != null) { - doc.add(field); + Object value = row.objectForKey(info.attribute().columnName()); + if (value != null) { + if(value == NSKeyValueCoding.NullValue) { + value = null; + } + Field field = info.valueToField(doc, value); + if (field != null) { + doc.add(field); + } } } } @@ -577,11 +638,12 @@ public int updateValuesInRowsDescribedByQualifier(NSDictionary updatedRow, EOQualifier qualifier, EOEntity entity) { try { IndexSearcher searcher = searcher(); - Query query = queryForQualifier(qualifier); - searcher.search(query, Integer.MAX_VALUE); - int count = searcher.maxDoc(); + Query query = queryForQualifier(qualifier, entity); + TopDocs fetchedDocs = searcher.search(query, Integer.MAX_VALUE); + int count = fetchedDocs.totalHits; for (int i = 0; i < count; i++) { - Document doc = searcher.doc(i); + int docId = fetchedDocs.scoreDocs[i].doc; + Document doc = searcher.doc(docId); fillWithDictionary(doc, updatedRow, entity); Term term = termForDocument(doc, entity); writer().updateDocument(term, doc); @@ -599,6 +661,7 @@ try { Document doc = new Document(); fillWithDictionary(doc, row, entity); + doc.add(new Field(EXTERNAL_NAME_KEY, entity.externalName(), Store.NO, Index.NOT_ANALYZED)); writer().addDocument(doc); } catch (EOGeneralAdaptorException e) { throw e; @@ -611,11 +674,12 @@ public int deleteRowsDescribedByQualifier(EOQualifier qualifier, EOEntity entity) { try { IndexSearcher searcher = searcher(); - Query query = queryForQualifier(qualifier); - searcher.search(query, null, Integer.MAX_VALUE); - int count = searcher.maxDoc(); + Query query = queryForQualifier(qualifier, entity); + TopDocs fetchedDocs = searcher.search(query, Integer.MAX_VALUE); + int count = fetchedDocs.totalHits; for (int i = 0; i < count; i++) { - Document doc = searcher.doc(i); + int docId = fetchedDocs.scoreDocs[i].doc; + Document doc = searcher.doc(docId); Term term = termForDocument(doc, entity); writer().deleteDocuments(term); } @@ -626,4 +690,45 @@ throw new ERLuceneAdaptorException("Failed to delete '" + entity.name() + "' with qualifier " + qualifier + ": " + e.getMessage(), e); } } + + /** + * Convenience method to create a Lucene query from an EOF qualifier. + * @param qualifier + * @param entity + * @return + */ + public static Query queryForQualifier(EOQualifier qualifier, EOEntity entity) { + if(qualifier == null) { + return new TermQuery(new Term(EXTERNAL_NAME_KEY, entity.externalName())); + } + LuceneQualifierTraversal traverser = new LuceneQualifierTraversal(entity); + traverser.traverse(qualifier, true); + Query query = traverser.query(); + return query; + } + + + /** + * Convenience method to create a Lucene sort from an EOF sort ordering array. + * @param sortOrderings + * @return + */ + public static Sort sortForSortOrderings(NSArray<EOSortOrdering> sortOrderings) { + Sort sort = null; + if (sortOrderings != null && sortOrderings.count() > 0) { + NSMutableArray<SortField> fields = new NSMutableArray<SortField>(sortOrderings.count()); + for (EOSortOrdering s : sortOrderings) { + String name = s.key(); + NSSelector sel = s.selector(); + boolean reverse = sel.equals(EOSortOrdering.CompareDescending) || sel.equals(EOSortOrdering.CompareCaseInsensitiveDescending); + SortField sf = new SortField(name, SortField.DOC, reverse); + fields.addObject(sf); + } + if (fields.count() > 0) { + sort = new Sort(); + sort.setSort(fields.toArray(new SortField[] {})); + } +... [truncated message content] |