public ResponseEntity describe()

in java/ws-server/src/main/java/com/epam/deltix/tbwg/webapp/controllers/TimebaseController.java [955:1052]


    public ResponseEntity<SchemaDef> describe(@Valid @RequestBody(required = false) QueryRequest select, Principal user, OutputStream outputStream) {

        if (select == null || StringUtils.isEmpty(select.query))
            //noinspection unchecked
            return new ResponseEntity(HttpStatus.NOT_FOUND);

        SelectionOptions options = getSelectionOption(select);

        LOGGER.log(LogLevel.INFO, "DESCRIBE QUERY (" + select.query + ")");

        DXTickDB connection = service.getConnection();

        if (connection instanceof TickDBClient) {
            ArrayList<Token> tokens = new ArrayList<>();
            ((TickDBClient) connection).compileQuery(select.query, tokens);
        }

        RecordClassSet metaData = new RecordClassSet();

        if (select.query.toLowerCase().trim().startsWith("select")) {
            InstrumentMessageSource source = connection.executeQuery(
                    select.query, options, null, null, select.getStartTime(Long.MIN_VALUE));

            // hack for now
            String stream = null;

            String[] words = select.query.split(" ");
            for (int i = 0; i < words.length; i++) {
                String word = words[i];
                if ("from".equalsIgnoreCase(word)) {
                    stream = words[i + 1];
                    if (stream.startsWith("\""))
                        stream = stream.replace("\"", "");
                    break;
                }
            }

            DXTickStream tickStream = this.service.getStream(stream);

            if (select.query.contains("*") && tickStream != null) {
                metaData = tickStream.getStreamOptions().getMetaData();
            } else {
                if (source.next()) {
                    RawMessage message = (RawMessage) source.getMessage();
                    metaData.addContentClasses(message.type);
                }
            }

        } else {
            // drop or create stream statements
            metaData.addContentClasses(Messages.ERROR_MESSAGE_DESCRIPTOR);
        }

        RecordClassDescriptor[] top = metaData.getContentClasses();
        ClassDescriptor[] classes = metaData.getClasses();

        SchemaDef schema = new SchemaDef();

        schema.types = new TypeDef[top.length];
        for (int i = 0; i < schema.types.length; i++) {

            RecordClassDescriptor rcd = top[i];
            List<FieldDef> fields = new ArrayList<FieldDef>();

            RecordLayout layout = new RecordLayout(rcd);
            toSimple(layout.getNonStaticFields(), fields);
            toSimple(layout.getStaticFields(), fields);

            schema.types[i] = new TypeDef(rcd.getName(), rcd.getTitle(), fields.toArray(new FieldDef[fields.size()]));
            ColumnsManager.applyDefaults(schema.types[i]);
        }

        schema.all = new TypeDef[classes.length];
        for (int i = 0; i < classes.length; i++) {

            List<FieldDef> fields = new ArrayList<FieldDef>();

            ClassDescriptor descriptor = classes[i];

            if (descriptor instanceof RecordClassDescriptor) {
                RecordLayout layout = new RecordLayout((RecordClassDescriptor) descriptor);
                toSimple(layout.getNonStaticFields(), fields);
                toSimple(layout.getStaticFields(), fields);
            } else if (descriptor instanceof EnumClassDescriptor) {
                EnumValue[] values = ((EnumClassDescriptor) descriptor).getValues();

                for (EnumValue v : values)
                    fields.add(new FieldDef(v.symbol, v.symbol, "VARCHAR", false));
            }

            schema.all[i] = new TypeDef(descriptor.getName(), descriptor.getTitle(), fields.toArray(new FieldDef[fields.size()]));
            schema.all[i].isEnum = descriptor instanceof EnumClassDescriptor;

            ColumnsManager.applyDefaults(schema.all[i]);
        }

        return ResponseEntity.ok().body(schema);
    }