Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M Новый топик    Ответить
 Сравнение двух глобалов  [new]
Шваров Евгений
Member

Откуда:
Сообщений: 847
Интересная тема снова на Community.
У каждого есть в запасе похожая утилита? )
10 июл 16, 17:04    [19392118]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение двух глобалов  [new]
servit
Member

Откуда: г. Кишинёв, Республика Молдова
Сообщений: 3117
Блог
Шваров Евгений
У каждого есть в запасе похожая утилита? )
ClassMethod DiffTree() [ PublicList = (a, b) ]
{
  
a,b
  
rep=##class(%Stream.TmpCharacter).%New()

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

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

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

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


USER>##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
11 июл 16, 08:18    [19393188]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение двух глобалов  [new]
Alexey Maslov
Member

Откуда: СПб
Сообщений: 1554
servit,

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

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

...Несколько лет назад, когда писал функцию, потратил определённые усилия на поиск разумного поведения после обнаружения 1-го расхождения с тем, чтобы найти их все до достижения некоторого верхнего предела - типичный случай "перепрограммирования".
11 июл 16, 09:31    [19393377]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение двух глобалов  [new]
servit
Member

Откуда: г. Кишинёв, Республика Молдова
Сообщений: 3117
Блог
Alexey Maslov
как, конечно, всем хорошо известно, класса %CPT.Util.TreeDiff нет даже в 2016.1.
$zv указан не был, поэтому 10031109.
Что касается более старых версий, то есть готовая утилита %GCMP, сравнивающая глобалы и которая присутствует даже в 5.0.x.
11 июл 16, 10:20    [19393582]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение двух глобалов  [new]
Alexey Maslov
Member

Откуда: СПб
Сообщений: 1554
servit
Что касается более старых версий, то есть готовая утилита %GCMP...
А мужики и не знают :)
Меня, например, она бы не устроила, т.к.:
- не умеет сравнивать подмассивы
- не имеет API (чистый интерактив).

Понятно, что всё это можно пофиксить, но для столь простых задач быстрее и проще написать заново. А про %GCMP, если честно, я просто забыл - а она ведь была даже в MSM.
11 июл 16, 16:46    [19396053]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение двух глобалов  [new]
servit
Member

Откуда: г. Кишинёв, Республика Молдова
Сообщений: 3117
Блог
Alexey Maslov
не умеет сравнивать подмассивы
Не могли бы Вы уточнить, что здесь подразумевалось?
11 июл 16, 17:02    [19396144]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение двух глобалов  [new]
Alexey Maslov
Member

Откуда: СПб
Сообщений: 1554
servit,

опубликовал всё же свою функцию, там в комментариях вроде всё есть. Подмассив: a(1), ^G(1,"aaa").
11 июл 16, 17:21    [19396251]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение двух глобалов  [new]
servit
Member

Откуда: г. Кишинёв, Республика Молдова
Сообщений: 3117
Блог
Alexey Maslov
Подмассив: a(1), ^G(1,"aaa").
Т.е. я изначально правильно Вас понял.
Почему же в %GCMP нельзя их использовать, когда - можно?
+
USER>^a,^b ^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>^%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>^a,^b ^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>^%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>^a,^b ^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>^%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
12 июл 16, 09:10    [19397901]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение двух глобалов  [new]
Alexey Maslov
Member

Откуда: СПб
Сообщений: 1554
Вот и отлично.

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

В качестве бонуса: моя функция позволяет сравнивать и локальные [под]массивы. Так вышло само собой, хоть и ни разу не пригодилось. Справедливости ради, "всеядны" и некоторые другие решения на community, хотя по условию задачи требовалось сравнить локальные массивы: народ просто прислал готовые функции, вряд ли кто-то писал "к случаю".
12 июл 16, 10:05    [19398213]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение двух глобалов  [new]
Timur Safin
Member

Откуда:
Сообщений: 54
Alexey Maslov,

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

P.S.
Решения (кроме моего :) ), конечно, поражают большим объемом over-design-а.
12 июл 16, 11:36    [19398793]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение двух глобалов  [new]
Alexey Maslov
Member

Откуда: СПб
Сообщений: 1554
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

Я считаю, что да, а вы, как видно, нет.
12 июл 16, 12:36    [19399233]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение двух глобалов  [new]
Alexey Maslov
Member

Откуда: СПб
Сообщений: 1554
Даже если принять вашу точку зрения, всё равно у вас ошибка.
+ См.
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 merge n(1)=m(1) set n(2)="extra2"
    
set b=$$CompareArrays($name(m(1)),$name(n(1))) b,!
    
if 'zw m(1) zw n(1)
    
quit

USER>DebugArrayCompare^%ztest
1
0
0
m(1,1,1)=11
m(1,2)=12

n(1,1,1)=11
n(1,2)=12
12 июл 16, 12:53    [19399331]     Ответить | Цитировать Сообщить модератору
Все форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M Ответить