2016-05-13: 3.2.0
* [FIX] Ensure SQL table aliases are reliable for SQL-backed index queries.
* [FEATURE] Add JSON attribute support for real-time indices.
* [FEATURE] Add ability to disable *all* Sphinx-related callbacks via ThinkingSphinx::Callbacks.suspend! and ThinkingSphinx::Callbacks.resume!. Particularly useful for unit tests.
* [FEATURE] Add native OutOfBoundsError for search queries outside the pagination bounds.
* [CHANGE] Improved error messages for duplicate property names and missing columns.
* [FIX] Fixed mysql2 compatibility for memory references (Roman Usherenko).
* [FIX] Fixed JRuby compatibility with camelCase method names (Brandon Dewitt).
* [FEATURE] Support MySQL SSL options on a per-index level (@arrtchiu).
* [CHANGE] Don't populate search results when requesting just the count values (Andrew Roth).
* [CHANGE] Reset delta column before core indexing begins (reverting behaviour introduced in 3.1.0). See issue #958 for further discussion.
* [FEATURE] Allow for different indexing strategies (e.g. all at once, or one by one).
* [FIX] Fix stale id handling for multiple search contexts (Jonathan del Strother).
* [CHANGE] Use Sphinx's bulk insert ability (Chance Downs).
* [CHANGE] Reduce memory/object usage for model references (Jonathan del Strother).
* [CHANGE] Disable deletion callbacks when real-time indices are in place and all other real-time callbacks are disabled.
* [FIX] Handle quoting of namespaced tables (Roman Usherenko).
* [FIX] Make preload_indices thread-safe.
* [FIX] Improved handling of marshalled/demarshalled search results.
* [FEATURE] Allow rand_seed as a select option (Mattia Gheda).
* [FEATURE] Add primary_key option for index definitions (Nathaneal Gray).
* [FEATURE] Add ability to start searchd in the foreground (Andrey Novikov).
* [CHANGE] Only use ERB to parse the YAML file if ERB is loaded.

2015-06-01: 3.1.4
* [FIX] Kaminari expects prev_page to be available.
* [CHANGE] Add a contributor code of conduct.
* [FEATURE] Add JSON as a Sphinx type for attributes (Daniel Vandersluis).
* [CHANGE] Remove polymorphic association and HABTM query support (when related to Thinking Sphinx) when ActiveRecord 3.2 is involved.
* [FIX] Don't try to delete guard files if they don't exist (@exAspArk).
* [FEATURE] minimal_group_by? can now be set in config/thinking_sphinx.yml to automatically apply to all index definitions.
* [FIX] Handle database settings reliably, now that ActiveRecord 4.2 uses strings all the time.
* [FIX] More consistent with escaping table names.
* [CHANGE] Remove default charset_type - no longer required for Sphinx 2.2.
* [FIX] Bug fix for association creation (with polymophic fields/attributes).
* [CHANGE] Removing sql_query_info setting, as it's no longer used by Sphinx (nor is it actually used by Thinking Sphinx).

2015-01-21: 3.1.3
* [CHANGE] Log excerpt SphinxQL queries just like the search queries.
* [CHANGE] Load Railtie if Rails::Railtie is defined, instead of just Rails (Andrew Cone).
* [CHANGE] Convert raw Sphinx results to an array when querying (Bryan Ricker).
* [FIX] Generate de-polymorphised associations properly for Rails 4.2
* [FIX] Use reflect_on_association instead of reflections, to stick to the public ActiveRecord::Base API.
* [FIX] Don't load ActiveRecord early - fixes a warning in Rails 4.2.
* [FEATURE] Allow for custom offset references with the :offset_as option - thus one model across many schemas with Apartment can be treated differently.
* [FEATURE] Allow for custom IndexSet classes.
* [FIX] Don't double-up on STI filtering, already handled by Rails.
* [CHANGE] Add bigint support for real-time indices, and use bigints for the sphinx_internal_id attribute (mapped to model primary keys) (Chance Downs).

2014-11-04: 3.1.2
* [CHANGE] regenerate task now only deletes index files for real-time indices.
* [CHANGE] Raise an exception when a populated search query is modified (as it can't be requeried).
* [FEATURE] Allow for custom paths for index files using :path option in the ThinkingSphinx::Index.define call.
* [FIX] Ensure indexing guard files are removed when an exception is raised (Bobby Uhlenbrock).
* [FIX] Don't update real-time indices for objects that are not persisted (Chance Downs).
* [FEATURE] Allow the binlog path to be an empty string (Bobby Uhlenbrock).
* [FIX] Use STI base class for polymorphic association replacements.
* [FIX] Convert database setting keys to symbols for consistency with Rails (@dimko).
* [FIX] Field weights and other search options are now respected from set_property.
* [CHANGE] Log indices that aren't processed due to guard files existing.
* [FEATURE] Add status task to report on whether Sphinx is running.
* [FIX] Models with more than one index have correct facet counts (using Sphinx 2.1.x or newer).
* [FEATURE] Real-time index callbacks can take a block for dynamic scoping.
* [FIX] Some association fixes for Rails 4.1.
* [CHANGE] Paginate records by 1000 results at a time when flagging as deleted.
* [CHANGE] Default the Capistrano TS Rails environment to use rails_env, and then fall back to stage.
* [CHANGE] rebuild task uses clear between stopping the daemon and indexing.
* [FIX] Clear connections when raising connection errors.
* [FEATURE] Allow casting of document ids pre-offset as bigints (via big_documents_id option).

2014-04-22: 3.1.1
* [CHANGE] Include full statements when query execution errors are raised (uglier, but more useful when debugging).
* [FEATURE] Allow for common section in generated Sphinx configuration files for Sphinx 2.2.x (disabled by default, though) (Trevor Smith).
* [FEATURE] Basic support for HABTM associations and MVAs with query/ranged-query sources.
* [CHANGE] Connection error messages now mention Sphinx, instead of just MySQL.
* [FIX] Don't apply attribute-only updates to real-time indices.
* [FIX] Don't instantiate blank strings (via inheritance type columns) as constants.
* [FIX] Don't presume all indices for a model have delta pairs, even if one does.
* [CHANGE] Raise an exception when a referenced column does not exist.
* [CHANGE] Capistrano tasks use thinking_sphinx_rails_env (defaults to standard environment) (Robert Coleman).
* [FIX] Always use connection options for connection information.
* [FIX] respond_to? works reliably with masks (Konstantin Burnaev).
* [FEATURE] Real-time indices callbacks can be disabled (useful for unit tests).
* [FEATURE] ThinkingSphinx::Test has a clear method and no-index option for starting for real-time setups.
* [FIX] Avoid null values in MVA query/ranged-query sources.
* [CHANGE] Alias group and count columns for easier referencing in other clauses.
* [FEATURE] Allow disabling of distributed indices.
* [FIX] Don't send unicode null characters to real-time Sphinx indices.
* [FIX] :populate option is now respected for single-model searches.
* [FIX] :thinking_sphinx_roles is now used consistently in Capistrano v3 tasks.
* [CHANGE] Log real-time index updates (Demian Ferreiro).
* [FIX] Only expand log directory if it exists.
* [FIX] Handle JDBC connection errors appropriately (Adam Hutchison).
* [FIX] Fixing wildcarding of Unicode strings.
* [CHANGE] All indices now respond to a public attributes method.
* [FIX] Improved handling of association searches with real-time indices, including via has_many :though associations (Rob Anderton).

2014-01-11: 3.1.0
* [CHANGE] Updating Riddle requirement to >= 1.5.10.
* [CHANGE] Extracting join generation into its own gem: Joiner.
* [FEATURE] Support for Capistrano v3 (Alexander Tipugin).
* [FEATURE] JRuby support (with Sphinx 2.1 or newer).
* [CHANGE] Geodist calculation is now prepended to the SELECT statement, so it can be referred to by other dynamic attributes.
* [FIX] Indices will be detected in Rails engines upon configuration.
* [FEATURE] Support for Sphinx 2.2.x's HAVING and GROUP N BY SphinxQL options.
* [FEATURE] Adding max_predicted_time search option (Sphinx 2.2.x).
* [FEATURE] Wildcard/starring can be applied directly to strings using ThinkingSphinx::Query.wildcard('pancakes'), and escaping via ThinkingSphinx::Query.escape('pancakes').
* [CHANGE] Auto-wildcard/starring (via :star => true) now treats escaped characters as word separators.
* [FEATURE] Capistrano recipe now includes tasks for realtime indices.
* [CHANGE] Capistrano recipe no longer automatically adds thinking_sphinx:index and thinking_sphinx:start to be run after deploy:cold.
* [CHANGE] UTF-8 forced encoding is now disabled by default (in line with Sphinx 2.1.x).
* [CHANGE] Sphinx functions are now the default, instead of the legacy special variables (in line with Sphinx 2.1.x).
* [CHANGE] Rails 3.1 is no longer supported.
* [CHANGE] MRI 1.9.2 is no longer supported.
* [FIX] Destroy callbacks are ignored for non-persisted objects.
* [FEATURE] :group option within :sql options in a search call is passed through to the underlying ActiveRecord relation (Siarhei Hanchuk).
* [FIX] Blank STI values are converted to the parent class in Sphinx index data (Jonathan Greenberg).
* [CHANGE] Insist on at least * for SphinxQL SELECT statements.
* [FIX] Track indices on parent STI models when marking documents as deleted.
* [FEATURE] Persistent connections can be disabled if you wish.
* [FIX] Separate per_page/max_matches values are respected in facet searches (Timo Virkkala).
* [FIX] Don't split function calls when casting timestamps (Timo Virkalla).
* [FEATURE] Track what's being indexed, and don't double-up while indexing is running. Single indices (e.g. deltas) can be processed while a full index is happening, though.
* [FEATURE] Pass through :delta_options to delta processors (Timo Virkalla).
* [FEATURE] All delta records can have their core pairs marked as deleted after a suspended delta (use ThinkingSphinx::Deltas.suspend_and_update instead of ThinkingSphinx::Deltas.suspend).
* [CHANGE] Reset the delta column to true after core indexing is completed, instead of before, and don't filter out delta records from the core source.
* [FEATURE] Set custom database settings within the index definition, using the set_database method. A more sane approach with multiple databases.
* [CHANGE] Provide a distributed index per model that covers both core and delta indices.

2013-10-20: 3.0.6
* [FEATURE] Raise an error if no indices match the search criteria (Bryan Ricker).
* [FEATURE] skip_time_zone setting is now available per environment via config/thinking_sphinx.yml to avoid the sql_query_pre time zone command.
* [CHANGE] Updating Riddle dependency to be >= 1.5.9.
* [FEATURE] Added new search options in Sphinx 2.1.x.
* [FEATURE] Added ability to disable UTF-8 forced encoding, now that Sphinx 2.1.2 returns UTF-8 strings by default. This will be disabled by default in Thinking Sphinx 3.1.0.
* [FEATURE] Added ability to switch between Sphinx special variables and the equivalent functions. Sphinx 2.1.x requires the latter, and that behaviour will become the default in Sphinx 3.1.0.
* [FIX] Cast every column to a timestamp for timestamp attributes with multiple columns.
* [CHANGE] Separated directory preparation from data generation for real-time index (re)generation tasks.
* [CHANGE] Have tests index UTF-8 characters where appropriate (Pedro Cunha).
* [FIX] Don't use Sphinx ordering if SQL order option is supplied to a search.
* [CHANGE] Always use DISTINCT in group concatenation.
* [CHANGE] Sphinx connection failures now have their own class, ThinkingSphinx::ConnectionError, instead of the standard Mysql2::Error.
* [FIX] Custom middleware and mask options now function correctly with model-scoped searches.
* [FEATURE] Adding search_for_ids on scoped search calls.
* [CHANGE] Don't clobber custom :select options for facet searches (Timo Virkkala).
* [CHANGE] Automatically load Riddle's Sphinx 2.0.5 compatability changes.
* [FIX] Suspended deltas now no longer update core indices as well.
* [CHANGE] Realtime fields and attributes now accept symbols as well as column objects, and fields can be sortable (with a _sort prefix for the matching attribute).
* [FEATURE] MySQL users can enable a minimal GROUP BY statement, to speed up queries: set_property :minimal_group_by? => true.
* [CHANGE] Insist on the log directory existing, to ensure correct behaviour for symlinked paths. (Michael Pearson).
* [FIX] Use alphabetical ordering for index paths consistently (@grin).
* [FIX] Convert very small floats to fixed format for geo-searches.
* [CHANGE] Rake's silent mode is respected for indexing (@endoscient).

2013-08-26: 3.0.5
* [CHANGE] Updating Riddle dependency to be >= 1.5.8.
* [FEATURE] Allow scoping of real-time index models.
* [CHANGE] Real-time index population presentation and logic are now separated.
* [CHANGE] Using the connection pool for update callbacks, excerpts, deletions.
* [FIX] Respect existing sql_query_range/sql_query_info settings.
* [CHANGE] Don't add the sphinx_internal_class_name unless STI models are indexed.
* [FIX] Don't add select clauses or joins to sql_query if they're for query/ranged-query properties.
* [CHANGE] Use Mysql2's reconnect option and have it turned on by default.
* [FIX] Set database timezones as part of the indexing process.
* [CHANGE] Improved auto-starring with escaped characters.
* [FIX] Chaining scopes with just options works again.

2013-07-09: 3.0.4
* [CHANGE] Updating Riddle dependency to be >= 1.5.7.
* [FEATURE] ts:regenerate rake task for rebuilding Sphinx when realtime indices are involved.
* [FEATURE] ts:clear task removes all Sphinx index and binlog files.
* [CHANGE] Glaze now responds to respond_to? (@groe).
* [FEATURE] Facet search calls now respect the limit option (which otherwise defaults to max_matches) (Demian Ferreiro).
* [FEATURE] Excerpts words can be overwritten with the words option (@groe).
* [FIX] Empty queries with the star option set to true are handled gracefully.
* [CHANGE] Deleted ActiveRecord objects are deleted in realtime indices as well.
* [CHANGE] Realtime callbacks are no longer automatically added, but they're now more flexible (for association situations).
* [CHANGE] Cleaning and refactoring so Code Climate ranks this as A-level code (Philip Arndt, Shevaun Coker, Garrett Heinlen).
* [FIX] Excerpts are now wildcard-friendly.
* [FIX] Facet searches now use max_matches value (with a default of 1000) to ensure as many results as possible are returned.
* [CHANGE] Exceptions raised when communicating with Sphinx are now mentioned in the logs when queries are retried (instead of STDOUT).
* [CHANGE] Excerpts now use just the query and standard conditions, instead of parsing Sphinx's keyword metadata (which had model names in it).
* [FIX] The settings cache is now cleared when the configuration singleton is reset (Pedro Cunha).
* [FEATURE] The :facets option can be used in facet searches to limit which facets are queried.
* [FIX] Escaped @'s in queries are considered part of each word, instead of word separators.
* [FIX] Internal class name conditions are ignored with auto-starred queries.
* [FEATURE] A separate role can be set for Sphinx actions with Capistrano (Andrey Chernih).
* [FIX] RDoc doesn't like constant hierarchies split over multiple lines.
* [CHANGE] Get database connection details from ActiveRecord::Base, not each model, as this is where changes are reflected.
* [CHANGE] Default Sphinx scopes are applied to new facet searches.
* [FEATURE] Facet searches can now be called from Sphinx scopes.

2013-05-07: 3.0.3
* [CHANGE] Updating Riddle dependency to be >= 1.5.6
* [FEATURE] INDEX_ONLY environment flag is passed through when invoked through Capistrano (Demian Ferreiro).
* [FEATURE] use_64_bit option returns as cast_to_timestamp instead (Denis Abushaev).
* [FIX] Update to association handling for Rails/ActiveRecord 4.0.0.rc1.
* [CHANGE] Delta jobs get common classes to allow third-party delta behaviours to leverage Thinking Sphinx.
* [FEATURE] Collection of hooks (lambdas) that get called before indexing. Useful for delta libraries.
* [FIX] Cast and concatenate multi-column attributes correctly.
* [FIX] Don't load fields or attributes when building a real-time index - otherwise the index is translated before it has a chance to be built.
* [CHANGE] Raise ThinkingSphinx::MixedScopesError if a search is called through an ActiveRecord scope.
* [FIX] Default search panes are cloned for each search.
* [FIX] Index-level settings (via set_property) are now applied consistently after global settings (in thinking_sphinx.yml).
* [FIX] All string values returned from Sphinx are now properly converted to UTF8.
* [CHANGE] GroupEnumeratorsMask is now a default mask, as masks need to be in place before search results are populated/the middleware is called (and previously it was being added within a middleware call).
* [FIX] The default search masks are now cloned for each search, instead of referring to the constant (and potentially modifying it often).
* [CHANGE] The current_page method is now a part of ThinkingSphinx::Search, as it is used when populating results.

2013-03-23: 3.0.2
* [CHANGE] per_page now accepts an optional paging limit, to match WillPaginate's behaviour. If none is supplied, it just returns the page size.
* [FEATURE] Ruby 2.0 support.
* [FEATURE] Rails 4.0.0 beta1 support.
* [FIX] :utf8? option within index definitions is now supported, and defaults to true if the database configuration's encoding is set to 'utf8'.
* [FIX] indices_location and configuration_file values in thinking_sphinx.yml will be applied to the configuration.
* [CHANGE] Strings and regular expressions in ThinkingSphinx::Search::Query are now treated as UTF-8.
* [FIX] Primary keys that are not 'id' now work correctly.
* [CHANGE] Setting a custom framework will rebuild the core configuration around its provided settings (path and environment).
* [CHANGE] Search masks don't rely on respond_to?, and so Object/Kernel methods are passed through to the underlying array instead.
* [FIX] Search options specified in index definitions and thinking_sphinx.yml are now used in search requests (eg: max_matches, field_weights).
* [FEATURE] Indexes defined in app/indices in engines are now loaded (Antonio Tapiador del Dujo).
* [FIX] Custom association conditions are no longer presumed to be an array.
* [CHANGE] Empty search conditions are now ignored, instead of being appended with no value (Nicholas Klick).
* [CHANGE] Custom conditions are no longer added to the sql_query_range value, as they may involve associations.
* [FIX] Capistrano tasks use the correct ts rake task prefix (David Celis).
* [FEATURE] Query errors are classified as such, instead of getting the base SphinxError.

2013-02-04: 3.0.1
* [FEATURE] Provide Capistrano deployment tasks (David Celis).
* [FEATURE] Allow specifying of Sphinx version. Is only useful for Flying Sphinx purposes at this point - has no impact on Riddle or Sphinx.
* [FEATURE] Support new JDBC configuration style (when JDBC can be used) (Kyle Stevens).
* [FIX] Referring to associations via polymorphic associations in an index definition now works.
* [FEATURE] Mysql2::Errors are wrapped as ThinkingSphinx::SphinxErrors, with subclasses of SyntaxError and ParseError used appropriately. Syntax and parse errors do not prompt a retry on a new connection.
* [CHANGE] Use connection pool for search queries. If a query fails, it will be retried on a new connection before raising if necessary.
* [CHANGE] Glaze always passes methods through to the underlying ActiveRecord::Base object if they don't exist on any of the panes.
* [FIX] Don't override foreign keys for polymorphic association replacements.
* [FIX] Quote namespaced model names in class field condition.
* [FEATURE] Polymorphic associations can be used within index definitions when the appropriate classes are set out.
* [FEATURE] Allow custom strings for SQL joins in index definitions.
* [FIX] New lines are maintained and escaped in custom source queries.
* [FIX] Subclasses of indexed models fire delta callbacks properly.
* [FIX] Thinking Sphinx can be loaded via thinking/sphinx, to satisfy Bundler.
* [FEATURE] indexer and searchd settings are added to the appropriate objects from config/thinking_sphinx.yml (@ygelfand).
* [FIX] New lines are maintained and escaped in sql_query values.

2013-01-02: 3.0.0
* [CHANGE] Updating Riddle dependency to 1.5.4.
* [FIX] Respect source options as well as underlying settings via the set_property method in index definitions.
* [FIX] Load real-time index definitions when listing fields, attributes, and/or conditions.
* [CHANGE] UTF-8 is now the default charset again (as it was in earlier Thinking Sphinx versions).
* [FEATURE] Initial realtime index support, including the ts:generate task for building index datasets. Sphinx 2.0.6 is required.
* [CHANGE] Removing ts:version rake task.
* [FEATURE] SphinxQL connection pooling via the Innertube gem.

2012-12-22: 3.0.0.rc
* [FEATURE] Source type support (query and ranged query) for both attributes and fields. Custom SQL strings can be supplied as well.
* [FEATURE] Wordcount attributes and fields now supported.
* [FEATURE] Support for Sinatra and other non-Rails frameworks.
* [FEATURE] A sphinx scope can be defined as the default.
* [FEATURE] An index can have multiple sources, by using define_source within the index definition.
* [FEATURE] sanitize_sql is available within an index definition.
* [FEATURE] Providing :prefixes => true or :infixes => true as an option when declaring a field means just the noted fields have infixes/prefixes applied.
* [FEATURE] ThinkingSphinx::Search#query_time returns the time Sphinx took to make the query.
* [FEATURE] Namespaced model support.
* [FEATURE] Default settings for index definition arguments can be set in config/thinking_sphinx.yml.
* [FIX] Correctly escape nulls in inheritance column (Darcy Laycock).
* [FIX] Use ThinkingSphinx::Configuration#render_to_file instead of ThinkingSphinx::Configuration#build in test helpers (Darcy Laycock).
* [FIX] Suppressing delta output in test helpers now works (Darcy Laycock).
* [FEATURE] A custom Riddle/Sphinx controller can be supplied. Useful for Flying Sphinx to have an API layer over Sphinx commands, without needing custom gems for different Thinking Sphinx/Flying Sphinx combinations.

2012-10-06: 3.0.0.pre
* First pre-release. Not quite feature complete, but the important stuff is certainly covered. See the README for more the finer details.
