from corehq.apps.groups.models import Group
from corehq.pillows.mappings.group_mapping import GROUP_INDEX, GROUP_MAPPING
from dimagi.utils.decorators.memoized import memoized
from pillowtop.listener import AliasedElasticPillow
from django.conf import settings


class GroupPillow(AliasedElasticPillow):
    """
    Simple/Common Case properties Indexer
    """

    document_class = Group
    couch_filter = "groups/all_groups"
    es_host = settings.ELASTICSEARCH_HOST
    es_port = settings.ELASTICSEARCH_PORT
    es_timeout = 60
    es_index_prefix = "hqgroups"
    es_alias = "hqgroups"
    es_type = "group"
    es_meta = {
        "settings": {
            "analysis": {
                "analyzer": {
                    "default": {
                        "type": "custom",
                        "tokenizer": "whitespace",
                        "filter": ["lowercase"]
                    },
                }
            }
        }
    }
    es_index = GROUP_INDEX
    default_mapping = GROUP_MAPPING

    @memoized
    def calc_meta(self):
        #todo: actually do this correctly

        """
        override of the meta calculator since we're separating out all the types,
        so we just do a hash of the "prototype" instead to determined md5
        """
        return self.calc_mapping_hash({"es_meta": self.es_meta,
                                       "mapping": self.default_mapping})

    def get_mapping_from_type(self, doc_dict):
        """
        Define mapping uniquely to the user_type document.
        See below on why date_detection is False

        NOTE: DO NOT MODIFY THIS UNLESS ABSOLUTELY NECESSARY. A CHANGE BELOW WILL GENERATE A NEW
        HASH FOR THE INDEX NAME REQUIRING A REINDEX+RE-ALIAS. THIS IS A SERIOUSLY RESOURCE
        INTENSIVE OPERATION THAT REQUIRES SOME CAREFUL LOGISTICS TO MIGRATE
        """
        #the meta here is defined for when the case index + type is created for the FIRST time
        #subsequent data added to it will be added automatically, but date_detection is necessary
        # to be false to prevent indexes from not being created due to the way we store dates
        #all are strings EXCEPT the core case properties which we need to explicitly define below.
        #that way date sort and ranges will work with canonical date formats for queries.
        return {
            self.get_type_string(doc_dict): self.default_mapping
        }

    def get_type_string(self, doc_dict):
        return self.es_type

from corehq.apps.groups.models import Group
from corehq.pillows.mappings.group_mapping import GROUP_INDEX, GROUP_MAPPING
from dimagi.utils.decorators.memoized import memoized
from pillowtop.listener import AliasedElasticPillow
from django.conf import settings


class GroupPillow(HQPillow):
    """
    Simple/Common Case properties Indexer
    """

    document_class = Group
    couch_filter = "groups/all_groups"
    es_index_prefix = "hqgroups"
    es_alias = "hqgroups"
    es_type = "group"
    es_index = GROUP_INDEX
    default_mapping = GROUP_MAPPING

Switch over to extend HQPillow
Switch over to extend HQPillow

  from corehq.apps.groups.models import Group
  from corehq.pillows.mappings.group_mapping import GROUP_INDEX, GROUP_MAPPING
  from dimagi.utils.decorators.memoized import memoized
  from pillowtop.listener import AliasedElasticPillow
  from django.conf import settings
  
  
- class GroupPillow(AliasedElasticPillow):
+ class GroupPillow(HQPillow):
      """
      Simple/Common Case properties Indexer
      """
  
      document_class = Group
      couch_filter = "groups/all_groups"
-     es_host = settings.ELASTICSEARCH_HOST
-     es_port = settings.ELASTICSEARCH_PORT
-     es_timeout = 60
      es_index_prefix = "hqgroups"
      es_alias = "hqgroups"
      es_type = "group"
-     es_meta = {
-         "settings": {
-             "analysis": {
-                 "analyzer": {
-                     "default": {
-                         "type": "custom",
-                         "tokenizer": "whitespace",
-                         "filter": ["lowercase"]
-                     },
-                 }
-             }
-         }
-     }
      es_index = GROUP_INDEX
      default_mapping = GROUP_MAPPING
  
-     @memoized
-     def calc_meta(self):
-         #todo: actually do this correctly
- 
-         """
-         override of the meta calculator since we're separating out all the types,
-         so we just do a hash of the "prototype" instead to determined md5
-         """
-         return self.calc_mapping_hash({"es_meta": self.es_meta,
-                                        "mapping": self.default_mapping})
- 
-     def get_mapping_from_type(self, doc_dict):
-         """
-         Define mapping uniquely to the user_type document.
-         See below on why date_detection is False
- 
-         NOTE: DO NOT MODIFY THIS UNLESS ABSOLUTELY NECESSARY. A CHANGE BELOW WILL GENERATE A NEW
-         HASH FOR THE INDEX NAME REQUIRING A REINDEX+RE-ALIAS. THIS IS A SERIOUSLY RESOURCE
-         INTENSIVE OPERATION THAT REQUIRES SOME CAREFUL LOGISTICS TO MIGRATE
-         """
-         #the meta here is defined for when the case index + type is created for the FIRST time
-         #subsequent data added to it will be added automatically, but date_detection is necessary
-         # to be false to prevent indexes from not being created due to the way we store dates
-         #all are strings EXCEPT the core case properties which we need to explicitly define below.
-         #that way date sort and ranges will work with canonical date formats for queries.
-         return {
-             self.get_type_string(doc_dict): self.default_mapping
-         }
- 
-     def get_type_string(self, doc_dict):
-         return self.es_type
- 
Switch over to extend HQPillow
## Code Before:
from corehq.apps.groups.models import Group
from corehq.pillows.mappings.group_mapping import GROUP_INDEX, GROUP_MAPPING
from dimagi.utils.decorators.memoized import memoized
from pillowtop.listener import AliasedElasticPillow
from django.conf import settings


class GroupPillow(AliasedElasticPillow):
    """
    Simple/Common Case properties Indexer
    """

    document_class = Group
    couch_filter = "groups/all_groups"
    es_host = settings.ELASTICSEARCH_HOST
    es_port = settings.ELASTICSEARCH_PORT
    es_timeout = 60
    es_index_prefix = "hqgroups"
    es_alias = "hqgroups"
    es_type = "group"
    es_meta = {
        "settings": {
            "analysis": {
                "analyzer": {
                    "default": {
                        "type": "custom",
                        "tokenizer": "whitespace",
                        "filter": ["lowercase"]
                    },
                }
            }
        }
    }
    es_index = GROUP_INDEX
    default_mapping = GROUP_MAPPING

    @memoized
    def calc_meta(self):
        #todo: actually do this correctly

        """
        override of the meta calculator since we're separating out all the types,
        so we just do a hash of the "prototype" instead to determined md5
        """
        return self.calc_mapping_hash({"es_meta": self.es_meta,
                                       "mapping": self.default_mapping})

    def get_mapping_from_type(self, doc_dict):
        """
        Define mapping uniquely to the user_type document.
        See below on why date_detection is False

        NOTE: DO NOT MODIFY THIS UNLESS ABSOLUTELY NECESSARY. A CHANGE BELOW WILL GENERATE A NEW
        HASH FOR THE INDEX NAME REQUIRING A REINDEX+RE-ALIAS. THIS IS A SERIOUSLY RESOURCE
        INTENSIVE OPERATION THAT REQUIRES SOME CAREFUL LOGISTICS TO MIGRATE
        """
        #the meta here is defined for when the case index + type is created for the FIRST time
        #subsequent data added to it will be added automatically, but date_detection is necessary
        # to be false to prevent indexes from not being created due to the way we store dates
        #all are strings EXCEPT the core case properties which we need to explicitly define below.
        #that way date sort and ranges will work with canonical date formats for queries.
        return {
            self.get_type_string(doc_dict): self.default_mapping
        }

    def get_type_string(self, doc_dict):
        return self.es_type

## Instruction:
Switch over to extend HQPillow
## Code After:
from corehq.apps.groups.models import Group
from corehq.pillows.mappings.group_mapping import GROUP_INDEX, GROUP_MAPPING
from dimagi.utils.decorators.memoized import memoized
from pillowtop.listener import AliasedElasticPillow
from django.conf import settings


class GroupPillow(HQPillow):
    """
    Simple/Common Case properties Indexer
    """

    document_class = Group
    couch_filter = "groups/all_groups"
    es_index_prefix = "hqgroups"
    es_alias = "hqgroups"
    es_type = "group"
    es_index = GROUP_INDEX
    default_mapping = GROUP_MAPPING
