code: function stringify(query, actualField) {
      query = query || {};
  
      let key = typeof query === 'object' ? Object.keys(query)[0] : null;
      let textQuery = '';
  
      let queryObject = query[key];
  
      switch (key) {
  
          case '$and':
          case '$or':
              textQuery = logicalOperator(queryObject, actualField, key);
              break;
  
          case '$lt':
          case '$lte':
          case '$gt':
          case '$gte':
          case '$ne':
          case '$eq':
              textQuery = binaryOperator(queryObject, actualField, key);
              break;
  
          case '$in':
          case '$nin':
              let exp = containmentOperator(queryObject, actualField, key);
              textQuery += stringify(exp, actualField);
              break;
  
          default:
  
              // $id and $updated are internal properteis they are good to go
              if (key && key[0] === '$') {
                  break;
              }
  
              if (typeof query !== 'object') {
                  textQuery = handleValue(query);
              } else if (queryObject) {
                  textQuery =  equalityOperator(queryObject, key);
              }
              break;
      }
  
      return textQuery;
  }
docs: Parses the given query and converts it to Google SQ compatible format. Basically it creates a tree
  representation of the query and walk it recursively.
  Read more here: https://developers.google.com/chart/interactive/docs/querylanguage
  
  @param {object} query
  @param actualField
  @returns {string}