私はAlfrescoでいくつかのスケジュールされたタスクを開発しています。これらのタスクの1つは、特定の日付プロパティが固定日数より古いノードでのみ実行する必要があります。範囲クエリを調べました:date:[MIN TO NOW]
、しかし、今は使用したくありませんが、x日前の日付です。
これをクエリで指定できますか?
私はAlfrescoでいくつかのスケジュールされたタスクを開発しています。これらのタスクの1つは、特定の日付プロパティが固定日数より古いノードでのみ実行する必要があります。範囲クエリを調べました:date:[MIN TO NOW]
、しかし、今は使用したくありませんが、x日前の日付です。
これをクエリで指定できますか?
こんにちはええ、それは非常に簡単に可能です。タスクにJavascriptをトリガーさせます。
Javascriptを実行するだけです。
var days = 7;
var time = date.getTime();
var add = 86400000 * days;
var newDate = new Date(time - add);
var dateString = utils.toISO8601(newDate);
次に、dateStringをクエリに使用します。"date:[MIN - " + dateString + "]"
スケジュールされたタスクは、Spring構成ファイルで定義されます。ACronScheduledQueryBasedTemplateActionDefinition
はクエリを実行し、すべての結果に対してアクションを実行します。主な問題は、動的な日付範囲をクエリに追加することでした。
ただし、これは実際にはクエリではなく、FreeMarkerで処理されるクエリテンプレートです。テンプレートの処理に使用されるモデルは、別のBeanである。によって作成されTemplateActionModelFactory
ます。
私たちの解決策は、このファクトリをサブクラス化して、テンプレートにより豊富なモデルを提供することでした。動的な日付範囲を計算する関数が追加されました。
public class CustomTemplateActionModelFactory extends FreeMarkerWithLuceneExtensionsModelFactory {
/**
* Function to calculate a date range based on the number of days in the past.
*/
private static class LuceneDateRangeOlderThanDays implements TemplateMethodModelEx {
@SuppressWarnings("rawtypes")
public Object exec(List args) throws TemplateModelException {
if (args.size() == 1) {
int days = ((TemplateNumberModel) args.get(0)).getAsNumber().intValue();
Date date = new Date(System.currentTimeMillis() - days * 24L * 3600 * 1000);
StringBuilder builder = new StringBuilder();
builder.append("[2001-01-01 TO ");
builder.append(DefaultTypeConverter.INSTANCE.convert(String.class, date));
builder.append("]");
return builder.toString();
} else {
throw new TemplateModelException("Invalid parameters.");
}
}
}
@Override
public Map<String, Object> getModel() {
// Extend the parent model with our custom function
Map<String, Object> model = super.getModel();
model.put("luceneDateRangeOlderThanDays", new LuceneDateRangeOlderThanDays());
return model;
}
}
AlfrescoリポジトリのSpring構成で、独自のTemplateActionModelFactoryを定義し、それを残りの構成で使用します。
<bean id="customTemplateActionModelFactory" class="com.db.cms.repository.util.DBTemplateActionModelFactory">
<property name="serviceRegistry">
<ref bean="ServiceRegistry" />
</property>
</bean>