TDC222 | У <pool> нет name или нет count | Пул читается по имени и держит фиксированное число членов: <pool name="Doctors" count="30"> |
TDC223 | <pool count="…"> — не целое число не меньше 1 | Из пула, в котором ничего нет, нечего выдавать |
TDC224 | <gen type="pool" value="X">, а пула <pool name="X"> нет | В сообщении перечислены объявленные пулы. Объявите его в том же <env> |
TDC225 | filter="field == X", где обе стороны не могут совпасть ни на одном значении | Оба списка написаны в конфиге, и они не пересекаются — значит каждая строка сужается до пустоты. Сообщение называет оба. Здесь докладывается только заведомое противоречие; редкое значение отвергается на той строке, где выпало |
TDC226 | filter= читает Pool.field, а такого поля у пула нет | В сообщении перечислены поля пула. Неуточнённое незнакомое имя не трогают — язык выражений читает голое слово как литерал |
TDC229 | ${{Ref}}, где Ref разыгрывает целого члена | Член — это запись, а не значение. Читайте поле: ${{Ref.lastName}} |
TDC230 | <block>, тег обрамления или ещё один <pool> внутри <pool> | Пул — это таблица, которую читают другие столбцы, а не то, что пишется в файл; и пулы не вкладываются |
TDC231 | (предупреждение) <pool>, который не читает ни один <gen type="pool"> | Он строится целиком до первой строки и держится в памяти весь прогон, так что непрочитанный оплачен и выброшен. Прочитайте его или уберите |
TDC232 | Имя в filter= является и полем пула, и последовательностью | Переименуйте одно из них. Уточнение одной стороны не помогает — второе имя всё равно читается как поле члена, и сравнение выйдет с самим собой |
TDC234 | (предупреждение) Больше 100 000 членов | Пул держится в памяти весь прогон — около 320 байт на члена с четырьмя полями. Если имелось в виду число СТРОК, это count у <env> |
TDC235 | Больше 1 000 000 членов | Причина та же, но уже за гранью разумного прогона. Уменьшите пул или перенесите число в <env count="…"> |
TDC236 | Пул читает пул, объявленный ниже, или сам себя | Пулы строятся в порядке объявления, поэтому пул может читать только те пулы, что выше. Поднимите тот, который он читает. Из-за этого же порядка цикл между пулами записать нельзя |
TDC241 | Два пула объявлены под одним именем | Пул берут по имени, поэтому двум одно имя не подходит. Раньше второй молча заменял первый, и единственным следом был TDC193 в блоке про поле, которого «нет» |
TDC242 | anomaly или missing — не число в [0, 1] | Оба задают ДОЛЮ значений: anomaly="0.05", missing="0.1" |
TDC243 | anomaly на списке value, где нет ни одного числа | Аномалия умножает число, поэтому список слов вернётся неизменным |
TDC246 | anomaly_flag на <gen> внутри <case> | Тело ветки — это склейка частей, поэтому флаг на одной части не описывает строку: ставьте flag="ИМЯ" на сам <mix> |
TDC247 | step у <gen type="date"> не является шагом, которым можно идти, либо смешивает календарную единицу с фиксированной | Пишите 15m, 1h30m, 2d, 3mo, 1y — единицы s, m, h, d, w, mo, y; голое число означает дни |
TDC248 | step без order="sequential" на том же <gen> | Диапазон никто не обходит — даты по-прежнему берутся случайно. Добавьте order="sequential" или уберите step |
TDC249 | weekdays называет несуществующий день недели | sun, mon, tue, wed, thu, fri, sat — диапазон mon..fri или перечисление sun,wed |
TDC250 | weekdays при шаге в целое число недель или при календарном шаге | Две причины под одним кодом. Целое число недель фиксирует день недели, поэтому фильтр совпал бы со всеми строками или ни с одной. Календарный шаг делает обратное — 1mo идёт четверг, воскресенье, воскресенье, среда, — поэтому какие строки уцелеют, решал бы календарь, а не конфиг |
TDC252 | peak_at у <gen type="timeseries"> не число | peak_at — это строка, на которой пикует сезонная волна, и считается она как period: peak_at="182" при period="365" ставит пик на первое июля |
TDC253 | peak_at без period на том же <gen> | У волны сначала должна быть длина, и только потом — высшая точка. Добавьте period или уберите peak_at |
TDC251 | (предупреждение) Доля percent просит меньше одной целой строки | percent — это точная квота по строкам, которые до неё доходят, поэтому 10 % от подмножества в пять строк просят половину записи. Половину записи выдать нельзя: ветка сработает один раз или ни разу, и решает это seed. Поднимите долю или count |
TDC254 | Ход без шага: диапазонный repeat="2..5" рядом с order="sequential" или идущая по порядку date с любым repeat= | Фиксированный repeat="4" работает — строка берёт с хода четыре значения. У диапазонного нет постоянного числа значений на строку, поэтому строка 5 начиналась бы там, где случайно закончили строки 0–4. А идущая по порядку дата несёт рядом с текстом момент времени, и у строки с несколькими датами нет одного момента, который можно отдать of= и plus= |
TDC255 | decimals= вместе с include= или exclude= | Уберите одно. Набор, собранный через include/exclude, состоит из целых, и выбор равномерен по ним — округлять нечего, движок молча выдавал целые |
TDC256 | Маска без шаблона — <mask> без pattern= или ${{X|mask}} без аргумента | Задайте шаблон. Без него маска не оставляет ничего и возвращает пустую строку — колонка выходит пустой |
TDC257 | Выражение if= вызывает функцию, которой нет | Либо опечатка — тогда рядом стоит близкое имя, — либо одна из sin, cos, exp, log и им подобных: у них ответ с причиной, потому что каждый язык считает их чуть по-разному, а сравнение превращает последний бит в другую строку. Сегодня есть: abs, ceil, floor, max, min, round, trunc |
TDC258 | Функции в выражении if= дали не столько аргументов | abs, ceil, floor, round и trunc берут ровно один; min и max — сколько дадите |
TDC259 | Список […] стоит не справа от in | Список — это набор значений для проверки, поэтому он что-то значит только в виде Country in [US, CA, MX]. Сам по себе он не даёт условию никакого значения |
TDC260 | В at() передан не список | Список из repeat приходит в выражение склеенным текстом, поэтому at(Items, 1) просит второй элемент списка из одного и отвечает пустотой. Сначала разрежьте: at(split(Items, ","), 1) |
TDC261 | В at() передан индекс, который индексом не является | Индекс — целое число, ноль или больше. За концом списка пусто намеренно: строки из repeat="1..4" разной длины. А -1, 1.5 и "one" — ошибки, и каждая из них раньше давала ту же пустую колонку |
TDC262 | <gen type="stat"> не говорит, что считать (of=) или какую статистику (op=), либо называет несуществующую | Статистика читает чужую колонку и ничего не тянет сама, поэтому нужны оба. op= — одно из sum, mean, median, min, max, count, stddev; decimals= — от 0 до 10 |
TDC263 | ${{Name}} в атрибуте, который его не раскрывает | Интерполяция доходит до текста внутри <data> и до <gen type="template" value=>, и больше никуда — везде ещё скобки остаются буквальными символами. Чтобы одна колонка зависела от другой, прочтите её в условии if= или соберите значение в <compute> |
TDC264 | <gen type="date" of="…"> записан неверно | Смещению нужен plus= (7d, 3..10d, 1..3mo, -10..-3d), меньшая граница пишется первой, единицы те же, что у step=. Атрибуты, задающие СОБСТВЕННЫЙ жребий генератора — value, from, to, range, oldest, youngest, order, step — ничего не значат, когда of= уже поставил дату относительно другой колонки, поэтому они отвергаются, а не игнорируются. Зеркальный случай тоже отвергается: plus= у даты без of= не от чего отмерять |
TDC265 | У <assert> нет условия | Утверждение — единственная конструкция, вся ценность которой в том, что оно ПАДАЕТ, а без that= оно не может упасть никогда. Опишите свойство, которым запуск обязан обладать, на языке if=, над колонками, одинаковыми для всего запуска |
TDC266 | У <assert> нет сообщения | says= — это то, что читатель увидит месяцы спустя в CI-логе. Одно выражение оставляет ему самому догадываться, что оно защищало |
TDC267 | (второе значение) uniq="true" на <sequence>, внутри которой <distinct> | <distinct> чинит одну запись, чтобы её поля различались; uniq затем перетасовывает готовые колонки и не знает, какие пары были запрещены, — починка отменяется. Оставьте что-то одно — или дайте каждому полю свою <sequence>, оберните их в <uniq>, а <distinct> поставьте на уровне env |
TDC267 | uniq="true" вместе с mask=, case=, missing=, repeat=, separator= или anomaly= | Выбор без возвращения строит колонку напрямую и не доходит до слоя, который переписывает значения, — атрибут мог только пропасть. Применить его значило бы сломать другое обещание: маска сводит два разных значения к одним и тем же символам |
TDC268 | if= на <gen type="pool"> | Ссылка публикует целую ЗАПИСЬ, а <gen> с if= становится условной веткой, которую резолвер пула не узнаёт, — ни одна колонка Ref.field не регистрировалась, и ${{Ref.name}} попадал в вывод собственным текстом. Чтобы оставить строки без записи, используйте parent= |
TDC269 | if= на <gen> внутри <case> | Тело ветки — это несколько частей, склеенных в одно значение, поэтому у условия на одной части нет значения, к которому откатиться. Раньше атрибут принимался и игнорировался, и часть появлялась на каждой строке — включая те, которые условие исключало. Ставьте условие на ветку: <case if="…"> |
TDC270 | В <tdc> второй <env> или <block> | Оба читаются как ПЕРВЫЙ в своём роде, поэтому второй выбрасывается целиком — вместе со всеми объявленными в нём последовательностями и строками, — а прогон завершается как ни в чём не бывало. Ошибка ставится на втором |
TDC271 | percent= рядом с order="sequential" | Обход списка по порядку жёстко задаёт, какое значение достанется строке, — распределять доли уже негде. Проценты принимались и выбрасывались: percent="98,1,1" на сотне строк давал 34 / 33 / 33 |
TDC272 | (предупреждение) <env local=…> называет локаль без переводов дат | Локаль — хороший источник ИМЁН, но названий месяцев не содержит, поэтому даты выйдут по-английски. На <gen type="date" local=…> это отвергается (TDC153), а здесь до сих пор молчало. Срабатывает только если формат читает локаль: format="YYYY-MM-DD" одинаков на всех языках |
TDC273 | аргумент фильтра, которым фильтр не может воспользоваться | slice:5,2 кончается раньше, чем начинается, и опустошает колонку; slice:abc, group:abc, group:0, compact:1 и compact:99 оставляют значение нетронутым. group и compact БЕЗ аргумента сохраняют документированные значения по умолчанию (3, основание 36) |
TDC274 | аргумент у фильтра, который его не читает | trim, sql, upper, lower, capitalize и title — целые преобразования; ${{X|trim:junk}} молча игнорировал junk. Соединяйте цепочкой: ${{X|trim|upper}} |
TDC275 | replace, которому нечего искать | ${{X|replace}} и ${{X|replace:,to}} не меняют вообще ничего. Пишите обе части: ${{X|replace:from,to}} |
TDC276 | зафиксированный параметр пакета не той длины | У идентификатора с контрольной цифрой жёсткая раскладка, поэтому часть другой длины её ломает, а не сдвигает. usa.finance.aba_routing prefix="12345" ронял запуск; tail="678" писал шестизначное «не число». Сообщается только там, где длину можно ДОКАЗАТЬ по телу самого пакета |
TDC277 | decimals=, которому нечего округлять | Без value= генератор выдаёт строку ЦИФР — идентификатор, — и округлять там нечего. <gen type="number" length="4" decimals="2"/> выдавал 4566, 5773, 5192 |
TDC278 | decimals= рядом с length= | У дробного значения нет целой ширины, до которой можно дополнить, поэтому отбрасывался как раз length=: value="1..9" length="3" decimals="2" выдавал 3.78, 2.89 |
TDC279 | first_zero="false", который диапазон не может выполнить | Любое значение из 0..5 — одна цифра, поэтому трёхзначная запись всегда дополняется нулями. Генератор перебрасывал по сто раз на строку и всё равно выдавал запрещённую форму: 005, 002, 003. Сообщается только там, где это ДОКАЗУЕМО по диапазону |
TDC280 | две записи одного диапазона дат | value=, пара from/to и range= говорят одно и то же, а генератор читает их в этом порядке и останавливается. value="2020-05-05" from="1990-01-01" to="1990-12-31" выдавал 1990-05-11 и молча выбрасывал остальное. value="today", "now" и "birth" — тоже записи диапазона |
TDC281 | диапазон дат кончается раньше, чем начинается | Розыгрыш брал минимум и максимум двух концов, поэтому from="2020-01-01" to="2010-01-01" выдавал вполне правдоподобные даты из диапазона, которого никто не писал. plus="10..3d" отвергается как опечатка, а не меняется местами, с самого начала; здесь та же опечатка |
TDC282 | order="sequential" только у части участников связки row= | Либо поставьте order="sequential" всем участникам, либо снимите — в смешанной связке они перестают читать одну строку на запись |
TDC283 | anomaly_flag у <gen>, который лишь одна из частей своей <sequence> | Флаг отмечает, В КАКИХ СТРОКАХ появился выброс, а последовательности, собранной из нескольких частей — второго <gen>, литерала <data> или name=, который делает этот <gen> полем, — некуда положить такую колонку. Вынесите <gen> в отдельную <sequence>: заодно получите и само значение отдельной колонкой. Та же причина, что у TDC246, только уровнем выше |
TDC284 | (предупреждение) secret= записан прямо в конфигурацию, либо пуст | Ключ внутри конфигурации едет всюду, куда едет она сама, — в систему контроля версий в том числе. secret="env:TDC_HTTP_SECRET" читает его из окружения, secret="file:~/.tdc/service.key" — из файла, которого нет в репозитории. Литерал даёт ПРЕДУПРЕЖДЕНИЕ: сервис на 127.0.0.1 на один вечер — вполне живой случай; secret="" — ошибка, потому что подпись без ключа подделает кто угодно |
TDC285 | Значение атрибута рисунка — не одно из его слов и не число | mode=, interp=, spread= и decimals= читались только во время прогона, поэтому check называл mode="banana" годным, а прогон отказывал — единственное место, где check не отвечал на вопрос «запустится ли это». Допустимо: `mode="signal |
TDC286 | <is_digit> или <encode> получил <field name="_count"> или <field name="_total"> | Эти два поля приходят ЧИСЛАМИ, а обоим тегам нужен один символ текста. <is_digit> отвечал «нет» на каждой строке — включая строки, где счётчик и есть одна цифра, — и check молчал; <encode> обрывал прогон сообщением «expected a single-character string» без файла и строки, на конфиге, который check тоже назвал годным. Сравнивайте само число через <equals> или <less_than>, для <encode> оберните в <concat>, либо кладите нужный символ в <str> |
TDC287 | <equals>, <greater_than> или <less_than> получил литерал <str>, который не число | Все три сравнения работают с числами. Строка из цифр читается как число, которое она пишет — <equals><str v="7"/><int v="7"/></equals> истинно, — поэтому отказ приходит только на литерал, который числом не является. Раньше такой обрывал прогон сообщением «expected an integer in <equals>, got the string …» без файла и строки, на конфиге, который check назвал годным. Проверяются только литералы: что окажется в <field>, до прогона неизвестно |
TDC288 | <var> — тег переименован в <use> | Он никогда ничего не объявлял: <let> связывает имя, а этот читает его обратно — о чём новое имя и говорит. Без отдельного отказа старое написание проваливалось в «неизвестный тег compute», а это сообщает, что написано неверно, но не что писать. Атрибут name= не изменился |
TDC289 | distinct= получил не true и не false | У атрибута два написания и никакого третьего смысла. Считать незнакомое слово за false — значит оставить конфиг, который просит разные значения и молча получает повторы |
TDC290 | distinct= без repeat= | Одно значение не может повториться само с собой, поэтому атрибут был бы прочитан и ничего не сделал. Добавьте repeat="N" или repeat="A..B", либо уберите distinct= |
TDC291 | percent= и distinct= на одном <gen> | percent= обещает точные доли на весь прогон; distinct= меняет это обещание на гарантию внутри строки. Оба сразу не держатся, поэтому ни одно не отбрасывается молча. Доли по ДЛИНАМ списков ставьте на <mix> или <switch> снаружи, а repeat= — на <gen> внутри |
TDC292 | repeat= под distinct= просит больше значений, чем есть в списке | Из пяти значений не выйдет шесть разных. Сообщается до запуска, если пул виден в конфиге (type="text", целочисленный диапазон, односимвольный набор symbol); на запуске, если не виден (файл пакета, колонка CSV, regex) — они читаются только во время генерации |
TDC293 | <gen type="pattern"> без y_range= | У рисунка нет собственного масштаба — одна и та же кривая выходит из одного редактора в координатах 0..100, из другого 0..10002345345. y_range="min..max" говорит, что эти координаты значат: он становится полом и потолком холста рисунка. Без него любой ответ был бы догадкой о чужих настройках экспорта, поэтому атрибут обязателен, а не подразумевается |
TDC294 | <gen type="formula"> без expr=, либо expr=, который не разбирается, либо decimals= вне 0..10 | Формула И ЕСТЬ своё выражение, так что без него вычислять нечего. Выражение — тот же язык, что у if=, см. Выражения. Имя внутри него, не являющееся колонкой, объявленной выше, даёт TDC240 — тот же код, что у running и stat на то же правило |
TDC295 | if= на колонке running, stat, formula или смещении даты | Они строятся один раз, на весь прогон, в порядке объявления — а if= просит значение, выбираемое построчно; одновременно верным быть не может. Ставьте условие туда, где значение ИСПОЛЬЗУЕТСЯ (<data if="…">), либо считайте колонку безусловно и ветвитесь по ней потом |
TDC296 | Колонка running, stat, formula, дата от другой даты или <compute> внутри <uniq> или <distinct> | Группа ПЕРЕСТАВЛЯЕТ готовые колонки, пока записи не станут уникальными. Разыгранное значение означает одно и то же, куда бы ни попало; вычисленное описывает ту строку, для которой посчитано, — переставили, и арифметика стала неверной. Оберните группой те колонки, которые эта читает, а вычисленную оставьте снаружи: она пойдёт за тем, что расставит группа |
TDC297 | Два способа читать один файл сразу — read="quantile" рядом с weight=, row= или order="sequential"; опечатка в read=; sample= без него | weight= держит доли во второй колонке, row= связывает несколько колонок с одной СТРОКОЙ файла, order="sequential" идёт по списку по порядку, а read="quantile" говорит, что значения И ЕСТЬ распределение и строка попадает в любую точку отсортированной выборки. Оставьте одно чтение: считаемому нужен weight= с его точной квотой, измеряемому — квантильное |
TDC298 | Один ключ row= над двумя разными файлами | Связка — это одна СТРОКА одного файла, поэтому строки, принадлежащей обоим, не существует. Направьте всех участников связки на один src= или дайте этому свой ключ row= |
TDC299 | (предупреждение) uniq="true" более чем на 100 000 строк | Обещание про готовую колонку стоит памяти, которая растёт вместе с count, — на любом движке: цена принадлежит обещанию, а не какому-то одному из них. Около 250 байт на значение, измерено: 2 000 000 строк стоят примерно 477 МБ, а составной uniq — ещё больше. Одиночная выбираемая колонка платит дважды: выбор без возврата нельзя сделать построчно, поэтому она вдобавок идёт в памяти, что бы ни просил mode=. Работает; просто стоит делать это осознанно |
TDC300 | fit=, который не полоса, идёт на убывание или стоит рядом с points=/upper=/lower= | fit="низ..верх" говорит, во что превращаются собственные нижняя и верхняя точки рисунка на оси значений, — так кривая из src= получает своё место, ведь файл несёт форму и не несёт единиц. Два числа, меньшее первым; перевернуть рисунок вверх ногами — это другая просьба. Рядом с набранными точками атрибут отклоняется: 80 там уже означает 80% от y_range, и размещать больше нечего. Уберите его — и рисунок займёт весь y_range |
TDC301 | (предупреждение) Список долей оставляет объявленное значение с 0% | percent короче value — это нормально: остаток достаётся тем позициям, которые вы не написали, поэтому value="a,b,c" percent="30,40" отдаёт c оставшиеся 30. Но когда написанные доли уже дают 100, остатка нет, и значение объявлено, а выпасть не может: percent="50,50" на 300 строках дал 150 a, 150 b и ни одного c. Ноль, написанный вами самими — percent="50,0,50" — принимается как есть и молчит |
TDC302 | <distinct> или <uniq> над ссылками <gen type="pool"> в форме, которая ничего не значит: ссылка рядом с обычной последовательностью, ссылки на два разных пула, ссылок больше, чем записей в пуле | Группа над ссылками сравнивает, КАКУЮ ЗАПИСЬ взяла строка, — значит, сравнивать должно быть что, и записей должно хватать. Все три формы раньше принимались и не делали ничего |
TDC303 | missing_when=, который ничего не решает: без условия, без доли missing= рядом или на ячейке с repeat= | Условие и называет механизм — missing_when="Age < 30" это MAR, missing_when="_value > 150000" это MNAR, — поэтому написанное и пустое это вопрос, который не договорили, а без доли ему нечего включать. В повторяющейся ячейке на одной строке несколько значений, а условие спрашивает про одно; вместо того чтобы гадать, что имелось в виду, сочетание отклоняется. Все три раньше молча принимались и не делали ничего |
TDC304 | Сезонные списки не сходятся: в amplitude= или peak_at= записей не столько, сколько в period=, либо среди нескольких периодов стоит 0 | period="7,365" amplitude="120,400" peak_at="5,182" описывает одни и те же две волны трижды, позиция в позицию, поэтому несовпадающая длина не описывает никакой волны — лишнюю запись раньше просто отбрасывали молча. Единственное сокращение — одна amplitude на волны равной высоты. period="0" сам по себе значит «нет сезонной волны»; среди нескольких это волна без длины рядом с волнами, у которых длина есть |
TDC305 | noise_correlation=, который нельзя выполнить: вне −1..1 или без noise= рядом | Это доля дрожания одной строки, переходящая в следующую. На единице ряд ушёл бы и не вернулся — это случайное блуждание, а не шум, — а выше единицы он растёт без границы; и то и другое отклоняется, а не зажимается. Без noise= коррелировать нечего, и атрибут ничего не решает |
TDC306 | <assert>, на котором написаны и that=, и each= | Они отвечают на разные вопросы и проверяются разное число раз: that= — один раз, по значениям за весь запуск, each= — на каждой строке. Один тег с обоими не даёт читателю понять, которое из двух описывает фраза в says=. Напишите два утверждения, каждое со своим says=, чтобы отказ говорил, которое из них сломалось |
TDC307 | distinct="true" рядом с order="sequential" | distinct= берёт значения строки без возврата, а идущая по порядку строка ничего не тянет — её значения решает позиция. Выполнить и то и другое невозможно, а тихо проигнорировать одно — это как раз то, из-за чего конфиг начинает утверждать то, чего у него никогда не было |
TDC308 | Условие на <gen> — if= или missing_when= — называет колонку, объявленную ниже | Условие вычисляется, пока эта колонка строится, поэтому колонки, стоящей ниже, ещё не существует. Два движка отвечали на это по-разному, и оба ответа были разумны: движок в памяти читал её как пустую, и условие не срабатывало никогда, а потоковый строил колонку по требованию, и условие срабатывало по-настоящему. Перенесите названную <sequence> выше этой. Условие, которое читается уже после того, как строка собрана — <data if=>, <line if=>, <assert that=> — может называть любую колонку |
TDC244 | type="pattern" без points, src или upper | Рисунку нужна форма, откуда читать: points="0,0 1,5 2,3", файл в src или upper/lower для полосы |