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);
}