#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

# Purge job interval (in days)
profile.purge.interval=${org.apache.unomi.profile.purge.interval:-1}

# Purge profiles that have been inactive for a specific number of days
profile.purge.inactiveTime=${org.apache.unomi.profile.purge.inactiveTime:-180}

# Purge profiles that have been created for a specific number of days
profile.purge.existTime=${org.apache.unomi.profile.purge.existTime:--1}

# Refresh Elasticsearch after saving a profile
profile.forceRefreshOnSave=${org.apache.unomi.profile.forceRefreshOnSave:-false}

# Purge all sessions/events that have been created for a specific number of months
event.purge.existTime=${org.apache.unomi.event.purge.existTime:-12}

# When performing segment updates, this controls the size of the scrolling query size used to iterate over all the
# profiles that need updating
segment.update.batchSize=${org.apache.unomi.segment.update.batchSize:-1000}

# When performing segment updates, can retry an update in case of an error to a single profile
segment.max.retries.update.profile.segment=${org.apache.unomi.services.segment.max.retries.update.profile.segment:-0}

# When performing retry of segment update after a request was failed, delay of requests
segment.retry.update.segment.seconds.delay=${org.apache.unomi.services.segment.update.segment.retry.seconds.delay:-1}

# Run Batch request separately for updating segments in profiles
segment.batch.update=${org.apache.unomi.segment.batch.update:-false}

# Send Profile Updated Event for every profile segment update
segment.send.profile.update.event=${org.apache.unomi.segment.send.profile.update.event:-true}

# Daily hour once a day to recalculate segment with dateExpr condition
segment.daily.dateexpr.evaluation.hourutc=${org.apache.unomi.segment.daily.dateexpr.evaluation.hourutc:-5}

# The interval in milliseconds to use to reload the definitions (condition types and action types)
definitions.refresh.interval=${org.apache.unomi.definitions.refresh.interval:-10000}

# The interval in milliseconds to use to reload the property types
properties.refresh.interval=${org.apache.unomi.properties.refresh.interval:-10000}

# The interval in milliseconds to use to reload the segments and scoring plans
segment.refresh.interval=${org.apache.unomi.segment.refresh.interval:-1000}

# The interval in days to use to recalculate segments/scoring plans on profile
segment.recalculate.period=${org.apache.unomi.segment.recalculate.period:-1}

# The interval in milliseconds to use to reload the rules
rules.refresh.interval=${org.apache.unomi.rules.refresh.interval:-1000}

# The interval in milliseconds to use to reload the scopes
scopes.refresh.interval=${org.apache.unomi.scopes.refresh.interval:-1000}

# The interval in milliseconds to use to reload the rules statistics
rules.statistics.refresh.interval=${org.apache.unomi.rules.statistics.refresh.interval:-10000}

# The indicator should be checked is there a sourceId in the system or not
events.shouldBeCheckedEventSourceId=${org.apache.unomi.events.shouldBeCheckedEventSourceId:-false}

# If this setting is active, the rules engine will try to classify the events by event type internally which makes
# rules execution a lot faster. If there are any problems detected with rules execution, you might want to try to turn
# off the optimization and file a bug report if this fixed the problem.
rules.optimizationActivated=${org.apache.unomi.rules.optimizationActivated:-true}

# The number of threads to compose the pool size of the scheduler.
scheduler.thread.poolSize=${org.apache.unomi.scheduler.thread.poolSize:-5}
