Build fix

1) for tokenisation = false
2) so d:datetime properties index as expected

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@12444 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Andrew Hind
2008-12-17 12:29:54 +00:00
parent 39b0754c11
commit 01deeef511
9 changed files with 322 additions and 26 deletions

View File

@@ -29,9 +29,19 @@
</property> </property>
<property name="ia:fromDate"> <property name="ia:fromDate">
<type>d:datetime</type> <type>d:datetime</type>
<index enabled="true">
<atomic>true</atomic>
<stored>false</stored>
<tokenised>both</tokenised>
</index>
</property> </property>
<property name="ia:toDate"> <property name="ia:toDate">
<type>d:datetime</type> <type>d:datetime</type>
<index enabled="true">
<atomic>true</atomic>
<stored>false</stored>
<tokenised>both</tokenised>
</index>
</property> </property>
<property name="ia:whereEvent"> <property name="ia:whereEvent">
<type>d:text</type> <type>d:text</type>
@@ -54,9 +64,19 @@
</property> </property>
<property name="ia:fromDateDefault"> <property name="ia:fromDateDefault">
<type>d:datetime</type> <type>d:datetime</type>
<index enabled="true">
<atomic>true</atomic>
<stored>false</stored>
<tokenised>both</tokenised>
</index>
</property> </property>
<property name="ia:toDateDefault"> <property name="ia:toDateDefault">
<type>d:datetime</type> <type>d:datetime</type>
<index enabled="true">
<atomic>true</atomic>
<stored>false</stored>
<tokenised>both</tokenised>
</index>
</property> </property>
<property name="ia:whereEventDefault"> <property name="ia:whereEventDefault">
<type>d:text</type> <type>d:text</type>

View File

@@ -404,6 +404,11 @@
<type>d:datetime</type> <type>d:datetime</type>
<protected>true</protected> <protected>true</protected>
<mandatory enforced="true">true</mandatory> <mandatory enforced="true">true</mandatory>
<index enabled="true">
<atomic>true</atomic>
<stored>false</stored>
<tokenised>both</tokenised>
</index>
</property> </property>
<property name="cm:creator"> <property name="cm:creator">
<title>Creator</title> <title>Creator</title>
@@ -416,6 +421,11 @@
<type>d:datetime</type> <type>d:datetime</type>
<protected>true</protected> <protected>true</protected>
<mandatory enforced="true">true</mandatory> <mandatory enforced="true">true</mandatory>
<index enabled="true">
<atomic>true</atomic>
<stored>false</stored>
<tokenised>both</tokenised>
</index>
</property> </property>
<property name="cm:modifier"> <property name="cm:modifier">
<title>Modifier</title> <title>Modifier</title>
@@ -427,6 +437,11 @@
<title>Accessed</title> <title>Accessed</title>
<type>d:datetime</type> <type>d:datetime</type>
<protected>true</protected> <protected>true</protected>
<index enabled="true">
<atomic>true</atomic>
<stored>false</stored>
<tokenised>both</tokenised>
</index>
</property> </property>
</properties> </properties>
</aspect> </aspect>
@@ -490,6 +505,11 @@
<property name="cm:removeAfter"> <property name="cm:removeAfter">
<title>Remove After</title> <title>Remove After</title>
<type>d:datetime</type> <type>d:datetime</type>
<index enabled="true">
<atomic>true</atomic>
<stored>false</stored>
<tokenised>both</tokenised>
</index>
</property> </property>
</properties> </properties>
<mandatory-aspects> <mandatory-aspects>
@@ -650,10 +670,20 @@
<property name="cm:from"> <property name="cm:from">
<title>Effective From</title> <title>Effective From</title>
<type>d:datetime</type> <type>d:datetime</type>
<index enabled="true">
<atomic>true</atomic>
<stored>false</stored>
<tokenised>both</tokenised>
</index>
</property> </property>
<property name="cm:to"> <property name="cm:to">
<title>Effective To</title> <title>Effective To</title>
<type>d:datetime</type> <type>d:datetime</type>
<index enabled="true">
<atomic>true</atomic>
<stored>false</stored>
<tokenised>both</tokenised>
</index>
</property> </property>
</properties> </properties>
</aspect> </aspect>
@@ -862,6 +892,11 @@
<property name="cm:sentdate"> <property name="cm:sentdate">
<title>Sent Date</title> <title>Sent Date</title>
<type>d:datetime</type> <type>d:datetime</type>
<index enabled="true">
<atomic>true</atomic>
<stored>false</stored>
<tokenised>both</tokenised>
</index>
</property> </property>
</properties> </properties>
</aspect> </aspect>
@@ -949,10 +984,20 @@
<property name="cm:published"> <property name="cm:published">
<title>Published</title> <title>Published</title>
<type>d:datetime</type> <type>d:datetime</type>
<index enabled="true">
<atomic>true</atomic>
<stored>false</stored>
<tokenised>both</tokenised>
</index>
</property> </property>
<property name="cm:updated"> <property name="cm:updated">
<title>Updated</title> <title>Updated</title>
<type>d:datetime</type> <type>d:datetime</type>
<index enabled="true">
<atomic>true</atomic>
<stored>false</stored>
<tokenised>both</tokenised>
</index>
</property> </property>
</properties> </properties>
</aspect> </aspect>

View File

@@ -160,6 +160,11 @@
<property name="sys:archivedDate"> <property name="sys:archivedDate">
<type>d:datetime</type> <type>d:datetime</type>
<mandatory>true</mandatory> <mandatory>true</mandatory>
<index enabled="true">
<atomic>true</atomic>
<stored>false</stored>
<tokenised>both</tokenised>
</index>
</property> </property>
<property name="sys:archivedOriginalOwner"> <property name="sys:archivedOriginalOwner">
<type>d:text</type> <type>d:text</type>

View File

@@ -396,6 +396,11 @@
<title>Time Of Deploy Attempt</title> <title>Time Of Deploy Attempt</title>
<type>d:datetime</type> <type>d:datetime</type>
<mandatory enforced="true">true</mandatory> <mandatory enforced="true">true</mandatory>
<index enabled="true">
<atomic>true</atomic>
<stored>false</stored>
<tokenised>both</tokenised>
</index>
</property> </property>
</properties> </properties>
<associations> <associations>
@@ -431,11 +436,21 @@
<title>Time Deploy Started</title> <title>Time Deploy Started</title>
<type>d:datetime</type> <type>d:datetime</type>
<mandatory enforced="true">true</mandatory> <mandatory enforced="true">true</mandatory>
<index enabled="true">
<atomic>true</atomic>
<stored>false</stored>
<tokenised>both</tokenised>
</index>
</property> </property>
<property name="wca:deployendtime"> <property name="wca:deployendtime">
<title>Time Deploy Finished</title> <title>Time Deploy Finished</title>
<type>d:datetime</type> <type>d:datetime</type>
<mandatory enforced="true">true</mandatory> <mandatory enforced="true">true</mandatory>
<index enabled="true">
<atomic>true</atomic>
<stored>false</stored>
<tokenised>both</tokenised>
</index>
</property> </property>
<property name="wca:deploysuccessful"> <property name="wca:deploysuccessful">
<title>Deployment Successful</title> <title>Deployment Successful</title>
@@ -624,6 +639,11 @@
<title>Expiration Date</title> <title>Expiration Date</title>
<type>d:datetime</type> <type>d:datetime</type>
<mandatory enforced="true">true</mandatory> <mandatory enforced="true">true</mandatory>
<index enabled="true">
<atomic>true</atomic>
<stored>false</stored>
<tokenised>both</tokenised>
</index>
</property> </property>
</properties> </properties>
</aspect> </aspect>

View File

@@ -238,6 +238,11 @@
<title>Launch Date</title> <title>Launch Date</title>
<description>Date the content in the submission should be committed</description> <description>Date the content in the submission should be committed</description>
<type>d:datetime</type> <type>d:datetime</type>
<index enabled="true">
<atomic>true</atomic>
<stored>false</stored>
<tokenised>both</tokenised>
</index>
</property> </property>
<property name="wcmwf:validateLinks"> <property name="wcmwf:validateLinks">
<title>Validate Links</title> <title>Validate Links</title>

View File

@@ -1014,6 +1014,9 @@ public class ADMLuceneIndexerImpl extends AbstractLuceneIndexerImpl<NodeRef> imp
{ {
doc.add(new Field(attributeName + "." + localeText + ".sort", t.termText(), Field.Store.NO, Field.Index.NO_NORMS, Field.TermVector.NO)); doc.add(new Field(attributeName + "." + localeText + ".sort", t.termText(), Field.Store.NO, Field.Index.NO_NORMS, Field.TermVector.NO));
} }
doc.add(new Field(attributeName, t.termText(), Field.Store.NO, Field.Index.NO_NORMS, Field.TermVector.NO));
} }
} }
catch (IOException e) catch (IOException e)
@@ -1083,6 +1086,7 @@ public class ADMLuceneIndexerImpl extends AbstractLuceneIndexerImpl<NodeRef> imp
{ {
locale = I18NUtil.getLocale(); locale = I18NUtil.getLocale();
} }
StringBuilder builder; StringBuilder builder;
MLAnalysisMode analysisMode; MLAnalysisMode analysisMode;
VerbatimAnalyser vba; VerbatimAnalyser vba;
@@ -1118,6 +1122,8 @@ public class ADMLuceneIndexerImpl extends AbstractLuceneIndexerImpl<NodeRef> imp
{ {
doc.add(new Field(attributeName + "." + localeText + ".sort", t.termText(), Field.Store.NO, Field.Index.NO_NORMS, Field.TermVector.NO)); doc.add(new Field(attributeName + "." + localeText + ".sort", t.termText(), Field.Store.NO, Field.Index.NO_NORMS, Field.TermVector.NO));
} }
doc.add(new Field(attributeName, t.termText(), Field.Store.NO, Field.Index.NO_NORMS, Field.TermVector.NO));
} }
} }
catch (IOException e) catch (IOException e)
@@ -1176,7 +1182,7 @@ public class ADMLuceneIndexerImpl extends AbstractLuceneIndexerImpl<NodeRef> imp
try try
{ {
date = df.parse(strValue); date = df.parse(strValue);
doc.add(new Field(attributeName + ".sort", df.format(date), Field.Store.NO, Field.Index.NO_NORMS, Field.TermVector.NO)); doc.add(new Field(attributeName, df.format(date), Field.Store.NO, Field.Index.NO_NORMS, Field.TermVector.NO));
} }
catch (ParseException e) catch (ParseException e)
{ {
@@ -1185,7 +1191,7 @@ public class ADMLuceneIndexerImpl extends AbstractLuceneIndexerImpl<NodeRef> imp
break; break;
case BOTH: case BOTH:
doc.add(new Field(attributeName, strValue, fieldStore, fieldIndex, Field.TermVector.NO)); doc.add(new Field(attributeName, strValue, fieldStore, fieldIndex, Field.TermVector.NO));
df = CachingDateFormat.getDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", true); df = CachingDateFormat.getDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", true);
try try
{ {

View File

@@ -54,7 +54,10 @@ import org.alfresco.repo.content.transform.ContentTransformer;
import org.alfresco.repo.dictionary.IndexTokenisationMode; import org.alfresco.repo.dictionary.IndexTokenisationMode;
import org.alfresco.repo.domain.PropertyValue; import org.alfresco.repo.domain.PropertyValue;
import org.alfresco.repo.search.IndexMode; import org.alfresco.repo.search.IndexMode;
import org.alfresco.repo.search.MLAnalysisMode;
import org.alfresco.repo.search.impl.lucene.analysis.DateTimeAnalyser; import org.alfresco.repo.search.impl.lucene.analysis.DateTimeAnalyser;
import org.alfresco.repo.search.impl.lucene.analysis.MLTokenDuplicator;
import org.alfresco.repo.search.impl.lucene.analysis.VerbatimAnalyser;
import org.alfresco.repo.search.impl.lucene.fts.FTSIndexerAware; import org.alfresco.repo.search.impl.lucene.fts.FTSIndexerAware;
import org.alfresco.repo.search.impl.lucene.fts.FullTextSearchIndexer; import org.alfresco.repo.search.impl.lucene.fts.FullTextSearchIndexer;
import org.alfresco.repo.transaction.AlfrescoTransactionSupport; import org.alfresco.repo.transaction.AlfrescoTransactionSupport;
@@ -85,6 +88,7 @@ import org.alfresco.util.ISO9075;
import org.alfresco.util.Pair; import org.alfresco.util.Pair;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.apache.lucene.analysis.Token;
import org.apache.lucene.document.Document; import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field; import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.IndexReader;
@@ -739,6 +743,8 @@ public class AVMLuceneIndexerImpl extends AbstractLuceneIndexerImpl<String> impl
if (isContent) if (isContent)
{ {
// Content is always tokenised
ContentData contentData = DefaultTypeConverter.INSTANCE.convert(ContentData.class, serializableValue); ContentData contentData = DefaultTypeConverter.INSTANCE.convert(ContentData.class, serializableValue);
if (!index || contentData.getMimetype() == null) if (!index || contentData.getMimetype() == null)
{ {
@@ -815,6 +821,12 @@ public class AVMLuceneIndexerImpl extends AbstractLuceneIndexerImpl<String> impl
transformer.transform(reader, writer); transformer.transform(reader, writer);
// point the reader to the new-written content // point the reader to the new-written content
reader = writer.getReader(); reader = writer.getReader();
// Check that the reader is a view onto something concrete
if (!reader.exists())
{
throw new ContentIOException("The transformation did not write any content, yet: \n"
+ " transformer: " + transformer + "\n" + " temp writer: " + writer);
}
} }
catch (ContentIOException e) catch (ContentIOException e)
{ {
@@ -899,9 +911,88 @@ public class AVMLuceneIndexerImpl extends AbstractLuceneIndexerImpl<String> impl
for (Locale locale : mlText.getLocales()) for (Locale locale : mlText.getLocales())
{ {
String localeString = mlText.getValue(locale); String localeString = mlText.getValue(locale);
StringBuilder builder = new StringBuilder(); StringBuilder builder;
builder.append("\u0000").append(locale.toString()).append("\u0000").append(localeString); MLAnalysisMode analysisMode;
doc.add(new Field(attributeName, builder.toString(), fieldStore, fieldIndex, Field.TermVector.NO)); VerbatimAnalyser vba;
MLTokenDuplicator duplicator;
Token t;
switch (tokenise)
{
case TRUE:
builder = new StringBuilder();
builder.append("\u0000").append(locale.toString()).append("\u0000").append(localeString);
doc.add(new Field(attributeName, builder.toString(), fieldStore, fieldIndex, Field.TermVector.NO));
break;
case FALSE:
// analyse ml text
analysisMode = getLuceneConfig().getDefaultMLIndexAnalysisMode();
// Do the analysis here
vba = new VerbatimAnalyser(false);
duplicator = new MLTokenDuplicator(vba.tokenStream(attributeName, new StringReader(localeString)), locale, null, analysisMode);
try
{
while ((t = duplicator.next()) != null)
{
String localeText = "";
if (t.termText().indexOf('{') == 0)
{
int end = t.termText().indexOf('}', 1);
if (end != -1)
{
localeText = t.termText().substring(1, end);
}
}
if (localeText.length() > 0)
{
doc.add(new Field(attributeName, t.termText(), Field.Store.NO, Field.Index.NO_NORMS, Field.TermVector.NO));
}
doc.add(new Field(attributeName, t.termText(), Field.Store.NO, Field.Index.NO_NORMS, Field.TermVector.NO));
}
}
catch (IOException e)
{
// TODO ??
}
break;
case BOTH:
builder = new StringBuilder();
builder.append("\u0000").append(locale.toString()).append("\u0000").append(localeString);
doc.add(new Field(attributeName, builder.toString(), fieldStore, fieldIndex, Field.TermVector.NO));
// analyse ml text
analysisMode = getLuceneConfig().getDefaultMLIndexAnalysisMode();
// Do the analysis here
vba = new VerbatimAnalyser(false);
duplicator = new MLTokenDuplicator(vba.tokenStream(attributeName, new StringReader(localeString)), locale, null, analysisMode);
try
{
while ((t = duplicator.next()) != null)
{
String localeText = "";
if (t.termText().indexOf('{') == 0)
{
int end = t.termText().indexOf('}', 1);
if (end != -1)
{
localeText = t.termText().substring(1, end);
}
}
if (localeText.length() > 0)
{
doc.add(new Field(attributeName + "." + localeText + ".sort", t.termText(), Field.Store.NO, Field.Index.NO_NORMS, Field.TermVector.NO));
}
}
}
catch (IOException e)
{
// TODO ??
}
break;
}
} }
} }
else if (isText) else if (isText)
@@ -929,42 +1020,121 @@ public class AVMLuceneIndexerImpl extends AbstractLuceneIndexerImpl<String> impl
} }
StringBuilder builder; StringBuilder builder;
switch(tokenise) MLAnalysisMode analysisMode;
VerbatimAnalyser vba;
MLTokenDuplicator duplicator;
Token t;
switch (tokenise)
{ {
default: default:
case TRUE: case TRUE:
builder = new StringBuilder(); builder = new StringBuilder();
builder.append("\u0000").append(locale.toString()).append("\u0000").append(strValue); builder.append("\u0000").append(locale.toString()).append("\u0000").append(strValue);
doc.add(new Field(attributeName, builder.toString(), fieldStore, fieldIndex, Field.TermVector.NO)); doc.add(new Field(attributeName, builder.toString(), fieldStore, fieldIndex, Field.TermVector.NO));
break; break;
case FALSE: case FALSE:
doc.add(new Field(attributeName, strValue, fieldStore, fieldIndex, Field.TermVector.NO)); analysisMode = getLuceneConfig().getDefaultMLIndexAnalysisMode();
break; // Do the analysis here
vba = new VerbatimAnalyser(false);
duplicator = new MLTokenDuplicator(vba.tokenStream(attributeName, new StringReader(strValue)), locale, null, analysisMode);
try
{
while ((t = duplicator.next()) != null)
{
String localeText = "";
if (t.termText().indexOf('{') == 0)
{
int end = t.termText().indexOf('}', 1);
if (end != -1)
{
localeText = t.termText().substring(1, end);
}
}
if (localeText.length() > 0)
{
doc.add(new Field(attributeName, t.termText(), Field.Store.NO, Field.Index.NO_NORMS, Field.TermVector.NO));
}
doc.add(new Field(attributeName, t.termText(), Field.Store.NO, Field.Index.NO_NORMS, Field.TermVector.NO));
}
}
catch (IOException e)
{
// TODO ??
}
break;
case BOTH: case BOTH:
builder = new StringBuilder(); builder = new StringBuilder();
builder.append("\u0000").append(locale.toString()).append("\u0000").append(strValue); builder.append("\u0000").append(locale.toString()).append("\u0000").append(strValue);
doc.add(new Field(attributeName, builder.toString(), fieldStore, fieldIndex, Field.TermVector.NO)); doc.add(new Field(attributeName, builder.toString(), fieldStore, fieldIndex, Field.TermVector.NO));
doc.add(new Field(attributeName, strValue, fieldStore, fieldIndex, Field.TermVector.NO)); analysisMode = getLuceneConfig().getDefaultMLIndexAnalysisMode();
break; // Do the analysis here
vba = new VerbatimAnalyser(false);
duplicator = new MLTokenDuplicator(vba.tokenStream(attributeName, new StringReader(strValue)), locale, null, analysisMode);
try
{
while ((t = duplicator.next()) != null)
{
String localeText = "";
if (t.termText().indexOf('{') == 0)
{
int end = t.termText().indexOf('}', 1);
if (end != -1)
{
localeText = t.termText().substring(1, end);
}
}
if (localeText.length() > 0)
{
doc.add(new Field(attributeName + "." + localeText + ".sort", t.termText(), Field.Store.NO, Field.Index.NO_NORMS, Field.TermVector.NO));
}
}
}
catch (IOException e)
{
// TODO ??
}
break;
} }
} }
else if (isDateTime) else if (isDateTime)
{ {
SimpleDateFormat df;
doc.add(new Field(attributeName, strValue, fieldStore, fieldIndex, Field.TermVector.NO));
SimpleDateFormat df = CachingDateFormat.getDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", true);
Date date; Date date;
try switch (tokenise)
{ {
date = df.parse(strValue); default:
doc.add(new Field(attributeName + ".sort", df.format(date), Field.Store.NO, Field.Index.NO_NORMS, Field.TermVector.NO)); case TRUE:
} doc.add(new Field(attributeName, strValue, fieldStore, fieldIndex, Field.TermVector.NO));
catch (ParseException e) break;
{ case FALSE:
// ignore for ordering df = CachingDateFormat.getDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", true);
try
{
date = df.parse(strValue);
doc.add(new Field(attributeName, df.format(date), Field.Store.NO, Field.Index.NO_NORMS, Field.TermVector.NO));
}
catch (ParseException e)
{
// ignore for ordering
}
break;
case BOTH:
doc.add(new Field(attributeName, strValue, fieldStore, fieldIndex, Field.TermVector.NO));
df = CachingDateFormat.getDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", true);
try
{
date = df.parse(strValue);
doc.add(new Field(attributeName + ".sort", df.format(date), Field.Store.NO, Field.Index.NO_NORMS, Field.TermVector.NO));
}
catch (ParseException e)
{
// ignore for ordering
}
break;
} }
} }
else else

View File

@@ -49,12 +49,22 @@
</property> </property>
<property name="usr:accountExpiryDate"> <property name="usr:accountExpiryDate">
<type>d:datetime</type> <type>d:datetime</type>
<index enabled="true">
<atomic>true</atomic>
<stored>false</stored>
<tokenised>both</tokenised>
</index>
</property> </property>
<property name="usr:credentialsExpire"> <property name="usr:credentialsExpire">
<type>d:boolean</type> <type>d:boolean</type>
</property> </property>
<property name="usr:credentialsExpiryDate"> <property name="usr:credentialsExpiryDate">
<type>d:datetime</type> <type>d:datetime</type>
<index enabled="true">
<atomic>true</atomic>
<stored>false</stored>
<tokenised>both</tokenised>
</index>
</property> </property>
<property name="usr:accountLocked"> <property name="usr:accountLocked">
<type>d:boolean</type> <type>d:boolean</type>

View File

@@ -109,6 +109,11 @@
<title>Created</title> <title>Created</title>
<type>d:datetime</type> <type>d:datetime</type>
<protected>true</protected> <protected>true</protected>
<index enabled="true">
<atomic>true</atomic>
<stored>false</stored>
<tokenised>both</tokenised>
</index>
</property> </property>
<property name="ver2:frozenCreator"> <property name="ver2:frozenCreator">
<title>Creator</title> <title>Creator</title>
@@ -119,6 +124,11 @@
<title>Modified</title> <title>Modified</title>
<type>d:datetime</type> <type>d:datetime</type>
<protected>true</protected> <protected>true</protected>
<index enabled="true">
<atomic>true</atomic>
<stored>false</stored>
<tokenised>both</tokenised>
</index>
</property> </property>
<property name="ver2:frozenModifier"> <property name="ver2:frozenModifier">
<title>Modifier</title> <title>Modifier</title>
@@ -129,6 +139,11 @@
<title>Accessed</title> <title>Accessed</title>
<type>d:datetime</type> <type>d:datetime</type>
<protected>true</protected> <protected>true</protected>
<index enabled="true">
<atomic>true</atomic>
<stored>false</stored>
<tokenised>both</tokenised>
</index>
</property> </property>
</properties> </properties>