lib/esse/cli/templates/index.rb.erb in esse-0.0.5 vs lib/esse/cli/templates/index.rb.erb in esse-0.1.1

- old
+ new

@@ -1,59 +1,124 @@ # frozen_string_literal: true +<%- @types.each do |type| -%> +require_relative '<%= @index_name.demodulize.underscore.to_s %>/collections/<%= type.underscore %>_collection' +<%- end -%> +<%- @types.each do |type| -%> +require_relative '<%= @index_name.demodulize.underscore.to_s %>/serializers/<%= type.underscore %>_serializer' +<%- end -%> + class <%= @index_name %> < <%= @base_class %> # plugin :active_record # plugin :sequel + <%- if @types.empty? -%> + # Collection + # ========== + # + # Collection is the source of data for the index. We hightly recommend using a + # another class that implements the Enumerable interface to better split the + # responsabilities and easy to test. + # + # collection Collections::DocumentCollection + # + # but you can also use block definition style: + # collection do |_context, &block| + # block.call [{ title: 'foo' }, { title: 'bar' }], context + # end + # + # Serializer block or class yielder should be called with an array of objects. + # Each these objects should be serialized using the serializer in described in the next section. + # The number of objects will be indexed to elasticsearch using the bulk api. So adjust the + # number of objects to be indexed accordingly. + # + # Here is a good place to eager loading data from database or any other repository. + # The bellow example is a rails like application that could preload using activerecord + # + # collection do |**context, &block| + # query = <%= @index_name.camelize %>.all + # query = query.where(**context[:conditions]) if context[:conditions] + # query = query.includes(:user) if context[:include_user] + # query.find_in_batches(batch_size: 5000) do |batch| + # block.call batch, context + # end + # end + + + # Serializer + # ========== + # + # Serializer is the class responsible for serializing indexing documents. + # Each object yielded by the collection will be serialized on this step. + # We recommend using a another class to handle the serialization. The only requirement is + # that the class implements the `#to_h` method. + # The serializer class may also be initialized with context if collection block is called with that extra parameter. + # Ability to call serializer with context is useful for preloading data from database or any other repository. + # + # serializer Serializers::DocumentSerializer + # + # You can also serialize the collection entry using a block: + # + # serializer do |model, context| + # hash = { + # name: <%= @index_name.underscore %>.name, + # } + # # Context is just an example here. But it's useful for eager loading data. + # # I'll think a better example when implement this idea. + # hash[:some_attribute] = <%= @index_name.underscore %>.some_attribute if context[:include_some_attribute] + # hash + # end + <%- end -%> <%- @types.each do |type| -%> - define_type :<%= type %> do + define_type :<%= type.underscore %> do # Collection # ========== # # Collection wraps the data into an array of items that should be serialized. The first argument that is # yielded must extends Enumerable. # Useful for eager loading data from database or any other repository. Below is an example of a rails like # application could load using activerecord. # - # collection do |conditions, &block| - # context = {} - # <%= type.camelize %>.where(conditions).find_in_batches(batch_size: 5000) do |batch| - # block.call batch, context, ... + # collection do |context, &block| + # <%= type.camelize %>.where(context[:conditions]).find_in_batches(batch_size: 5000) do |batch| + # block.call batch, context # end # end + collection Collections::<%= type.camelize %>Collection # # # Serializer # ========== # - # The serializer can be any class that respond with the `as_json` class method. - # And the result of its as_json is a Hash. + # The serializer can be any class that respond with the `to_h` class method. + # And the result of its to_h is a Hash. # # Here is an example of a simple serializer: # app/serializers/<%= type %>_serializer.rb # class <%= type.camelize %>Serializer # def initialize(<%= type %>, _context) # @<%= type %> = <%= type %> # end # - # def as_json + # def to_h # { '_id' => @<%= type %>.id, 'name' => @<%= type %>.name } # end # end # # And here you specify your serializer classe. # serializer Serializers::<%= type.camelize %>Serializer # # You can also serialize the collection entry using a block: # - # serializer do |model, context = {}| + # serializer do |model, **context| # hash = { # name: <%= type %>.name, # } # # Context is just an example here. But it's useful for eager loading data. # # I'll think a better example when implement this idea. # hash[:some_attribute] = <%= type %>.some_attribute if context[:include_some_attribute] # hash # end + serializer Serializers::<%= type.camelize %>Serializer end <%- end -%> end