Гость
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Сравнение двух глобалов / 12 сообщений из 12, страница 1 из 1
10.07.2016, 17:04
    #39271414
Шваров Евгений
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение двух глобалов
Интересная тема снова на Community .
У каждого есть в запасе похожая утилита? )
...
Рейтинг: 0 / 0
11.07.2016, 08:18
    #39271563
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение двух глобалов
Шваров ЕвгенийУ каждого есть в запасе похожая утилита? )
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
ClassMethod DiffTree() [ PublicList = (a, b) ]
{
  n a,b
  s rep=##class(%Stream.TmpCharacter).%New()

  s a=4, b=4
  w !,"1) ",##class(%CPT.Util.TreeDiff).Diff("a","b",rep)," "
  d rep.OutputToDevice()

  k a,b s a=4, b=5
  d rep.Clear()
  w !,"2) ",##class(%CPT.Util.TreeDiff).Diff("a","b",rep)," "
  d rep.OutputToDevice()

  k a,b s a=4, b(5)=5
  d rep.Clear()
  w !,"3) ",##class(%CPT.Util.TreeDiff).Diff("a","b",rep)," "
  d rep.OutputToDevice()

  k ^a,^b s ^a(1,1,1)=4, ^b(1,1)=5
  d rep.Clear()
  w !,"4) ",##class(%CPT.Util.TreeDiff).Diff("^a","^b",rep)," "
  d rep.OutputToDevice()
  k ^a,^b
}

USER>d ##class(sqlru.test).DiffTree()
 
1) 1
2) 0 Data mismatch at a ~ b
 
3) 0 Data present in a but not in b
No entry for a(5) or any following keys
 
4) 0 Data present in ^b(1,1) but not in ^a(1,1)
No entry for ^b(1,1,1) or any following keys
...
Рейтинг: 0 / 0
11.07.2016, 09:31
    #39271598
Alexey Maslov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение двух глобалов
servit ,

как, конечно, всем хорошо известно, класса %CPT.Util.TreeDiff нет даже в 2016.1. Не все бегут "впереди планеты всей", хотя к этому стоит стремиться.

У меня тоже есть функция сравнения глобалов на чистом M/COS. Ничего принципиально отличного от ранее опубликованного, те же $Query с @. Мне общее решение задачи оказалось не нужно: используя утилиту для тестирования кода экспорта-импорта глобалов в различных форматах, и 1-ого расхождения глобалов мне всегда оказывается достаточно, чтобы выправить дефект.

...Несколько лет назад, когда писал функцию, потратил определённые усилия на поиск разумного поведения после обнаружения 1-го расхождения с тем, чтобы найти их все до достижения некоторого верхнего предела - типичный случай "перепрограммирования".
...
Рейтинг: 0 / 0
11.07.2016, 10:20
    #39271623
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение двух глобалов
Alexey Maslovкак, конечно, всем хорошо известно, класса %CPT.Util.TreeDiff нет даже в 2016.1.$zv указан не был, поэтому 10031109 .
Что касается более старых версий, то есть готовая утилита %GCMP , сравнивающая глобалы и которая присутствует даже в 5.0.x.
...
Рейтинг: 0 / 0
11.07.2016, 16:46
    #39271893
Alexey Maslov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение двух глобалов
servitЧто касается более старых версий, то есть готовая утилита %GCMP ...А мужики и не знают :)
Меня, например, она бы не устроила, т.к.:
- не умеет сравнивать подмассивы
- не имеет API (чистый интерактив).

Понятно, что всё это можно пофиксить, но для столь простых задач быстрее и проще написать заново. А про %GCMP, если честно, я просто забыл - а она ведь была даже в MSM.
...
Рейтинг: 0 / 0
11.07.2016, 17:02
    #39271908
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение двух глобалов
Alexey Maslovне умеет сравнивать подмассивыНе могли бы Вы уточнить, что здесь подразумевалось?
...
Рейтинг: 0 / 0
11.07.2016, 17:21
    #39271928
Alexey Maslov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение двух глобалов
servit,

опубликовал всё же свою функцию, там в комментариях вроде всё есть. Подмассив: a(1), ^G(1,"aaa").
...
Рейтинг: 0 / 0
12.07.2016, 09:10
    #39272171
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение двух глобалов
Alexey MaslovПодмассив: a(1), ^G(1,"aaa").Т.е. я изначально правильно Вас понял.
Почему же в %GCMP нельзя их использовать, когда - можно?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
USER>k ^a,^b s ^a=1,^b=2,^a(1)=3,^b(1,1)=4 zw ^a,^b
^a=1
^a(1)=3
^b=2
^b(1,1)=3
 
USER>d ^%GCMP
 
Compare global ^a(1)
  on directory set: (this system)
    in namespace: USER =>
 with global ^a(1)=> b(1,1)
  on directory set: (this system)
    in namespace: USER =>
Output differences on
Device:
Right margin: 80 =>

Compare global ^a(1) in USER
 with global ^b(1,1) in USER
 
No differences

USER>k ^a,^b s ^a=1,^b=2,^a(1)=3,^b(1,1)=4 zw ^a,^b
^a=1
^a(1)=3
^b=2
^b(1,1)=4
 
USER>d ^%GCMP
 
Compare global ^a(1)
  on directory set: (this system)
    in namespace: USER =>
 with global ^a(1)=> b(1,1)
  on directory set: (this system)
    in namespace: USER =>
Output differences on
Device:
Right margin: 80 =>

Compare global ^a(1) in USER
 with global ^b(1,1) in USER
 
Data in ^a(1): 3
Data in ^b(1,1): 4

USER>k ^a,^b s ^a=1,^b=2,^a(1,"Data")=3,^b("Data","Data")=3 zw ^a,^b
^a=1
^a(1,"Data")=3
^b=2
^b("Data","Data")=3
 
USER>d ^%GCMP
 
Compare global ^a(1)
  on directory set: (this system)
    in namespace: USER =>
 with global ^a(1)=> b("Data")
  on directory set: (this system)
    in namespace: USER =>
Output differences on
Device:
Right margin: 80 =>

Compare global ^a(1) in USER
 with global ^b("Data") in USER
 
No differences
...
Рейтинг: 0 / 0
12.07.2016, 10:05
    #39272225
Alexey Maslov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение двух глобалов
Вот и отлично.

Моё (несмелое :) предположение было основано на опыте работы с другими утилитами Cache, ориентированными на глобалы: чтобы понять, работают ли они с поддеревьями, как правило, надо пробовать: это не всегда очевидно, и синтаксис разный: где-то надо закрывать скобку (%GSIZE), где-то нет (%GOGEN).

В качестве бонуса: моя функция позволяет сравнивать и локальные [под]массивы. Так вышло само собой, хоть и ни разу не пригодилось. Справедливости ради, "всеядны" и некоторые другие решения на community, хотя по условию задачи требовалось сравнить локальные массивы: народ просто прислал готовые функции, вряд ли кто-то писал "к случаю".
...
Рейтинг: 0 / 0
12.07.2016, 11:36
    #39272297
Timur Safin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение двух глобалов
Alexey Maslov,

Почему же, я написал к случаю. Чего там писать то?

P.S.
Решения (кроме моего :) ), конечно, поражают большим объемом over-design-а.
...
Рейтинг: 0 / 0
12.07.2016, 12:36
    #39272354
Alexey Maslov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение двух глобалов
Timur SafinРешения (кроме моего :) ), конечно, поражают большим объемом over-design-а.Если считать расширение исходной постановки "сравнить два локальных массива" на глобалы, соглашусь, хотя и ваш код работает с глобалами. А в остальном... ну, наверное, тем, кто писал "не к случаю", это было для чего-то нужно.

Если уж зашёл разговор: считать ли равными массивы m(1) и n(2), где:

m(1, 1,1)=11
m(1, 2)=12

n(2, 1,1)=11
n(2, 2)=12

Я считаю, что да, а вы, как видно, нет.
...
Рейтинг: 0 / 0
12.07.2016, 12:53
    #39272365
Alexey Maslov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение двух глобалов
Даже если принять вашу точку зрения, всё равно у вас ошибка.
См.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
DebugArrayCompare()
    new
    set m(1,1,1)=11,m(1,2)=12,m(2,1)=133
    set n(1,1,1)=11,n(1,2)=12,n(2,1)=133
    write $$CompareArrays($name(m),$name(n)),!
    set n(3,1)=0
    write $$CompareArrays($name(m),$name(n)),!
    kill n merge n(1)=m(1) set n(2)="extra2"
    set b=$$CompareArrays($name(m(1)),$name(n(1))) w b,!
    if 'b zw m(1) w ! zw n(1)
    quit

USER>d DebugArrayCompare^%ztest
1
0
0
m(1,1,1)=11
m(1,2)=12
 
n(1,1,1)=11
n(1,2)=12
...
Рейтинг: 0 / 0
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Сравнение двух глобалов / 12 сообщений из 12, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]