<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def add_metadata_query_properties(self, meta_constraints, id_table, id_column):
 """ Construct WHERE clauses from a list of MetaConstraint objects, adding them to the query state. :param meta_constraints: A list of MetaConstraint objects, each of which defines a condition over metadata which must be satisfied for results to be included in the overall query. :raises: ValueError if an unknown meta constraint type is encountered. """

        for mc in meta_constraints:
            meta_key = str(mc.key)
            ct = mc.constraint_type
            sql_template = """
{0}.uid IN (
SELECT m.{1} FROM archive_metadata m
INNER JOIN archive_metadataFields k ON m.fieldId=k.uid
WHERE m.{2} {3} %s AND k.metaKey = %s
)"""
            # Add metadata value to list of SQL arguments
            self.sql_args.append(SQLBuilder.map_value(mc.value))
            # Add metadata key to list of SQL arguments
            self.sql_args.append(meta_key)
            # Put an appropriate WHERE clause
            if ct == 'less':
                self.where_clauses.append(sql_template.format(id_table, id_column, 'floatValue', '<='))
            elif ct == 'greater':
                self.where_clauses.append(sql_template.format(id_table, id_column, 'floatValue', '>='))
            elif ct == 'number_equals':
                self.where_clauses.append(sql_template.format(id_table, id_column, 'floatValue', '='))
            elif ct == 'string_equals':
                self.where_clauses.append(sql_template.format(id_table, id_column, 'stringValue', '='))
            else:
                raise ValueError("Unknown meta constraint type!")