399 строки
14 KiB
Python
Executable File
399 строки
14 KiB
Python
Executable File
#!/usr/bin/env python
|
|
|
|
try:
|
|
from localsettings import *
|
|
except ImportError:
|
|
from localsettings_django import *
|
|
|
|
MYSQL_SOURCE_CONFIG = """
|
|
type = mysql
|
|
sql_host = %s
|
|
sql_user = %s
|
|
sql_pass = %s
|
|
sql_db = %s
|
|
|
|
sql_query_pre = SET NAMES utf8
|
|
sql_query_pre = SET SESSION query_cache_type=OFF
|
|
""" % (MYSQL_HOST, MYSQL_USER, MYSQL_PASS, MYSQL_NAME,)
|
|
|
|
CHARSET_DATA = """
|
|
charset_type = utf-8
|
|
charset_table = 0..9, U+41..U+5a->U+61..U+7a, U+61..U+7a, U+aa, U+b5, \
|
|
U+ba, U+c0..U+d6->U+e0..U+f6, U+d8..U+de->U+f8..U+fe, U+df..U+f6, \
|
|
U+f8..U+ff, U+100..U+12f/2, U+130->U+69, U+131, U+132..U+137/2, \
|
|
U+138, U+139..U+148/2, U+149, U+14a..U+177/2, U+178->U+ff, \
|
|
U+179..U+17e/2, U+17f..U+180, U+181->U+253, U+182..U+185/2, \
|
|
U+186->U+254, U+187..U+188/2, U+189..U+18a->U+256..U+257, \
|
|
U+18b..U+18c/2, U+18d, U+18e->U+1dd, U+18f->U+259, U+190->U+25b, \
|
|
U+191..U+192/2, U+193->U+260, U+194->U+263, U+195, U+196->U+269, \
|
|
U+197->U+268, U+198..U+199/2, U+19a..U+19b, U+19c->U+26f, \
|
|
U+19d->U+272, U+19e, U+19f->U+275, U+1a0..U+1a5/2, \
|
|
U+1a6->U+280, U+1a7..U+1a8/2, U+1a9->U+283, U+1aa..U+1ab, \
|
|
U+1ac..U+1ad/2, U+1ae->U+288, U+1af..U+1b0/2, \
|
|
U+1b1..U+1b2->U+28a..U+28b, U+1b3..U+1b6/2, U+1b7->U+292, \
|
|
U+1b8..U+1b9/2, U+1ba..U+1bb, U+1bc..U+1bd/2, U+1be..U+1c3, \
|
|
U+1c4->U+1c6, U+1c5..U+1c6/2, U+1c7->U+1c9, U+1c8..U+1c9/2, \
|
|
U+1ca->U+1cc, U+1cb..U+1dc/2, U+1dd, U+1de..U+1ef/2, U+1f0, \
|
|
U+1f1->U+1f3, U+1f2..U+1f5/2, U+1f6->U+195, U+1f7->U+1bf, \
|
|
U+1f8..U+21f/2, U+220->U+19e, U+221, U+222..U+233/2, \
|
|
U+234..U+23a, U+23b..U+23c/2, U+23d->U+19a, U+23e..U+240, \
|
|
U+241->U+294, U+250..U+2c1, U+2c6..U+2d1, U+2e0..U+2e4, U+2ee, \
|
|
U+37a, U+386..U+389->U+3ac..U+3af, U+38c..U+38e->U+3cc..U+3ce, \
|
|
U+390, U+391..U+3a1->U+3b1..U+3c1, U+3a3..U+3ab->U+3c3..U+3cb, \
|
|
U+3ac..U+3ce, U+3d0..U+3d7, U+3d8..U+3ef/2, U+3f0..U+3f3, \
|
|
U+3f4->U+3b8, U+3f5, U+3f7..U+3f8/2, U+3f9->U+3f2, \
|
|
U+3fa..U+3fb/2, U+3fc..U+3ff, U+400..U+40f->U+450..U+45f, \
|
|
U+410..U+42f->U+430..U+44f, U+430..U+45f, U+460..U+481/2, \
|
|
U+48a..U+4bf/2, U+4c0, U+4c1..U+4ce/2, U+4d0..U+4f9/2, \
|
|
U+500..U+50f/2, U+531..U+556->U+561..U+586, U+559, U+561..U+587, \
|
|
U+5d0..U+5ea, U+5f0..U+5f2, U+621..U+63a, U+640..U+64a, \
|
|
U+66e..U+66f, U+671..U+6d3, U+6d5, U+6e5..U+6e6, U+6ee..U+6ef, \
|
|
U+6fa..U+6fc, U+6ff, U+e01..U+e30, U+e32..U+e33, U+e40..U+e46, \
|
|
U+e81..U+e82, U+e84, U+e87..U+e88, U+e8a, U+e8d, U+e94..U+e97, \
|
|
U+e99..U+e9f, U+ea1..U+ea3, U+ea5, U+ea7, U+eaa..U+eab, \
|
|
U+ead..U+eb0, U+eb2..U+eb3, U+ebd, U+ec0..U+ec4, U+ec6, \
|
|
U+edc..U+edd, U+1000..U+1021, U+1023..U+1027, U+1029..U+102a, \
|
|
U+1050..U+1055, U+10a0..U+10c5->U+2d00..U+2d25, U+10d0..U+10fa, \
|
|
U+10fc, U+2d00..U+2d25, U+1d00..U+1dbf, U+1e00..U+1e95/2, \
|
|
U+1e96..U+1e9b, U+1ea0..U+1ef9/2, U+3005..U+3006, U+3031..U+3035, \
|
|
U+303b..U+303c, U+3041..U+3096, U+309d..U+309f, U+30a1..U+30fa, \
|
|
U+30fc..U+30ff, U+31f0..U+31ff
|
|
ngram_chars = U+3400..U+4DB5, U+4E00..U+9FA5, U+20000..U+2A6D6
|
|
ngram_len = 1
|
|
"""
|
|
|
|
# TODO(davedash): When we stop serving featured/creatured via sphinx we can
|
|
# remove `recommended`
|
|
|
|
config = """
|
|
source addons
|
|
{
|
|
""" + MYSQL_SOURCE_CONFIG + """
|
|
sql_query = \
|
|
SELECT \
|
|
id, app, addon_id, type, status as addon_status, locale, \
|
|
locale_ord, averagerating, weeklydownloads, totaldownloads, \
|
|
inactive, guid_ord, name, UPPER(name) AS name_ord, \
|
|
description, summary, developercomments, \
|
|
( \
|
|
SELECT 1 FROM features f \
|
|
WHERE f.addon_id=t.addon_id \
|
|
AND f.start <= NOW() \
|
|
AND f.end > NOW() \
|
|
AND (f.locale IS NULL OR t.locale = f.locale) \
|
|
AND t.app = f.application_id \
|
|
LIMIT 1 \
|
|
) AS recommended, \
|
|
IF (status=6 OR type=9, 1, \
|
|
( \
|
|
SELECT count(*) \
|
|
FROM files f \
|
|
WHERE f.version_id=t.current_version AND f.status>0 \
|
|
) \
|
|
) AS num_files, \
|
|
(\
|
|
SELECT count(DISTINCT av.application_id) \
|
|
FROM applications_versions av \
|
|
WHERE av.version_id=t.current_version \
|
|
) AS num_apps, \
|
|
( \
|
|
SELECT GROUP_CONCAT(username) \
|
|
FROM addons_users au, users u \
|
|
WHERE addon_id=t.addon_id AND au.user_id = u.id AND listed = 1 \
|
|
) AS authors, \
|
|
( \
|
|
SELECT GROUP_CONCAT(tag_text) \
|
|
FROM users_tags_addons, tags \
|
|
WHERE tags.id = tag_id \
|
|
AND tags.blacklisted = 0 \
|
|
AND addon_id = t.addon_id \
|
|
) AS tags, \
|
|
( \
|
|
SELECT IF(type=4,9999999999999, max(version_int)) \
|
|
FROM applications_versions s_av, appversions max \
|
|
WHERE s_av.application_id = t.app \
|
|
AND s_av.version_id = t.current_version AND s_av.max = max.id \
|
|
) AS max_ver, \
|
|
( \
|
|
SELECT IF(type=4,0, min(version_int)) \
|
|
FROM applications_versions s_av, appversions min \
|
|
WHERE s_av.application_id = t.app \
|
|
AND s_av.version_id = t.current_version \
|
|
AND s_av.min = min.id \
|
|
) AS min_ver, \
|
|
created, \
|
|
modified \
|
|
FROM \
|
|
( \
|
|
SELECT DISTINCT \
|
|
(name.autoid*100+IFNULL(av.application_id,0)) AS id, \
|
|
IF(a.addontype_id = 4, 99, \
|
|
IF(a.addontype_id = 9, 98, av.application_id)) AS app, \
|
|
a.id AS addon_id, \
|
|
a.addontype_id AS type, \
|
|
a.status, \
|
|
CRC32(LOWER(a.guid)) AS guid_ord, \
|
|
name.locale, \
|
|
CRC32(name.locale) AS locale_ord, \
|
|
a.bayesianrating AS averagerating, \
|
|
a.weeklydownloads, \
|
|
a.totaldownloads, \
|
|
a.inactive, \
|
|
LTRIM(name.localized_string) AS name, \
|
|
description.localized_string AS description, \
|
|
summary.localized_string AS summary, \
|
|
a.current_version, \
|
|
developercomments.localized_string AS developercomments, \
|
|
UNIX_TIMESTAMP(a.created) AS created, \
|
|
UNIX_TIMESTAMP(a.last_updated) AS modified \
|
|
FROM \
|
|
( \
|
|
translations name, \
|
|
addons a \
|
|
LEFT JOIN applications_versions av \
|
|
ON av.version_id = a.current_version \
|
|
) \
|
|
LEFT JOIN translations description \
|
|
ON a.description = description.id \
|
|
AND description.locale = name.locale \
|
|
LEFT JOIN translations summary \
|
|
ON a.summary = summary.id \
|
|
AND summary.locale = name.locale \
|
|
LEFT JOIN translations developercomments \
|
|
ON a.developercomments = developercomments.id \
|
|
AND developercomments.locale = name.locale \
|
|
WHERE \
|
|
a.name = name.id \
|
|
AND name.localized_string IS NOT NULL \
|
|
AND \
|
|
( \
|
|
description.localized_string IS NOT NULL \
|
|
OR summary.localized_string IS NOT NULL \
|
|
OR defaultlocale = name.locale \
|
|
) \
|
|
) t
|
|
|
|
sql_attr_uint = addon_id
|
|
sql_attr_uint = app
|
|
sql_attr_uint = num_files
|
|
sql_attr_uint = num_apps
|
|
sql_attr_str2ordinal = name_ord
|
|
sql_attr_uint = guid_ord
|
|
sql_attr_uint = type
|
|
sql_attr_uint = addon_status
|
|
sql_attr_uint = weeklydownloads
|
|
sql_attr_uint = totaldownloads
|
|
sql_attr_uint = locale_ord
|
|
sql_attr_bigint = max_ver
|
|
sql_attr_bigint = min_ver
|
|
sql_attr_str2ordinal = locale
|
|
sql_attr_float = averagerating
|
|
sql_attr_bool = inactive
|
|
sql_attr_bool = recommended
|
|
sql_attr_timestamp = created
|
|
sql_attr_timestamp = modified
|
|
|
|
sql_attr_multi = uint category from query; \
|
|
SELECT \
|
|
(name.autoid*100+IFNULL(av.application_id,0)) id, \
|
|
ac.category_id AS category \
|
|
FROM \
|
|
(translations name, addons a, addons_categories ac) \
|
|
LEFT JOIN applications_versions av ON av.version_id = a.current_version \
|
|
WHERE \
|
|
a.name = name.id AND \
|
|
a.id = ac.addon_id
|
|
|
|
sql_attr_multi = uint category_featured from query; \
|
|
SELECT \
|
|
(name.autoid*100+IFNULL(av.application_id,0)) id, \
|
|
ac.category_id AS category \
|
|
FROM \
|
|
(translations name, addons a, addons_categories ac) \
|
|
LEFT JOIN applications_versions av ON av.version_id = a.current_version \
|
|
WHERE \
|
|
ac.feature = 1 AND \
|
|
a.name = name.id AND \
|
|
a.id = ac.addon_id
|
|
|
|
sql_attr_multi = uint tag from query; \
|
|
SELECT DISTINCT\
|
|
(name.autoid*100+IFNULL(av.application_id,0)) id, \
|
|
t.tag_id AS tag \
|
|
FROM \
|
|
(translations name, addons a, users_tags_addons t, tags tt) \
|
|
LEFT JOIN applications_versions av ON av.version_id = a.current_version \
|
|
WHERE \
|
|
a.name = name.id AND \
|
|
tt.id = t.tag_id AND \
|
|
tt.blacklisted = 0 AND \
|
|
a.id = t.addon_id
|
|
|
|
sql_attr_multi = uint platform from query; \
|
|
SELECT \
|
|
(name.autoid*100+IFNULL(av.application_id,0)) id, \
|
|
IFNULL(platform_id,1) AS platform \
|
|
FROM \
|
|
(translations name, addons a) \
|
|
LEFT JOIN applications_versions av ON av.version_id = a.current_version \
|
|
LEFT JOIN files f ON f.version_id = a.current_version \
|
|
WHERE \
|
|
a.name = name.id
|
|
|
|
|
|
sql_query_info = SELECT a.* \
|
|
FROM \
|
|
translations name,\
|
|
addons a\
|
|
LEFT JOIN applications_versions av ON av.version_id = t.current_version \
|
|
WHERE \
|
|
a.name = name.id AND \
|
|
(name.autoid*100+IFNULL(av.application_id,0)) = $id
|
|
}
|
|
|
|
"""
|
|
|
|
config = config + """
|
|
index addons
|
|
{
|
|
source = addons
|
|
path = %s/addons
|
|
# morphology = stem_en
|
|
# symlink sphinx-wordforms.txt to this location:
|
|
wordforms = %s/wordforms.txt
|
|
|
|
# Firebug will get indexed as Firebug, Firebu, Fireb, Fire, Fir - equally
|
|
# We can enable star if necessary.
|
|
min_infix_len = 3
|
|
infix_fields = name
|
|
%s
|
|
}
|
|
""" % (CATALOG_PATH, ETC_PATH, CHARSET_DATA)
|
|
|
|
# Configuration for personas.
|
|
|
|
config = config + """
|
|
source personas
|
|
{
|
|
""" + MYSQL_SOURCE_CONFIG + """
|
|
sql_query = \
|
|
SELECT \
|
|
name.autoid AS id, \
|
|
a.id as addon_id, \
|
|
name.localized_string AS name, \
|
|
description.localized_string AS description, \
|
|
name.locale AS locale, \
|
|
CRC32(name.locale) AS locale_ord, \
|
|
UNIX_TIMESTAMP(a.created) AS created \
|
|
FROM \
|
|
( \
|
|
addons a, \
|
|
translations name \
|
|
) \
|
|
LEFT JOIN translations description \
|
|
ON a.description = description.id \
|
|
AND description.locale = name.locale \
|
|
WHERE \
|
|
a.name = name.id \
|
|
AND addontype_id = 9 \
|
|
AND ( \
|
|
name.locale IS NOT NULL \
|
|
OR name.localized_string IS NOT NULL \
|
|
OR description.locale IS NOT NULL \
|
|
OR description.localized_string IS NOT NULL \
|
|
)\
|
|
AND status IN (4, 8, 9) -- PUBLIC, LITE, LITE_AND_NOMINATED
|
|
|
|
sql_attr_uint = addon_id
|
|
sql_attr_uint = locale_ord
|
|
sql_attr_str2ordinal = locale
|
|
sql_attr_timestamp = created
|
|
}
|
|
|
|
"""
|
|
|
|
config = config + """
|
|
index personas
|
|
{
|
|
source = personas
|
|
path = %s/personas
|
|
morphology = stem_en
|
|
wordforms = %s/wordforms.txt
|
|
%s
|
|
}
|
|
""" % (CATALOG_PATH, ETC_PATH, CHARSET_DATA)
|
|
|
|
# Configuration for collections.
|
|
|
|
config = config + """
|
|
source collections
|
|
{
|
|
""" + MYSQL_SOURCE_CONFIG + """
|
|
sql_query = \
|
|
SELECT \
|
|
name.autoid AS id, \
|
|
c.id AS collection_id, \
|
|
name.localized_string AS name, \
|
|
description.localized_string AS description, \
|
|
name.locale AS locale, \
|
|
CRC32(name.locale) AS locale_ord, \
|
|
weekly_subscribers, \
|
|
monthly_subscribers, \
|
|
subscribers, \
|
|
rating, \
|
|
UNIX_TIMESTAMP(c.created) AS created \
|
|
FROM \
|
|
( \
|
|
collections c, \
|
|
translations name \
|
|
) \
|
|
LEFT JOIN translations description \
|
|
ON c.description = description.id \
|
|
AND description.locale = name.locale \
|
|
WHERE \
|
|
c.name = name.id \
|
|
AND ( \
|
|
name.locale IS NOT NULL \
|
|
OR name.localized_string IS NOT NULL \
|
|
OR description.locale IS NOT NULL \
|
|
OR description.localized_string IS NOT NULL \
|
|
) \
|
|
AND c.author_id IS NOT NULL \
|
|
AND c.uuid != '' \
|
|
AND c.listed = 1
|
|
sql_attr_uint = collection_id
|
|
sql_attr_uint = locale_ord
|
|
sql_attr_str2ordinal = locale
|
|
sql_attr_uint = weekly_subscribers
|
|
sql_attr_uint = monthly_subscribers
|
|
sql_attr_uint = subscribers
|
|
sql_attr_float = rating
|
|
sql_attr_timestamp = created
|
|
}
|
|
"""
|
|
|
|
config = config + """
|
|
index collections
|
|
{
|
|
source = collections
|
|
path = %s/collections
|
|
morphology = stem_en
|
|
wordforms = %s/wordforms.txt
|
|
%s
|
|
}
|
|
""" % (CATALOG_PATH, ETC_PATH, CHARSET_DATA)
|
|
|
|
|
|
config = config + """
|
|
searchd
|
|
{
|
|
listen = %d
|
|
listen = %s:%d:mysql41
|
|
log = %s/searchd.log
|
|
query_log = %s/query.log
|
|
pid_file = %s/searchd.pid
|
|
}
|
|
""" % ((LISTEN_PORT, MYSQL_LISTEN_HOST, MYSQL_LISTEN_PORT) + (LOG_PATH,)*3)
|
|
|
|
print config
|