-
Notifications
You must be signed in to change notification settings - Fork 10
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
10 changed files
with
284 additions
and
54 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
102 changes: 100 additions & 2 deletions
102
lib/sphinx/integration/extensions/thinking_sphinx/index/builder.rb
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,13 +1,111 @@ | ||
# coding: utf-8 | ||
module Sphinx::Integration::Extensions::ThinkingSphinx::Index::Builder | ||
|
||
def group_by!(*args) | ||
source.groupings = args | ||
autoload :Join, 'sphinx/integration/extensions/thinking_sphinx/index/builder/join' | ||
|
||
# Отменяет группировку по-умолчанию | ||
# | ||
# fields - String поля, по которым будем группировать | ||
def force_group_by(*fields) | ||
raise ArgumentError unless fields.any? | ||
source.groupings = fields | ||
set_property :force_group_by => true | ||
end | ||
alias_method :group_by!, :force_group_by | ||
|
||
# Задаёт лимит для выборки | ||
# | ||
# value - Integer | ||
def limit(value) | ||
set_property :sql_query_limit => value | ||
end | ||
|
||
# Блок, который будет вызывается при сохранении модели | ||
# | ||
# name - Symbol MVA attr name | ||
# block - должен возвращать массив для MVA атрибута | ||
# Yields Instance of ActiveRecord::Base | ||
def mva_attribute(name, &block) | ||
@index.mva_sources ||= {} | ||
@index.mva_sources[name] = block | ||
end | ||
|
||
# Формирует CTE (WITH _alias AS (SELECT ...)) | ||
# | ||
# name - String | ||
def with(name) | ||
raise ArgumentError unless block_given? | ||
@index.local_options[:source_cte] ||= {} | ||
@index.local_options[:source_cte][name] = yield | ||
end | ||
|
||
# Формирует LEFT JOIN | ||
# | ||
# name - Symbol or Hash | ||
# если Symbol, то это название таблицы | ||
# если Hash, то это {:table_name => :alias} | ||
# | ||
# Returns Sphinx::Integration::Extensions::ThinkingSphinx::Index::Builder::Join | ||
def left_join(name) | ||
Join.new(@index, name).type(:left) | ||
end | ||
|
||
# Формирует INNER JOIN | ||
# | ||
# name - Symbol or Hash | ||
# если Symbol, то это название таблицы | ||
# если Hash, то это {:table_name => :alias} | ||
# | ||
# Returns Sphinx::Integration::Extensions::ThinkingSphinx::Index::Builder::Join | ||
def inner_join(name) | ||
Join.new(@index, name).type(:inner) | ||
end | ||
|
||
# Заменяет дефолтное название таблицы | ||
# | ||
# value - String | ||
def from(value) | ||
set_property :source_table => value | ||
end | ||
|
||
# Наполнение индекса из другой базы | ||
# | ||
# value - Boolean or String | ||
def slave(value) | ||
set_property :use_slave_db => value | ||
end | ||
|
||
# Отключение группировки GROUP BY, которая делается по-умолчанию | ||
# | ||
# value - Boolean (default: true) | ||
def no_grouping(value = true) | ||
set_property :source_no_grouping => value | ||
end | ||
|
||
# Отключение индексации пачками | ||
# | ||
# value - Boolean (default: true) | ||
def disable_range(value = true) | ||
set_property :disable_range => value | ||
end | ||
|
||
# Указание своих минимального и максимального предела индексации | ||
# | ||
# value - String | ||
# | ||
# Examples | ||
# | ||
# query_range("SELECT 1::int, COALESCE(MAX(id), 1::int) FROM rubrics") | ||
# | ||
def query_range(value) | ||
set_property :sql_query_range => value | ||
end | ||
|
||
# Отключение подстановок в WHERE $start >= ? and $end <= ? | ||
# | ||
# value - Boolean (default: true) | ||
def use_own_sql_query_range(value = true) | ||
set_property :use_own_sql_query_range => value | ||
end | ||
|
||
end |
70 changes: 70 additions & 0 deletions
70
lib/sphinx/integration/extensions/thinking_sphinx/index/builder/join.rb
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,70 @@ | ||
# coding: utf-8 | ||
module Sphinx::Integration::Extensions::ThinkingSphinx::Index::Builder | ||
class Join | ||
|
||
attr_accessor :index, :key | ||
|
||
# Создание =) | ||
# | ||
# index - ThinkingSphinx::Index | ||
# name - String or Hash{:table_name => :table_alias} | ||
def initialize(index, name) | ||
self.index = index | ||
|
||
if name.is_a?(Hash) | ||
table_name, table_alias = name.first | ||
else | ||
table_name, table_alias = name | ||
end | ||
|
||
self.key = table_name | ||
|
||
index.local_options[:source_joins] ||= {} | ||
index.local_options[:source_joins][key] = {} | ||
as(table_alias) | ||
|
||
self | ||
end | ||
|
||
# Алиас для таблицы | ||
# | ||
# value - String or Symbol | ||
# | ||
# Returns self | ||
def as(value) | ||
index.local_options[:source_joins][key][:as] = value | ||
self | ||
end | ||
|
||
# Тип связи | ||
# | ||
# value - String or Symbol | ||
# | ||
# Returns self | ||
def type(value) | ||
index.local_options[:source_joins][key][:type] = value | ||
self | ||
end | ||
|
||
# По каким поля джойним | ||
# | ||
# value - String | ||
# | ||
# Returns self | ||
def on(value) | ||
index.local_options[:source_joins][key][:on] = value | ||
self | ||
end | ||
|
||
# Вместо таблички можно указать sql подзапрос | ||
# | ||
# value - String | ||
# | ||
# Returns self | ||
def query(value) | ||
index.local_options[:source_joins][key][:query] = value | ||
self | ||
end | ||
|
||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.