diff --git a/.gitignore b/.gitignore index 32d1fca..bc10713 100644 --- a/.gitignore +++ b/.gitignore @@ -6,9 +6,11 @@ Thumbs.db db/REDIS/ db/SPHINX/ +db/sphinx/ config/ENV/* config/database.yml config/SPHINX.config +conifg/development.sphinx.conf binlog log/* diff --git a/Gemfile.lock b/Gemfile.lock index fd9777c..0da190e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -517,7 +517,7 @@ GEM redis (~> 3.0, >= 3.0.4) responders (2.1.0) railties (>= 4.2.0, < 5) - riddle (2.1.0) + riddle (2.4.0) role_block_haml (0.2.4) haml (~> 4.0) route_downcaser (1.1.4) @@ -674,4 +674,4 @@ DEPENDENCIES whenever BUNDLED WITH - 1.16.1 + 1.16.6 diff --git a/app/controllers/search_controller.rb b/app/controllers/search_controller.rb index d647751..4a590a7 100644 --- a/app/controllers/search_controller.rb +++ b/app/controllers/search_controller.rb @@ -1,10 +1,8 @@ +# frozen_string_literal: true + class SearchController < ApplicationController before_action :define_hub_ids - def pub_types - [ Recipe, Post, Blog, Page, Interview ] - end - def autocomplete @squery = params[:term].to_s.strip to_search = Riddle::Query.escape @squery @@ -12,7 +10,7 @@ def autocomplete res = ThinkingSphinx.search( to_search, star: true, - classes: pub_types, + classes: SearchService::PUBLICATION_TYPES, field_weights: { title: 10, content: 5 @@ -24,14 +22,10 @@ def autocomplete end def search - @squery = params[:squery].to_s.strip - to_search = Riddle::Query.escape @squery + search_service = SearchService.call(params[:squery], @hub_ids, params) - @pubs = if @hub_ids.blank? - ThinkingSphinx.search(to_search, star: true, classes: pub_types, sql: { include: :hub }).pagination(params) - else - ThinkingSphinx.search(to_search, star: true, classes: pub_types, sql: { include: :hub }, with: { hub_id: @hub_ids }).pagination(params) - end + @pubs = search_service.search_result + @multiple_keyboard_layouts = search_service.multiple_keyboard_layouts @search_results_size = @pubs.size @search_results_count = @pubs.count @@ -39,6 +33,12 @@ def search render layout: 'ok2/layouts/application', template: 'ok2/search/index' end + def multiple_keyboard_layouts? + @multiple_keyboard_layouts + end + + helper_method :multiple_keyboard_layouts? + private def define_hub_ids @@ -54,5 +54,4 @@ def define_hub_ids @hub_ids << post_hub.self_and_descendants.select(:id).map(&:id).uniq end end - end diff --git a/app/services/search_service.rb b/app/services/search_service.rb new file mode 100644 index 0000000..da55a1c --- /dev/null +++ b/app/services/search_service.rb @@ -0,0 +1,74 @@ +# frozen_string_literal: true + +module SearchService + PUBLICATION_TYPES = [ + Recipe, Post, Blog, Page, Interview + ].freeze + + LOWERCASE_DICTIONARY = { + 'q' => 'й', 'w' => 'ц', 'e' => 'у', 'r' => 'к', + 't' => 'е', 'y' => 'н', 'u' => 'г', 'i' => 'ш', + 'o' => 'щ', 'p' => 'з', 'a' => 'ф', 's' => 'ы', + 'd' => 'в', 'f' => 'а', 'g' => 'п', 'h' => 'р', + 'j' => 'о', 'k' => 'л', 'l' => 'д', ';' => 'ж', + "'" => 'э', 'z' => 'я', 'x' => 'ч', 'c' => 'с', + 'v' => 'м', 'b' => 'и', 'n' => 'т', 'm' => 'ь', + ',' => 'б', '.' => 'ю' + }.freeze + + UPPERCASE_DICTIONARY = { + 'Q' => 'Й', 'W' => 'Ц', 'E' => 'У', 'R' => 'К', + 'T' => 'Е', 'Y' => 'Н', 'U' => 'Г', 'I' => 'Ш', + 'O' => 'Щ', 'P' => 'З', 'A' => 'Ф', 'S' => 'Ы', + 'D' => 'В', 'F' => 'А', 'G' => 'П', 'H' => 'Р', + 'J' => 'О', 'K' => 'Л', 'L' => 'Д', ':' => 'Ж', + '"' => 'Э', 'Z' => 'Я', 'X' => 'Ч', 'С' => 'С', + 'V' => 'М', 'B' => 'И', 'N' => 'Т', 'M' => 'Ь', + '<' => 'Б', '>' => 'Ю' + }.freeze + + def call(query, hub_ids, params) + query = query.to_s.strip + riddle_query = Riddle::Query.escape(query) + + search_result = if hub_ids.blank? + ThinkingSphinx.search(riddle_query, star: true, classes: PUBLICATION_TYPES, sql: { include: :hub }).pagination(params) + else + ThinkingSphinx.search(riddle_query, star: true, classes: PUBLICATION_TYPES, sql: { include: :hub }, with: { hub_id: hub_ids }).pagination(params) + end + + if search_result.blank? + OpenStruct.new(search_result: search_by_multiple_keyboard_layouts(query, params), multiple_keyboard_layouts: true) + else + OpenStruct.new(search_result: search_result, multiple_keyboard_layouts: false) + end + end + + module_function :call + + def convert_to_another_keyboard_layout(query) + search_query = [] + + query.each_char do |char| + search_query.push(dictionary[char]) + end + + search_query.join + end + + module_function :convert_to_another_keyboard_layout + + private + + def search_by_multiple_keyboard_layouts(query, params) + ThinkingSphinx.search(Riddle::Query.escape(convert_to_another_keyboard_layout(query)), star: true, classes: PUBLICATION_TYPES, sql: { include: :hub }).pagination(params) + end + + module_function :search_by_multiple_keyboard_layouts + + def dictionary + LOWERCASE_DICTIONARY.merge(UPPERCASE_DICTIONARY) + end + + module_function :dictionary +end diff --git a/app/views/ok2/search/index.html.slim b/app/views/ok2/search/index.html.slim index 76fb6f9..96cf834 100644 --- a/app/views/ok2/search/index.html.slim +++ b/app/views/ok2/search/index.html.slim @@ -8,7 +8,10 @@ h1.tac.fs30.fwn.i.pt20.pb15.ffg(style='color:#024e9f') | Поиск: ' - = @squery + - if multiple_keyboard_layouts? && @pubs.present? + = SearchService.convert_to_another_keyboard_layout(params[:squery].to_s.strip) + - else + = params[:squery] -# MAIN CONTENT - if @pubs.blank? diff --git a/config/development.sphinx.conf b/config/development.sphinx.conf new file mode 100644 index 0000000..aab1539 --- /dev/null +++ b/config/development.sphinx.conf @@ -0,0 +1,184 @@ + +indexer +{ +} + +searchd +{ + listen = 127.0.0.1:9306:mysql41 + log = /home/dmitriy/Projects/ok-2018/log/development.searchd.log + query_log = /home/dmitriy/Projects/ok-2018/log/development.searchd.query.log + pid_file = /home/dmitriy/Projects/ok-2018/log/development.sphinx.pid + workers = threads + binlog_path = /home/dmitriy/Projects/ok-2018/tmp/binlog/development +} + +source blog_core_0 +{ + type = pgsql + sql_host = localhost + sql_user = dmitriy + sql_pass = + sql_db = open_cook_dev + sql_query_pre = SET TIME ZONE UTC + sql_query = SELECT "blogs"."id" * 10 + 0 AS "id", "blogs"."title" AS "title", "blogs"."intro" AS "intro", "blogs"."content" AS "content", "blogs"."id" AS "sphinx_internal_id", 'Blog' AS "sphinx_internal_class", 0 AS "sphinx_deleted", "blogs"."user_id" AS "user_id", "blogs"."hub_id" AS "hub_id", extract(epoch from "blogs"."published_at")::int AS "published_at", extract(epoch from "blogs"."created_at")::int AS "created_at", extract(epoch from "blogs"."updated_at")::int AS "updated_at" FROM "blogs" WHERE ("blogs"."id" BETWEEN $start AND $end AND state = 'published') GROUP BY "blogs"."id", "blogs"."title", "blogs"."intro", "blogs"."content", "blogs"."id", "blogs"."user_id", "blogs"."hub_id", "blogs"."published_at", "blogs"."created_at", "blogs"."updated_at" + sql_query_range = SELECT COALESCE(MIN("blogs"."id"), 1), COALESCE(MAX("blogs"."id"), 1) FROM "blogs" + sql_attr_uint = sphinx_internal_id + sql_attr_uint = sphinx_deleted + sql_attr_uint = user_id + sql_attr_uint = hub_id + sql_attr_timestamp = published_at + sql_attr_timestamp = created_at + sql_attr_timestamp = updated_at + sql_attr_string = sphinx_internal_class +} + +index blog_core +{ + type = plain + path = /home/dmitriy/Projects/ok-2018/db/sphinx/development/blog_core + docinfo = extern + source = blog_core_0 +} + +source interview_core_0 +{ + type = pgsql + sql_host = localhost + sql_user = dmitriy + sql_pass = + sql_db = open_cook_dev + sql_query_pre = SET TIME ZONE UTC + sql_query = SELECT "interviews"."id" * 10 + 1 AS "id", "interviews"."title" AS "title", "interviews"."intro" AS "intro", "interviews"."content" AS "content", "interviews"."id" AS "sphinx_internal_id", 'Interview' AS "sphinx_internal_class", 0 AS "sphinx_deleted", "interviews"."user_id" AS "user_id", "interviews"."hub_id" AS "hub_id", extract(epoch from "interviews"."published_at")::int AS "published_at", extract(epoch from "interviews"."created_at")::int AS "created_at", extract(epoch from "interviews"."updated_at")::int AS "updated_at" FROM "interviews" WHERE ("interviews"."id" BETWEEN $start AND $end AND state = 'published') GROUP BY "interviews"."id", "interviews"."title", "interviews"."intro", "interviews"."content", "interviews"."id", "interviews"."user_id", "interviews"."hub_id", "interviews"."published_at", "interviews"."created_at", "interviews"."updated_at" + sql_query_range = SELECT COALESCE(MIN("interviews"."id"), 1), COALESCE(MAX("interviews"."id"), 1) FROM "interviews" + sql_attr_uint = sphinx_internal_id + sql_attr_uint = sphinx_deleted + sql_attr_uint = user_id + sql_attr_uint = hub_id + sql_attr_timestamp = published_at + sql_attr_timestamp = created_at + sql_attr_timestamp = updated_at + sql_attr_string = sphinx_internal_class +} + +index interview_core +{ + type = plain + path = /home/dmitriy/Projects/ok-2018/db/sphinx/development/interview_core + docinfo = extern + source = interview_core_0 +} + +source page_core_0 +{ + type = pgsql + sql_host = localhost + sql_user = dmitriy + sql_pass = + sql_db = open_cook_dev + sql_query_pre = SET TIME ZONE UTC + sql_query = SELECT "pages"."id" * 10 + 2 AS "id", "pages"."title" AS "title", "pages"."intro" AS "intro", "pages"."content" AS "content", "pages"."id" AS "sphinx_internal_id", 'Page' AS "sphinx_internal_class", 0 AS "sphinx_deleted", "pages"."user_id" AS "user_id", "pages"."hub_id" AS "hub_id", extract(epoch from "pages"."published_at")::int AS "published_at", extract(epoch from "pages"."created_at")::int AS "created_at", extract(epoch from "pages"."updated_at")::int AS "updated_at" FROM "pages" WHERE ("pages"."id" BETWEEN $start AND $end AND state = 'published') GROUP BY "pages"."id", "pages"."title", "pages"."intro", "pages"."content", "pages"."id", "pages"."user_id", "pages"."hub_id", "pages"."published_at", "pages"."created_at", "pages"."updated_at" + sql_query_range = SELECT COALESCE(MIN("pages"."id"), 1), COALESCE(MAX("pages"."id"), 1) FROM "pages" + sql_attr_uint = sphinx_internal_id + sql_attr_uint = sphinx_deleted + sql_attr_uint = user_id + sql_attr_uint = hub_id + sql_attr_timestamp = published_at + sql_attr_timestamp = created_at + sql_attr_timestamp = updated_at + sql_attr_string = sphinx_internal_class +} + +index page_core +{ + type = plain + path = /home/dmitriy/Projects/ok-2018/db/sphinx/development/page_core + docinfo = extern + source = page_core_0 +} + +source post_core_0 +{ + type = pgsql + sql_host = localhost + sql_user = dmitriy + sql_pass = + sql_db = open_cook_dev + sql_query_pre = SET TIME ZONE UTC + sql_query = SELECT "posts"."id" * 10 + 3 AS "id", "posts"."title" AS "title", "posts"."intro" AS "intro", "posts"."content" AS "content", "posts"."id" AS "sphinx_internal_id", 'Post' AS "sphinx_internal_class", 0 AS "sphinx_deleted", "posts"."user_id" AS "user_id", "posts"."hub_id" AS "hub_id", extract(epoch from "posts"."published_at")::int AS "published_at", extract(epoch from "posts"."created_at")::int AS "created_at", extract(epoch from "posts"."updated_at")::int AS "updated_at" FROM "posts" WHERE ("posts"."id" BETWEEN $start AND $end AND state = 'published') GROUP BY "posts"."id", "posts"."title", "posts"."intro", "posts"."content", "posts"."id", "posts"."user_id", "posts"."hub_id", "posts"."published_at", "posts"."created_at", "posts"."updated_at" + sql_query_range = SELECT COALESCE(MIN("posts"."id"), 1), COALESCE(MAX("posts"."id"), 1) FROM "posts" + sql_attr_uint = sphinx_internal_id + sql_attr_uint = sphinx_deleted + sql_attr_uint = user_id + sql_attr_uint = hub_id + sql_attr_timestamp = published_at + sql_attr_timestamp = created_at + sql_attr_timestamp = updated_at + sql_attr_string = sphinx_internal_class +} + +index post_core +{ + type = plain + path = /home/dmitriy/Projects/ok-2018/db/sphinx/development/post_core + docinfo = extern + source = post_core_0 +} + +source recipe_core_0 +{ + type = pgsql + sql_host = localhost + sql_user = dmitriy + sql_pass = + sql_db = open_cook_dev + sql_query_pre = SET TIME ZONE UTC + sql_query = SELECT "recipes"."id" * 10 + 4 AS "id", "recipes"."title" AS "title", "recipes"."intro" AS "intro", "recipes"."content" AS "content", "recipes"."id" AS "sphinx_internal_id", 'Recipe' AS "sphinx_internal_class", 0 AS "sphinx_deleted", "recipes"."user_id" AS "user_id", "recipes"."hub_id" AS "hub_id", extract(epoch from "recipes"."published_at")::int AS "published_at", extract(epoch from "recipes"."created_at")::int AS "created_at", extract(epoch from "recipes"."updated_at")::int AS "updated_at" FROM "recipes" WHERE ("recipes"."id" BETWEEN $start AND $end AND state = 'published') GROUP BY "recipes"."id", "recipes"."title", "recipes"."intro", "recipes"."content", "recipes"."id", "recipes"."user_id", "recipes"."hub_id", "recipes"."published_at", "recipes"."created_at", "recipes"."updated_at" + sql_query_range = SELECT COALESCE(MIN("recipes"."id"), 1), COALESCE(MAX("recipes"."id"), 1) FROM "recipes" + sql_attr_uint = sphinx_internal_id + sql_attr_uint = sphinx_deleted + sql_attr_uint = user_id + sql_attr_uint = hub_id + sql_attr_timestamp = published_at + sql_attr_timestamp = created_at + sql_attr_timestamp = updated_at + sql_attr_string = sphinx_internal_class +} + +index recipe_core +{ + type = plain + path = /home/dmitriy/Projects/ok-2018/db/sphinx/development/recipe_core + docinfo = extern + source = recipe_core_0 +} + +index blog +{ + type = distributed + local = blog_core +} + +index interview +{ + type = distributed + local = interview_core +} + +index page +{ + type = distributed + local = page_core +} + +index post +{ + type = distributed + local = post_core +} + +index recipe +{ + type = distributed + local = recipe_core +} diff --git a/db/sphinx/development/blog_core.spa b/db/sphinx/development/blog_core.spa new file mode 100644 index 0000000..642dac3 Binary files /dev/null and b/db/sphinx/development/blog_core.spa differ diff --git a/db/sphinx/development/blog_core.spd b/db/sphinx/development/blog_core.spd new file mode 100644 index 0000000..89adc29 Binary files /dev/null and b/db/sphinx/development/blog_core.spd differ diff --git a/db/sphinx/development/blog_core.spe b/db/sphinx/development/blog_core.spe new file mode 100644 index 0000000..6b2aaa7 --- /dev/null +++ b/db/sphinx/development/blog_core.spe @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/db/sphinx/development/blog_core.sph b/db/sphinx/development/blog_core.sph new file mode 100644 index 0000000..31fd8dc Binary files /dev/null and b/db/sphinx/development/blog_core.sph differ diff --git a/db/sphinx/development/blog_core.spi b/db/sphinx/development/blog_core.spi new file mode 100644 index 0000000..f8f1b2a Binary files /dev/null and b/db/sphinx/development/blog_core.spi differ diff --git a/db/sphinx/development/blog_core.spk b/db/sphinx/development/blog_core.spk new file mode 100644 index 0000000..e69de29 diff --git a/db/sphinx/development/blog_core.spl b/db/sphinx/development/blog_core.spl new file mode 100644 index 0000000..e69de29 diff --git a/db/sphinx/development/blog_core.spm b/db/sphinx/development/blog_core.spm new file mode 100644 index 0000000..e69de29 diff --git a/db/sphinx/development/blog_core.spp b/db/sphinx/development/blog_core.spp new file mode 100644 index 0000000..88ec60f Binary files /dev/null and b/db/sphinx/development/blog_core.spp differ diff --git a/db/sphinx/development/blog_core.sps b/db/sphinx/development/blog_core.sps new file mode 100644 index 0000000..4eec53e Binary files /dev/null and b/db/sphinx/development/blog_core.sps differ diff --git a/db/sphinx/development/interview_core.spa b/db/sphinx/development/interview_core.spa new file mode 100644 index 0000000..5d3e329 Binary files /dev/null and b/db/sphinx/development/interview_core.spa differ diff --git a/db/sphinx/development/interview_core.spd b/db/sphinx/development/interview_core.spd new file mode 100644 index 0000000..74cea10 Binary files /dev/null and b/db/sphinx/development/interview_core.spd differ diff --git a/db/sphinx/development/interview_core.spe b/db/sphinx/development/interview_core.spe new file mode 100644 index 0000000..6b2aaa7 --- /dev/null +++ b/db/sphinx/development/interview_core.spe @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/db/sphinx/development/interview_core.sph b/db/sphinx/development/interview_core.sph new file mode 100644 index 0000000..3d59d76 Binary files /dev/null and b/db/sphinx/development/interview_core.sph differ diff --git a/db/sphinx/development/interview_core.spi b/db/sphinx/development/interview_core.spi new file mode 100644 index 0000000..7f563ce Binary files /dev/null and b/db/sphinx/development/interview_core.spi differ diff --git a/db/sphinx/development/interview_core.spk b/db/sphinx/development/interview_core.spk new file mode 100644 index 0000000..e69de29 diff --git a/db/sphinx/development/interview_core.spl b/db/sphinx/development/interview_core.spl new file mode 100644 index 0000000..e69de29 diff --git a/db/sphinx/development/interview_core.spm b/db/sphinx/development/interview_core.spm new file mode 100644 index 0000000..e69de29 diff --git a/db/sphinx/development/interview_core.spp b/db/sphinx/development/interview_core.spp new file mode 100644 index 0000000..5da817b Binary files /dev/null and b/db/sphinx/development/interview_core.spp differ diff --git a/db/sphinx/development/interview_core.sps b/db/sphinx/development/interview_core.sps new file mode 100644 index 0000000..945ef02 Binary files /dev/null and b/db/sphinx/development/interview_core.sps differ diff --git a/db/sphinx/development/page_core.spa b/db/sphinx/development/page_core.spa new file mode 100644 index 0000000..d7b3384 Binary files /dev/null and b/db/sphinx/development/page_core.spa differ diff --git a/db/sphinx/development/page_core.spd b/db/sphinx/development/page_core.spd new file mode 100644 index 0000000..e287df5 Binary files /dev/null and b/db/sphinx/development/page_core.spd differ diff --git a/db/sphinx/development/page_core.spe b/db/sphinx/development/page_core.spe new file mode 100644 index 0000000..6b2aaa7 --- /dev/null +++ b/db/sphinx/development/page_core.spe @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/db/sphinx/development/page_core.sph b/db/sphinx/development/page_core.sph new file mode 100644 index 0000000..cbcfa63 Binary files /dev/null and b/db/sphinx/development/page_core.sph differ diff --git a/db/sphinx/development/page_core.spi b/db/sphinx/development/page_core.spi new file mode 100644 index 0000000..a493954 Binary files /dev/null and b/db/sphinx/development/page_core.spi differ diff --git a/db/sphinx/development/page_core.spk b/db/sphinx/development/page_core.spk new file mode 100644 index 0000000..e69de29 diff --git a/db/sphinx/development/page_core.spl b/db/sphinx/development/page_core.spl new file mode 100644 index 0000000..e69de29 diff --git a/db/sphinx/development/page_core.spm b/db/sphinx/development/page_core.spm new file mode 100644 index 0000000..e69de29 diff --git a/db/sphinx/development/page_core.spp b/db/sphinx/development/page_core.spp new file mode 100644 index 0000000..0ca63c0 Binary files /dev/null and b/db/sphinx/development/page_core.spp differ diff --git a/db/sphinx/development/page_core.sps b/db/sphinx/development/page_core.sps new file mode 100644 index 0000000..8a7cc58 Binary files /dev/null and b/db/sphinx/development/page_core.sps differ diff --git a/db/sphinx/development/post_core.spa b/db/sphinx/development/post_core.spa new file mode 100644 index 0000000..a6f68b9 Binary files /dev/null and b/db/sphinx/development/post_core.spa differ diff --git a/db/sphinx/development/post_core.spd b/db/sphinx/development/post_core.spd new file mode 100644 index 0000000..c5d2375 Binary files /dev/null and b/db/sphinx/development/post_core.spd differ diff --git a/db/sphinx/development/post_core.spe b/db/sphinx/development/post_core.spe new file mode 100644 index 0000000..6b2aaa7 --- /dev/null +++ b/db/sphinx/development/post_core.spe @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/db/sphinx/development/post_core.sph b/db/sphinx/development/post_core.sph new file mode 100644 index 0000000..947e0b5 Binary files /dev/null and b/db/sphinx/development/post_core.sph differ diff --git a/db/sphinx/development/post_core.spi b/db/sphinx/development/post_core.spi new file mode 100644 index 0000000..8653ad2 Binary files /dev/null and b/db/sphinx/development/post_core.spi differ diff --git a/db/sphinx/development/post_core.spk b/db/sphinx/development/post_core.spk new file mode 100644 index 0000000..e69de29 diff --git a/db/sphinx/development/post_core.spl b/db/sphinx/development/post_core.spl new file mode 100644 index 0000000..e69de29 diff --git a/db/sphinx/development/post_core.spm b/db/sphinx/development/post_core.spm new file mode 100644 index 0000000..e69de29 diff --git a/db/sphinx/development/post_core.spp b/db/sphinx/development/post_core.spp new file mode 100644 index 0000000..c0f863b Binary files /dev/null and b/db/sphinx/development/post_core.spp differ diff --git a/db/sphinx/development/post_core.sps b/db/sphinx/development/post_core.sps new file mode 100644 index 0000000..63d7e3a Binary files /dev/null and b/db/sphinx/development/post_core.sps differ diff --git a/db/sphinx/development/recipe_core.spa b/db/sphinx/development/recipe_core.spa new file mode 100644 index 0000000..40796e3 Binary files /dev/null and b/db/sphinx/development/recipe_core.spa differ diff --git a/db/sphinx/development/recipe_core.spd b/db/sphinx/development/recipe_core.spd new file mode 100644 index 0000000..f09af14 Binary files /dev/null and b/db/sphinx/development/recipe_core.spd differ diff --git a/db/sphinx/development/recipe_core.spe b/db/sphinx/development/recipe_core.spe new file mode 100644 index 0000000..caf0dbb Binary files /dev/null and b/db/sphinx/development/recipe_core.spe differ diff --git a/db/sphinx/development/recipe_core.sph b/db/sphinx/development/recipe_core.sph new file mode 100644 index 0000000..e6aa91c Binary files /dev/null and b/db/sphinx/development/recipe_core.sph differ diff --git a/db/sphinx/development/recipe_core.spi b/db/sphinx/development/recipe_core.spi new file mode 100644 index 0000000..ef98611 Binary files /dev/null and b/db/sphinx/development/recipe_core.spi differ diff --git a/db/sphinx/development/recipe_core.spk b/db/sphinx/development/recipe_core.spk new file mode 100644 index 0000000..e69de29 diff --git a/db/sphinx/development/recipe_core.spl b/db/sphinx/development/recipe_core.spl new file mode 100644 index 0000000..e69de29 diff --git a/db/sphinx/development/recipe_core.spm b/db/sphinx/development/recipe_core.spm new file mode 100644 index 0000000..e69de29 diff --git a/db/sphinx/development/recipe_core.spp b/db/sphinx/development/recipe_core.spp new file mode 100644 index 0000000..acbabf5 Binary files /dev/null and b/db/sphinx/development/recipe_core.spp differ diff --git a/db/sphinx/development/recipe_core.sps b/db/sphinx/development/recipe_core.sps new file mode 100644 index 0000000..abc2b83 Binary files /dev/null and b/db/sphinx/development/recipe_core.sps differ