# Allen Institute Software License - This software license is the 2-clause BSD
# license plus a third clause that prohibits redistribution for commercial
# purposes without further permission.
#
# Copyright 2015-2016. Allen Institute. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# 1. Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions and the following disclaimer in the documentation
# and/or other materials provided with the distribution.
#
# 3. Redistributions for commercial purposes are not permitted without the
# Allen Institute's written permission.
# For purposes of this license, commercial purposes is the incorporation of the
# Allen Institute's software into anything for which you will charge fees or
# other compensation. Contact terms@alleninstitute.org for commercial licensing
# opportunities.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
from .rma_api import RmaApi


class ConnectedServices(object):
    '''
    A class representing a schema of informatics web services.

    Notes
    -----
    See `Connected Services and Pipes <http://help.brain-map.org/display/api/Connected+Services+and+Pipes>`_
    for a human-readable list of services and parameters.

    The URL format is documented at
    `Service Pipelines <http://help.brain-map.org/display/api/Service+Pipelines>`_.

    Connected Services only include API services that are accessed
    via the RMA endpoint using an rma::services stage.
    '''
    ARRAY = 'array'
    STRING = 'string'
    INTEGER = 'integer'
    FLOAT = 'float'
    BOOLEAN = 'boolean'

    def __init__(self):
        pass

    def build_url(self, service_name, kwargs):
        '''Create a single stage RMA url from a service name and parameters.
        '''
        rma = RmaApi()
        fmt = kwargs.get('fmt', 'json')

        schema_entry = ConnectedServices._schema[service_name]

        params = []

        for parameter in schema_entry['parameters']:
            value = kwargs.get(parameter['name'], None)
            if value is not None:
                params.append((parameter['name'], value))

        service_stage = rma.service_stage(service_name,
                                          params)

        url = rma.build_query_url([service_stage], fmt)

        return url

    @classmethod
    @property
    def schema(cls):
        '''Dictionary of service names and parameters.

        Notes
        -----
        See `Connected Services and Pipes <http://help.brain-map.org/display/api/Connected+Services+and+Pipes>`_
        for a human-readable list of connected services and their parameters.
        '''
        return cls._schema

    _schema = {
        'dev_human_correlation': {
            'parameters': [
                {'name': 'set',
                 'optional': True,
                 'type': STRING,
                 'values': ['rna_seq_genes',
                            'rna_seq_exons',
                            'exon_microarray_genes'
                            'exon_microarray_exons']
                 },
                {'name': 'donors',
                 'optional': True,
                 'type': ARRAY
                 },
                {'name': 'structures',
                 'optional': False,
                 'type': ARRAY
                 },
                {'name': 'probes',
                 'optional': False,
                 'type': INTEGER
                 },
                {'name': 'sort_order',
                 'type': STRING,
                 'optional': True,
                 'values': ['asc', 'desc'],
                 'default': ['desc']
                 },
                {'name': 'start_row',
                 'type': INTEGER,
                 'optional': True,
                 'default': 0
                 },
                {'name': 'num_rows',
                 'type': INTEGER,
                 'optional': True,
                 'default': 2000
                 }
            ]
        },
        'dev_human_differential': {
            'parameters': [
                {'name': 'set',
                 'type': STRING,
                 'values': ['rna_seq_genes',
                            'rna_seq_exons',
                            'exon_microarray_genes',
                            'exon_microarray_exons']
                 },
                {'name': 'donors1',
                 'type': ARRAY,
                 'array_type': INTEGER,
                 'optional': True
                 },
                {'name': 'structures1',
                 'type': ARRAY,
                 'array_type': INTEGER
                 },
                {'name': 'donors2',
                 'type': ARRAY,
                 'optional': True,
                 'array_type': INTEGER
                 },
                {'name': 'structures2',
                 'type': ARRAY,
                 'array_type': INTEGER
                 },
                {'name': 'sort_by',
                 'type': STRING,
                 'optional': True,
                 'values': ['p-value', 'fold-change'],
                 'default': 'p-value'
                 },
                {'name': 'start_row',
                 'type': INTEGER,
                 'optional': True,
                 'default': 0
                 },
                {'name': 'num_rows',
                 'type': INTEGER,
                 'optional': True,
                 'default': 2000
                 }
            ]
        },
        'dev_human_expression': {
            'parameters': [
                {'name': 'set',
                 'type': STRING,
                 'values': ['rna_seq_genes',
                            'rna_seq_exons',
                            'exon_microarray_genes',
                            'exon_microarray_exons']
                 },
                {'name': 'probes',
                 'type': INTEGER
                 },
                {'name': 'donors',
                 'type': ARRAY,
                 'array_type': INTEGER,
                 'optional': True
                 },
                {'name': 'structures',
                 'type': ARRAY,
                 'array_type': INTEGER,
                 'optional': True
                 },
                {'name': 'start_row',
                 'type': INTEGER,
                 'optional': True,
                 'default': 0
                 },
                {'name': 'num_rows',
                 'type': INTEGER,
                 'optional': True,
                 'default': 2000
                 }
            ]
        },
        'dev_human_microarray_correlation': {
            'parameters': [
                {'name': 'donors',
                 'type': ARRAY,
                 'array_type': INTEGER,
                 'optional': True
                 },
                {'name': 'structures',
                 'type': ARRAY,
                 'array_type': [INTEGER, STRING]
                 },
                {'name': 'probes',
                 'type': INTEGER
                 },
                {'name': 'sort_order',
                 'type': STRING,
                 'optional': True,
                 'values': ['asc', 'desc'],
                 'default': 'desc'
                 },
                {'name': 'start_row',
                 'type': INTEGER,
                 'optional': True,
                 'default': 0
                 },
                {'name': 'num_rows',
                 'type': INTEGER,
                 'optional': True,
                 'default': 2000
                 }
            ]
        },
        'dev_human_microarray_differential': {
            'parameters': [
                {'name': 'donors1',
                 'type': ARRAY,
                 'array_type': INTEGER,
                 'optional': True
                 },
                {'name': 'structures1',
                 'type': ARRAY,
                 'array_type': INTEGER
                 },
                {'name': 'donors2',
                 'type': ARRAY,
                 'array_type': INTEGER,
                 'optional': True
                 },
                {'name': 'structures2',
                 'type': ARRAY,
                 'array_type': INTEGER
                 },
                {'name': 'sort_by',
                 'type': STRING,
                 'optional': True,
                 'values': ['p-value', 'fold-change'],
                 'default': 'p-value'
                 },
                {'name': 'start_row',
                 'type': INTEGER,
                 'optional': True,
                 'default': 0
                 },
                {'name': 'num_rows',
                 'type': INTEGER,
                 'optional': True,
                 'default': 2000
                 }
            ]
        },
        'dev_human_microarray_expression': {
            'parameters': [
                {'name': 'probes',
                 'type': ARRAY,
                 'array_type': INTEGER
                 },
                {'name': 'start_row',
                 'type': INTEGER,
                 'optional': True,
                 'default': 0
                 },
                {'name': 'num_rows',
                 'type': INTEGER,
                 'optional': True,
                 'default': 2000
                 },
                {'name': 'donors',
                 'type': INTEGER,
                 'optional': True,
                 },
                {'name': 'structures',
                 'type': INTEGER,
                 'optional': True
                 }
            ]
        },
        'dev_mouse_agea': {
            'parameters': [
                {'name': 'seed_age',
                 'type': STRING
                 },
                {'name': 'map_age',
                 'type': STRING
                 },
                {'name': 'seed_point',
                 'type': ARRAY,
                 'array_type': INTEGER
                 },
                {'name': 'seed_threshold',
                 'type': ARRAY,
                 'array_type': FLOAT
                 },
                {'name': 'map_threshold',
                 'type': ARRAY,
                 'array_type': FLOAT
                 },
                {'name': 'contrast_threshold',
                 'type': ARRAY,
                 'array_type': INTEGER,
                 'optional': True
                 },
                {'name': 'target_threshold',
                 'type': ARRAY,
                 'array_type': INTEGER,
                 'optional': True
                 },
                {'name': 'start_row',
                 'type': INTEGER,
                 'optional': True,
                 'default': 0
                 },
                {'name': 'num_rows',
                 'type': INTEGER,
                 'optional': True,
                 'default': 2000
                 }
            ]
        },
        'dev_mouse_correlation': {
            'parameters': [
                {'name': 'row',
                 'type': INTEGER
                 },
                {'name': 'structures',
                 'type': ARRAY,
                 'array_type': [INTEGER, STRING],
                 'optional': True
                 },
                {'name': 'ages',
                 'type': ARRAY,
                 'array_type': STRING,
                 'optional': True
                 },
                {'name': 'sort_order',
                 'type': STRING,
                 'optional': True,
                 'values': ['asc', 'desc'],
                 'default': 'desc'
                 },
                {'name': 'start_row',
                 'type': INTEGER,
                 'optional': True,
                 'default': 0
                 },
                {'name': 'num_rows',
                 'type': INTEGER,
                 'optional': True,
                 'default': 2000
                 }
            ]
        },
        'gbm_correlation': {
            'parameters': [
                {'name': 'donors',
                 'type': ARRAY,
                 'array_type': INTEGER,
                 'optional': True
                 },
                {'name': 'structures',
                 'type': ARRAY,
                 'array_type': [INTEGER, STRING]
                 },
                {'name': 'probes',
                 'type': INTEGER
                 },
                {'name': 'sort_order',
                 'type': STRING,
                 'optional': True,
                 'values': ['asc', 'desc'],
                 'default': 'desc'
                 },
                {'name': 'start_row',
                 'type': INTEGER,
                 'optional': True,
                 'default': 0
                 },
                {'name': 'num_rows',
                 'type': INTEGER,
                 'optional': True,
                 'default': 2000
                 }
            ]
        },
        'gbm_differential': {
            'parameters': [
                {'name': 'donors1',
                 'type': ARRAY,
                 'array_type': INTEGER,
                 'optional': True
                 },
                {'name': 'structures1',
                 'type': ARRAY,
                 'array_type': INTEGER
                 },
                {'name': 'donors2',
                 'type': ARRAY,
                 'array_type': INTEGER,
                 'optional': True
                 },
                {'name': 'structures2',
                 'type': ARRAY,
                 'array_type': INTEGER
                 },
                {'name': 'sort_by',
                 'type': STRING,
                 'optional': True,
                 'values': ['p-value', 'fold-change'],
                 'default': 'p-value'
                 },
                {'name': 'start_row',
                 'type': INTEGER,
                 'optional': True,
                 'default': 0
                 },
                {'name': 'num_rows',
                 'type': INTEGER,
                 'optional': True,
                 'default': 2000
                 }
            ]
        },
        'gbm_expression': {
            'parameters': [
                {'name': 'probes',
                 'type': INTEGER,
                 'array_type': INTEGER
                 },
                {'name': 'start_row',
                 'type': INTEGER,
                 'optional': True,
                 'default': 0
                 },
                {'name': 'num_rows',
                 'type': INTEGER,
                 'optional': True,
                 'default': 2000
                 },
                {'name': 'donors',
                 'type': INTEGER,
                 'optional': True
                 },
                {'name': 'structures',
                 'type': INTEGER,
                 'optional': True
                 }
            ]
        },
        'gbm_ish_differential': {
            'parameters': [
                {'name': 'structures1',
                 'type': ARRAY,
                 'array_type': INTEGER
                 },
                {'name': 'structures2',
                 'type': ARRAY,
                 'array_type': INTEGER
                 },
                {'name': 'threshold1',
                 'type': ARRAY,
                 'array_type': INTEGER,
                 'optional': True
                 },
                {'name': 'threshold2',
                 'type': ARRAY,
                 'array_type': INTEGER,
                 'optional': True
                 },
                {'name': 'start_row',
                 'type': INTEGER,
                 'optional': True,
                 'default': 0
                 },
                {'name': 'num_rows',
                 'type': INTEGER,
                 'optional': True,
                 'default': 2000
                 }
            ]
        },
        'gbm_ish_expression': {
            'parameters': [
                {'name': 'structures',
                 'type': ARRAY,
                 'array_type': INTEGER
                 },
                {'name': 'threshold',
                 'type': ARRAY,
                 'array_type': INTEGER,
                 'optional': True
                 },
                {'name': 'start_row',
                 'type': INTEGER,
                 'optional': True,
                 'default': 0
                 },
                {'name': 'num_rows',
                 'type': INTEGER,
                 'optional': True,
                 'default': 2000
                 }
            ]
        },
        'human_microarray_correlation': {
            'parameters': [
                {'name': 'donors',
                 'type': ARRAY,
                 'array_type': INTEGER,
                 'optional': True
                 },
                {'name': 'structures',
                 'type': ARRAY,
                 'array_type': [INTEGER, STRING]
                 },
                {'name': 'probes',
                 'type': INTEGER
                 },
                {'name': 'sort_order',
                 'type': STRING,
                 'optional': True,
                 'values': ['asc', 'desc'],
                 'default': 'desc'
                 },
                {'name': 'start_row',
                 'type': INTEGER,
                 'optional': True,
                 'default': 0
                 },
                {'name': 'num_rows',
                 'type': INTEGER,
                 'optional': True,
                 'default': 2000
                 }
            ]
        },
        'human_microarray_differential': {
            'parameters': [
                {'name': 'donors1',
                 'type': ARRAY,
                 'array_type': INTEGER,
                 'optional': True
                 },
                {'name': 'structures1',
                 'type': ARRAY,
                 'array_type': INTEGER
                 },
                {'name': 'donors2',
                 'type': ARRAY,
                 'optional': True,
                 'array_type': INTEGER
                 },
                {'name': 'structures2',
                 'type': ARRAY,
                 'array_type': INTEGER
                 },
                {'name': 'sort_by',
                 'type': STRING,
                 'values': ['p-value', 'fold-change'],
                 'default': 'p-value'
                 },
                {'name': 'start_row',
                 'type': INTEGER,
                 'optional': True,
                 'default': 0
                 },
                {'name': 'num_rows',
                 'type': INTEGER,
                 'optional': True,
                 'default': 2000
                 }
            ]
        },
        'human_microarray_expression': {
            'parameters': [
                {'name': 'probes',
                 'type': ARRAY,
                 'array_type': INTEGER
                 },
                {'name': 'donors',
                 'type': ARRAY,
                 'array_type': INTEGER,
                 'optional': True
                 },
                {'name': 'structures',
                 'type': ARRAY,
                 'array_type': INTEGER,
                 'optional': True
                 },
                {'name': 'start_row',
                 'type': INTEGER,
                 'optional': True,
                 'default': 0
                 },
                {'name': 'num_rows',
                 'type': INTEGER,
                 'optional': True,
                 'default': 2000
                 }
            ]
        },
        'mouse_agea': {
            'parameters': [
                {'name': 'set',
                 'type': STRING
                 },
                {'name': 'seed_age',
                 'type': STRING
                 },
                {'name': 'map_age',
                 'type': STRING
                 },
                {'name': 'seed_point',
                 'type': ARRAY,
                 'array_type': FLOAT
                 },
                {'name': 'correlation_threshold1',
                 'type': FLOAT,
                 'optional': True,
                 },
                {'name': 'correlation_threshold2',
                 'type': FLOAT,
                 'optional': True
                 },
                {'name': 'threshold1',
                 'type': ARRAY,
                 'array_type': INTEGER,
                 'optional': True
                 },
                {'name': 'threshold2',
                 'type': ARRAY,
                 'array_type': INTEGER,
                 'optional': True
                 },
                {'name': 'start_row',
                 'type': INTEGER,
                 'optional': True,
                 'default': 0
                 },
                {'name': 'num_rows',
                 'type': INTEGER,
                 'optional': True,
                 'default': 2000
                 }
            ]
        },
        'mouse_correlation': {
            'parameters': [
                {'name': 'set',
                 'type': STRING,
                 'values': ['mouse', 'mouse_coronal']
                 },
                {'name': 'structures',
                 'type': ARRAY,
                 'array_type': [INTEGER, STRING],
                 'optional': True
                 },
                {'name': 'row',
                 'type': INTEGER
                 },
                {'name': 'sort_order',
                 'type': STRING,
                 'optional': True,
                 'values': ['asc', 'desc'],
                 'default': 'desc'
                 },
                {'name': 'start_row',
                 'type': INTEGER,
                 'optional': True,
                 'default': 0
                 },
                {'name': 'num_rows',
                 'type': INTEGER,
                 'optional': True,
                 'default': 2000
                 }
            ]
        },
        'mouse_differential': {
            'parameters': [
                {'name': 'set',
                 'type': STRING,
                 'values': ['mouse', 'mouse_coronal']
                 },
                {'name': 'structures1',
                 'type': ARRAY,
                 'array_type': INTEGER
                 },
                {'name': 'structures2',
                 'type': ARRAY,
                 'array_type': INTEGER
                 },
                {'name': 'threshold1',
                 'type': ARRAY,
                 'array_type': INTEGER,
                 'optional': True
                 },
                {'name': 'threshold2',
                 'type': ARRAY,
                 'array_type': INTEGER,
                 'optional': True
                 },
                {'name': 'start_row',
                 'type': INTEGER,
                 'optional': True,
                 'default': 0
                 },
                {'name': 'num_rows',
                 'type': INTEGER,
                 'optional': True,
                 'default': 2000
                 }
            ]
        },
        'mouse_connectivity_correlation': {
            'parameters': [
                {'name': 'row',
                 'type': INTEGER
                 },
                {'name': 'structures',
                 'type': ARRAY,
                 'array_type': [INTEGER, STRING],
                 'optional': True
                 },
                {'name': 'product_ids',
                 'type': ARRAY,
                 'array_type': [INTEGER],
                 'optional': True
                 },
                {'name': 'hemisphere',
                 'type': STRING,
                 'optional': True,
                 'values': ['right', 'left']
                 },
                {'name': 'transgenic_lines',
                 'type': ARRAY,
                 'array_type': [INTEGER, STRING],
                 'optional': True
                 },
                {'name': 'injection_structures',
                 'type': 'Array',
                 'array_type': [INTEGER, STRING],
                 'optional': True
                 },
                {'name': 'primary_structure_only',
                 'type': BOOLEAN,
                 'optional': True,
                 },
                {'name': 'sort_order',
                 'type': STRING,
                 'optional': True,
                 'values': ['asc', 'desc'],
                 'default': 'desc'
                 },
                {'name': 'start_row',
                 'type': INTEGER,
                 'optional': True,
                 'default': 0
                 },
                {'name': 'num_rows',
                 'type': INTEGER,
                 'optional': True,
                 'default': 2000
                 }
            ]
        },
        'mouse_connectivity_injection_coordinate': {
            'parameters': [
                {'name': 'seed_point',
                 'type': ARRAY,
                 'array_type': FLOAT,
                 'optional': False,
                 },
                {'name': 'transgenic_lines',
                 'type': ARRAY,
                 'array_type': [INTEGER, STRING],
                 'optional': True
                 },
                {'name': 'injection_structures',
                 'type': ARRAY,
                 'array_type': [INTEGER, STRING],
                 'optional': True
                 },
                {'name': 'product_ids',
                 'type': ARRAY,
                 'array_type': [INTEGER],
                 'optional': True
                 },
                {'name': 'primary_structure_only',
                 'optional': True
                 },
                {'name': 'start_row',
                 'type': INTEGER,
                 'optional': True,
                 'default': 0
                 },
                {'name': 'num_rows',
                 'type': INTEGER,
                 'optional': True,
                 'default': 2000
                 }
            ]
        },
        'mouse_connectivity_injection_structure': {
            'parameters': [
                {'name': 'injection_structures',
                 'type': ARRAY,
                 'array_type': [INTEGER, STRING]
                 },
                {'name': 'target_domain',
                 'type': ARRAY,
                 'array_type': [INTEGER, STRING],
                 'optional': True
                 },
                {'name': 'injection_hemisphere',
                 'type': STRING,
                 'optional': True,
                 'values': ['right', 'left']
                 },
                {'name': 'target_hemisphere',
                 'type': STRING,
                 'optional': True,
                 'values': ['right', 'left']
                 },
                {'name': 'transgenic_lines',
                 'type': ARRAY,
                 'array_type': [INTEGER, STRING],
                 'optional': True
                 },
                {'name': 'injection_domain',
                 'type': ARRAY,
                 'array_type': [INTEGER, STRING],
                 'optional': True
                 },
                {'name': 'product_ids',
                 'type': ARRAY,
                 'array_type': [INTEGER],
                 'optional': True
                 },
                {'name': 'primary_structure_only',
                 'type': BOOLEAN,
                 'optional': True
                 },
                {'name': 'start_row',
                 'type': INTEGER,
                 'optional': True,
                 'default': 0
                 },
                {'name': 'num_rows',
                 'type': INTEGER,
                 'optional': True,
                 'default': 2000
                 }
            ]
        },
        'mouse_connectivity_target_spatial': {
            'parameters': [
                {'name': 'seed_point',
                 'type': ARRAY,
                 'array_type': FLOAT,
                 },
                {'name': 'transgenic_lines',
                 'type': ARRAY,
                 'array_type': [INTEGER, STRING],
                 'optional': True
                 },
                {'name': 'section_data_set',
                 'type': INTEGER,
                 'optional': True
                 },
                {'name': 'injection_structures',
                 'type': ARRAY,
                 'array_type': [INTEGER, STRING],
                 'optional': True
                 },
                {'name': 'product_ids',
                 'type': ARRAY,
                 'array_type': [INTEGER],
                 'optional': True
                 },
                {'name': 'primary_structure_only',
                 'type': BOOLEAN,
                 'optional': True
                 },
                {'name': 'start_row',
                 'type': INTEGER,
                 'optional': True,
                 'default': 0
                 },
                {'name': 'num_rows',
                 'type': INTEGER,
                 'optional': True,
                 'default': 2000
                 }
            ]
        },
        'nhp_lmd_microarray_correlation': {
            'parameters': [
                {'name': 'donors',
                 'type': ARRAY,
                 'array_type': INTEGER,
                 'optional': True
                 },
                {'name': 'structures',
                 'type': ARRAY,
                 'array_type': INTEGER,
                 },
                {'name': 'probes',
                 'type': ARRAY,
                 'array_type': INTEGER
                 },
                {'name': 'sort_order',
                 'type': STRING,
                 'optional': True,
                 'values': ['asc', 'desc'],
                 'default': 'desc'
                 },
                {'name': 'start_row',
                 'type': INTEGER,
                 'optional': True,
                 'default': 0
                 },
                {'name': 'num_rows',
                 'type': INTEGER,
                 'optional': True,
                 'default': 2000
                 }
            ]
        },
        'nhp_lmd_microarray_differential': {
            'parameters': [
                {'name': 'donors1',
                 'type': ARRAY,
                 'array_type': INTEGER,
                 'optional': True
                 },
                {'name': 'structures1',
                 'type': ARRAY,
                 'array_type': INTEGER
                 },
                {'name': 'donors2',
                 'type': ARRAY,
                 'array_type': INTEGER,
                 'optional': True
                 },
                {'name': 'structures2',
                 'type': ARRAY,
                 'array_type': INTEGER
                 },
                {'name': 'sort_by',
                 'type': STRING,
                 'optional': True,
                 'values': ['p-value', 'fold-change'],
                 'default': 'p-value'
                 },
                {'name': 'start_row',
                 'type': INTEGER,
                 'optional': True,
                 'default': 0
                 },
                {'name': 'num_rows',
                 'type': INTEGER,
                 'optional': True,
                 'default': 2000
                 }
            ]
        },
        'nhp_lmd_microarray_expression': {
            'parameters': [
                {'name': 'probes',
                 'type': ARRAY,
                 'array_type': INTEGER
                 },
                {'name': 'start_row',
                 'type': INTEGER,
                 'optional': True,
                 'default': 0
                 },
                {'name': 'num_rows',
                 'type': INTEGER,
                 'optional': True,
                 'default': 2000
                 }
            ]
        },
        'nhp_macro_microarray_correlation': {
            'parameters': [
                {'name': 'donors',
                 'type': ARRAY,
                 'array_type': INTEGER,
                 'optional': True
                 },
                {'name': 'structures',
                 'type': ARRAY,
                 'array_type': INTEGER
                 },
                {'name': 'probes',
                 'type': ARRAY,
                 'array_type': INTEGER
                 },
                {'name': 'sort_order',
                 'type': STRING,
                 'optional': True,
                 'values': ['asc', 'desc'],
                 'default': 'desc'
                 },
                {'name': 'start_row',
                 'type': INTEGER,
                 'optional': True,
                 'default': 0
                 },
                {'name': 'num_rows',
                 'type': INTEGER,
                 'optional': True,
                 'default': 2000
                 }
            ]
        },
        'nhp_macro_microarray_differential': {
            'parameters': [
                {'name': 'donors1',
                 'type': ARRAY,
                 'array_type': INTEGER,
                 'optional': True
                 },
                {'name': 'structures1',
                 'type': ARRAY,
                 'array_type': INTEGER
                 },
                {'name': 'donors2',
                 'type': ARRAY,
                 'array_type': INTEGER,
                 'optional': True
                 },
                {'name': 'structures2',
                 'array_type': INTEGER,
                 'type': ARRAY
                 },
                {'name': 'sort_by',
                 'type': STRING,
                 'optional': True,
                 'values': ['p-value', 'fold-change'],
                 'default': 'p-value'
                 },
                {'name': 'start_row',
                 'type': INTEGER,
                 'optional': True,
                 'default': 0
                 },
                {'name': 'num_rows',
                 'type': INTEGER,
                 'optional': True,
                 'default': 2000
                 }
            ]
        },
        'nhp_macro_microarray_expression': {
            'parameters': [
                {'name': 'probes',
                 'type': ARRAY,
                 'array_type': INTEGER
                 },
                {'name': 'start_row',
                 'type': INTEGER,
                 'optional': True,
                 'default': 0
                 },
                {'name': 'num_rows',
                 'type': INTEGER,
                 'optional': True,
                 'default': 2000
                 }
            ]
        },
        'text_search': {
            'parameters': [
                {'name': 'query_string',
                 'type': STRING
                 },
                {'name': 'k',
                 'type': STRING
                 }
            ]
        }
    }
