Таблицы данных
Таблица данных является неиндексируемым упорядоченным массивом объектов, которые демонстрируют одинаковые свойства. Таблицы данных могут быть представлены на любом языке программирования. Таблицы данных в ThingWorx Platform обычно используются в реализациях JavaScript и могут использоваться для представления входных и выходных значений для сервисов. Пакеты ThingWorx Edge SDK поддерживают таблицы данных.
Так как таблицы данных являются массивом объектов, их можно рассматривать как электронные таблицы, в которых элементы массива являются строками, а свойства каждого объекта в массиве являются столбцами. При использовании таблиц данных в пользовательском сервисе или приложении важно, чтобы у каждого объекта имелись одинаковые свойства для сопоставления каждого столбца таблицы со значением свойства.
Как работают массивы в JavaScript?
ThingWorx позволяет использовать JavaScript для создания пользовательских сервисов с помощью таблиц данных для входных и выходных данных. Массивы работают в ThingWorx так же, как в JavaScript. В этом разделе приводятся основные сведения о работе с массивами.
Для объявления массива можно использовать следующие операторы.

var myArray=new Array();
var mySecondArray=[];
Оба приведенных выше оператора эквивалентны. Они оба создают объекты массива. Массив может содержать несколько объектов в последовательности любого типа. Например:
var myArrayOfStuff=[“Pickel”,3,{name:”Bill”,phone:”555-555-1212”}];
Приведенный выше массив содержит строку, число и пользовательский объект с полями name и phone. Чтобы проверить это, используйте браузер Chrome и откройте консоль JavaScript (CTRL+SHIFT+J). Затем вставьте приведенную выше строку, чтобы создать массив, и выполните следующие примеры, чтобы получить доступ к элементам массива. Ниже приведен снимок экрана консоли JavaScript в Chrome, показывающий, как создать каждый из объектов и получить доступ к нему в массиве JavaScript.
В строке 2 выше значение undefined не является ошибкой. Хотя объявление переменной в локальной контекстной области (var) возвращает в результате неопределенный объект, при этом создается переменная.
Чем таблица данных отличается от массива?
В приведенном выше примере массив JavaScript содержит совершенно разные типы объектов. Таблицы данных могут содержать только один тип объекта. Этот тип определяется не с помощью собственного механизма типизации объектов JavaScript, а с помощью другого конкретного определения типов ThingWorx, которое называется структурой данных. JavaScript рассматривает каждый тип объекта, который хранится в таблице данных, как тип Object, что можно видеть выше, когда команда myArrayOfStuff[2] выводится на печать. Таблицы данных требуют, чтобы каждый объект в массиве предоставлял одни и те же свойства.
Что такое структура данных?
Структура данных является спецификацией требуемых имен свойств и типов возврата, которые должны добавляться в таблицу данных в каждое свойство объекта. Структуры данных также содержат другие метаданные: свойства, которые полезны для форматирования и отображения таблицы данных в формате таблицы или сетки. Можно объявлять структуры данных в приложении ThingWorx Edge SDK и в ThingWorx Composer. Структуры данных требуются для построения функциональной таблицы данных. Фактически они являются механизмом схемы для определения обязательных полей вещи в ThingWorx. Дополнительные сведения о структурах данных см. в разделе Структуры данных.
* 
Таблицы данных не принимают основной ключ резервной структуры данных. Используйте таблицу данных для хранения уникальных данных и добавления структуры данных с основным ключом.
Использование таблицы данных с сервисом
Пакет ThingWorx Edge Java SDK содержит инструменты для построения таблиц данных, необходимых для вызова сервисов. Этот пакет SDK предоставляет основу для демонстрации возможностей использования таблицы данных с сервисом. Обратите внимание, что INFOTABLE является одним из базовых типов ThingWorx. В частности, это агрегированный базовый тип.
Сервисы имеют аргументы и возвращаемые значения, выраженные с помощью элементарных типов, таких как строка, целое число, число и логическое значение. Таблицу данных можно использовать для описания набора аргументов сервиса. Параметры и возвращаемые значения сервиса могут быть переданы и получены как таблицы данных, содержащие одну или несколько строк.
При использовании в приложении ThingWorx Edge Java SDK в таблице данных имеется элемент DataShapeDefinition, описывающий имена, базовые типы и дополнительную информацию о каждом поле в таблице. Данные в таблице данных содержатся в строках. Каждая строка может содержать одно или несколько полей, описанных в элементе DataShapeDefinition таблицы данных. Ниже приведен пример определения таблицы данных с ее структурой данных и строками:
В дополнение к использованию таблиц данных с сервисами можно использовать таблицы данных для хранения данных для события или значений, возвращаемых запросом на чтение для нескольких свойств. Таблица данных может содержать одну или несколько строк. При возвращении результатов необходимо извлечь значения из каждой строки, используя методы Java SDK getFirstRow(), getSecondRow() и т. д. Также используется вспомогательная функция, соответствующая базовому типу поля, например getStringValue().
Рекомендации по работе с таблицами данных см. в разделе Работа с таблицами данных.
Ниже приведен пример использования таблицы данных для возвращения результатов чтения свойства:
// Define result as an InfoTable
InfoTable result
// Reading the "name" property of a Thing and
// extracting the results from an InfoTable
// Since "name" is a STRING, use getStringValue()
// to return the value of the "name" property.
result = client.readProperty(ThingworxEntityTypes.Things,
ThingName, "name", 10000);
String name = result.getFirstRow().getStringValue("name");
Дополнительные сведения о работе со структурами данных и таблицами данных с ThingWorx Edge Java SDK см. в разделе https://support.ptc.com/help/thingworx/edge_sdk_java/en/java_sdk/c_javasdk_infotables.html#.
Ссылка на свойство таблицы данных в пользовательском сервисе
Существует два способа доступа к свойству таблицы данных с помощью ключевого слова "me". Первым вариантом является использование метода, который позволяет использовать прямую ссылку на объект в свойстве таблицы данных. Второй способ заключается в использовании метода, который ссылается только на значение. Важно понимать различия, чтобы избежать повреждения данных, которое может быть результатом выполнения прямой привязки. В этом разделе описаны обе возможности.
* 
При наличии других интерфейсов API, которые можно использовать для получения значения свойства в пользовательском сервисе, целью этого раздела является описание действий при использовании ключевого слова me.
Первый метод допускает использование прямой ссылки на объект в этом свойстве таблицы данных. Любые изменения, внесенные в строку, будут отражены непосредственно в этом свойстве. Любые изменения, внесенные в поле, будут ограничены и должны выполняться с помощью другого метода, явно изменяющего структуру данных, на которую ссылается свойство таблицы данных. Прямая ссылка на объект может быть выполнена, как в следующем примере:
// Get a direct reference to the infoTableProperty on the entity
var infoTableProperty = me.infoTableProperty;
// Create a new NamedVTQ entry object to add to the infotable
var newEntry = new Object();
newEntry.name = "TemperatureReading"; // STRING [Primary Key]
newEntry.time = Date.now(); // DATETIME
newEntry.value = 98.6; // VARIANT
newEntry.quality = "GOOD"; // STRING
// Add the newEntry object as a new row to the infotable property
infoTableProperty.AddRow(newEntry);
// At this point, the property on the entity has a new row added to it
Свойство с именем infoTableProperty для вещи будет назначено непосредственно переменной tempTable. Любые изменения, внесенные в tempTable, будут снова отражаться в infoTableProperty. Следует помнить, что если несколько сервисов, обращающихся к этому свойству, выполняются одновременно, то результаты могут быть неожиданными при просмотре этого свойства таблицы данных. Самым безопасным способом изменить свойство таблицы данных, чтобы гарантировать, что значение свойства будет задано равным ожидаемому значению, является второй метод.
Второй метод ссылается только на значение, а не на фактический объект свойства. При ссылке только на значение все изменения, внесенные в строки или поля, будут приниматься, но не будут отражаться непосредственно в свойстве. Ссылку только на значение свойства таблицы данных можно выполнить с помощью API-сервиса Clone:
var params = {
t1: me.infoTableProperty /* INFOTABLE */
};
// result: INFOTABLE
var infoTableProperty = Resources["InfoTableFunctions"].Clone(params);
// NamedVTQ entry object
var newEntry = new Object();
newEntry.name = "TemperatureReading"; // STRING [Primary Key]
newEntry.time = Date.now(); // DATETIME
newEntry.value = 98.6; // VARIANT
newEntry.quality = "GOOD"; // STRING
// Add the newEntry object as a new row to the infotable property
infoTableProperty.AddRow(newEntry);
// At this point, you'll need to set the cloned table back to the infoTableProperty on the entity if you want the row to be added
me.infoTableProperty = infoTableProperty;
// Can also return the clone if desired
var result = infoTableProperty;
Использование базовых типов VEC
При использовании свойств с базовым типом VEC2, VEC3 или VEC4 нельзя задавать значения координат в пользовательском сервисе с помощью методов setX() или setY(). Чтобы задать значения координат, необходимо задать JSON как значение свойства, например {"x": 2, "y": 4}. Нельзя использовать точечную нотацию, например .x = 2 или .y = 4.
Сохранение свойств таблицы данных
Свойства, определенные как таблицы данных, могут сохраняться в ThingWorx. Однако настоятельно рекомендуется сохранять только те свойства таблицы данных, которые необходимы приложению. ThingWorx позволяет приложению сохранять свойства таблицы данных без ограничений, что приводит к чрезмерному использованию памяти и сбоям системы. Поскольку сохраненные свойства загружаются в память из базы данных при запуске, перезапуск ThingWorx без удаления данных из базы данных вручную становится невозможным.
Для очистки свойств таблицы данных вручную администратор базы данных должен удалить значения сохраняемых свойств таблицы данных из базы данных в хранилище данных. Это приводит к потере данных и увеличению времени простоя.
Чрезмерное потребление памяти может возникнуть, если отдельные сохраняемые свойства таблицы данных становятся слишком большими и занимают много памяти либо если множество меньших сохраняемых свойств таблицы данных или их комбинация в совокупности потребляют большие объемы памяти. Это приводит к нехватке системной памяти, что становится причиной сбоев.
Чтобы помочь администраторам и операторам ThingWorx отслеживать и контролировать объем памяти, потребляемый сохраняемыми свойствами таблицы данных, в ThingWorx добавлена возможность создавать записи журнала, параметры и предупреждения.
Чтобы свести к минимуму влияние на производительность системы, память, выделенная для сохраняемых свойств таблицы данных, рассчитывается на основе расписания. Включение и конфигурирование расписания задается в подсистеме платформы на странице Конфигурация в разделе "Сохраняемые таблицы данных" в "Мониторе использования памяти". Расписание задается с помощью измененного выражения CRON, которое использует компонент времени. По умолчанию это включено, и задается выполнение каждые 45 минут. Можно задать пороговое значение, чтобы сконфигурировать процент памяти JVM, при превышении которого будет начинаться генерация сообщений с предупреждением в журнале приложения.
Параметры можно читать из конечной точки metrics. В среде высокой доступности (HA) параметры объединяются и доступны в конечной точке параметров.
В среде высокой доступности (HA) накопление данных и отчетность выполняются на одиночном (ведущем) сервере. Если первоначальный одиночный сервер не работает, новый одиночный сервер возьмет на себя агрегацию параметров.
* 
При конфигурировании свойства вещи для сохранения таблицы данных отображается предупреждающее сообщение. Дополнительные сведения см. в разделе Базовые типы свойств.
GetPersistedInfoTableSizes
Чтобы помочь администраторам в мониторинге и управлении использованием памяти таблицы данных, был создан новый API-интерфейс GetPersistedInfoTableSizes. GetPersistedInfoTableSizes возвращает число (N) сущностей, использующих наибольший объем памяти. N является конфигурируемым.
Было ли это полезно?