def make_computed_fields(self, json_cmd):
        print('Adding computed fields')
        cmd = json.loads(json_cmd)
        array_url = cmd.get('input', self.base_url + self.array_name)
        if not array_url.startswith(self.base_url):
            raise RuntimeError('Input array must start with the base url')
        array_name = array_url[len(self.base_url):]
        fields = cmd['fields']
        replace_undim = cmd.get('replace_undim', 0)
        fnname = cmd.get('fnname', None)

        arr = self.get_session_array(array_name).ddesc.dynd_arr()

        res = nd.make_computed_fields(arr, replace_undim, fields, fnname)
        defarr = self.array_provider.create_deferred_array_filename(
                        self.session_name, 'computed_fields_', array(res))
        dshape = nd.dshape_of(res)
        defarr[0].write(json.dumps({
                'dshape': dshape,
                'command': 'make_computed_fields',
                'params': {
                    'fields': fields,
                    'replace_undim': replace_undim,
                    'fnname': fnname
                }
            }))
        defarr[0].close()
        content_type = 'application/json; charset=utf-8'
        body = json.dumps({
                'session': self.base_url + self.session_name,
                'output': self.base_url + defarr[1],
                'dshape': dshape
            })
        return (content_type, body)
    def make_computed_fields(self, json_cmd):
        print('Adding computed fields')
        cmd = json.loads(json_cmd)
        array_url = cmd.get('input', self.base_url + self.array_name)
        if not array_url.startswith(self.base_url):
            raise RuntimeError('Input array must start with the base url')
        array_name = array_url[len(self.base_url):]
        fields = cmd['fields']
        replace_undim = cmd.get('replace_undim', 0)
        fnname = cmd.get('fnname', None)

        arr = self.get_session_array(array_name).ddesc.dynd_arr()

        res = nd.make_computed_fields(arr, replace_undim, fields, fnname)
        defarr = self.array_provider.create_deferred_array_filename(
            self.session_name, 'computed_fields_', array(res))
        dshape = nd.dshape_of(res)
        defarr[0].write(
            json.dumps({
                'dshape': dshape,
                'command': 'make_computed_fields',
                'params': {
                    'fields': fields,
                    'replace_undim': replace_undim,
                    'fnname': fnname
                }
            }))
        defarr[0].close()
        content_type = 'application/json; charset=utf-8'
        body = json.dumps({
            'session': self.base_url + self.session_name,
            'output': self.base_url + defarr[1],
            'dshape': dshape
        })
        return (content_type, body)
 def test_aggregate(self):
     a = nd.array([
         ('A', 1, 2),
         ('A', 3, 4),
         ('B', 1.5, 2.5),
         ('A', 0.5, 9),
         ('C', 1, 5),
         ('B', 2, 2)],
         dtype='c{cat: string, x: float32, y: float32}')
     gb = nd.groupby(a, nd.fields(a, 'cat')).eval()
     b = nd.make_computed_fields(gb, 1,
             fields=[('sum_x', ndt.float32, 'sum(x)'),
                     ('mean_y', ndt.float32, 'mean(y)'),
                     ('max_x', ndt.float32, 'max(x)'),
                     ('max_y', ndt.float32, 'max(y)')])
     self.assertEqual(nd.as_py(b.sum_x), [4.5, 3.5, 1])
     self.assertEqual(nd.as_py(b.mean_y), [5, 2.25, 5])
     self.assertEqual(nd.as_py(b.max_x), [3, 2, 1])
     self.assertEqual(nd.as_py(b.max_y), [9, 2.5, 5])