def METHOD_NAME(self, stream_name: str, record: MutableMapping):
    if self.id_schema.get(stream_name, "") in record:
        id_field_name = self.id_schema.get(stream_name, "")
        record_id = generate_id(record.get(id_field_name))
        del record[id_field_name]
    else:
        if "id" in record:
            record_id = generate_id(record.get("id"))
            del record["id"]
        # Weaviate will throw an error if you try to store a field with name _id
        elif "_id" in record:
            record_id = generate_id(record.get("_id"))
            del record["_id"]
        else:
            record_id = uuid.uuid4()
    record_id = str(record_id)
    # TODO support nested objects instead of converting to json string when weaviate supports this
    for k, v in record.items():
        if self.schema[stream_name].get(k, "") == "jsonify":
            record[k] = json.dumps(v)
        # Handling of empty list that's not part of defined schema otherwise Weaviate throws invalid string property
        if isinstance(v, list) and len(v) == 0 and k not in self.schema[stream_name]:
            record[k] = ""
    missing_properties = set(self.schema[stream_name].keys()).difference(record.keys()).discard("id")
    for prop in missing_properties or []:
        record[prop] = None
    additional_props = set(record.keys()).difference(self.schema[stream_name].keys())
    for prop in additional_props or []:
        if isinstance(record[prop], dict):
            record[prop] = json.dumps(record[prop])
        if isinstance(record[prop], list) and len(record[prop]) > 0 and isinstance(record[prop][0], dict):
            record[prop] = json.dumps(record[prop])
    # Property names in Weaviate have to start with lowercase letter
    record = {k[0].lower() + k[1:]: v for k, v in record.items()}
    vector = None
    if stream_name in self.vectors:
        vector_column_name = self.vectors.get(stream_name)
        vector = record.get(vector_column_name)
        del record[vector_column_name]
    class_name = stream_to_class_name(stream_name)
    self.client.batch.add_data_object(record, class_name, record_id, vector=vector)
    self.buffered_objects[record_id] = BufferedObject(record_id, record, vector, class_name)
    if self.client.batch.num_objects() >= self.batch_size:
        self.flush()