Skip to content

Commit 15235dc

Browse files
committed
сравнение по представлениям
1 parent b048edf commit 15235dc

File tree

3 files changed

+72
-7
lines changed

3 files changed

+72
-7
lines changed

src/OneScript.StandardLibrary/Collections/ValueTable/ValueTable.cs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -636,14 +636,15 @@ private class RowComparator : IComparer<ValueTableRow>
636636
{
637637
readonly List<ValueTableSortRule> Rules;
638638

639-
readonly GenericIValueComparer _comparer = new GenericIValueComparer();
639+
readonly GenericIValueComparer _comparer;
640640

641-
public RowComparator(List<ValueTableSortRule> Rules)
641+
public RowComparator(IBslProcess process, List<ValueTableSortRule> Rules)
642642
{
643-
if (Rules.Count() == 0)
643+
if (Rules.Count == 0)
644644
throw RuntimeException.InvalidArgumentValue();
645645

646646
this.Rules = Rules;
647+
_comparer = new GenericIValueComparer(process);
647648
}
648649

649650
private int OneCompare(ValueTableRow x, ValueTableRow y, ValueTableSortRule Rule)
@@ -661,7 +662,7 @@ public int Compare(ValueTableRow x, ValueTableRow y)
661662
int i = 0, r;
662663
while ((r = OneCompare(x, y, Rules[i])) == 0)
663664
{
664-
if (++i >= Rules.Count())
665+
if (++i >= Rules.Count)
665666
return 0;
666667
}
667668

@@ -678,9 +679,9 @@ public int Compare(ValueTableRow x, ValueTableRow y)
678679
/// </param>
679680
/// <param name="comparator">СравнениеЗначений - правила сравнения значений при наличии различных типов данных в колонке.</param>
680681
[ContextMethod("Сортировать", "Sort")]
681-
public void Sort(string columns, IValue comparator = null)
682+
public void Sort(IBslProcess process, string columns, IValue comparator = null)
682683
{
683-
_rows.Sort(new RowComparator(GetSortRules(columns)));
684+
_rows.Sort(new RowComparator(process, GetSortRules(columns)));
684685
}
685686

686687
/// <summary>

src/ScriptEngine/Machine/GenericIValueComparer.cs

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,25 @@ This Source Code Form is subject to the terms of the
99
using System.Collections.Generic;
1010
using OneScript.Values;
1111
using ScriptEngine.Machine.Contexts;
12+
using OneScript.Execution;
1213

1314
namespace ScriptEngine.Machine
1415
{
1516
public class GenericIValueComparer : IEqualityComparer<IValue>, IComparer<IValue>
1617
{
18+
private readonly IBslProcess _process;
19+
private readonly Func<IValue, IValue, int> _comparer;
20+
21+
public GenericIValueComparer()
22+
{
23+
_comparer = CompareAsStrings;
24+
}
25+
26+
public GenericIValueComparer(IBslProcess proc)
27+
{
28+
_process = proc;
29+
_comparer = CompareByPresentations;
30+
}
1731

1832
public bool Equals(IValue x, IValue y)
1933
{
@@ -38,6 +52,16 @@ public int GetHashCode(IValue obj)
3852
return CLR_obj.GetHashCode();
3953
}
4054

55+
private int CompareAsStrings(IValue x, IValue y)
56+
{
57+
return x.ToString().CompareTo(y.ToString());
58+
}
59+
60+
private int CompareByPresentations(IValue x, IValue y)
61+
{
62+
return ((BslValue)x).ToString(_process).CompareTo(((BslValue)y).ToString(_process));
63+
}
64+
4165
public int Compare(IValue x, IValue y)
4266
{
4367
if (ReferenceEquals(x, y))
@@ -46,7 +70,7 @@ public int Compare(IValue x, IValue y)
4670
if (x is IComparable && x.SystemType == y.SystemType )
4771
return x.CompareTo(y);
4872
else
49-
return x.ToString().CompareTo(y.ToString());
73+
return _comparer(x,y);
5074
}
5175
}
5276
}

tests/valuetable.os

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545

4646
ВсеТесты.Добавить("ТестДолжен_ПроверитьСортировкуНеупорядочиваемыхТипов");
4747
ВсеТесты.Добавить("ТестДолжен_ПроверитьСортировкуРазныхТипов");
48+
ВсеТесты.Добавить("ТестДолжен_ПроверитьСортировкуПоПредставлению");
4849
Возврат ВсеТесты;
4950

5051
КонецФункции
@@ -816,3 +817,42 @@
816817
юТест.ПроверитьРавенство(ТипЗнч(ТЗ[4].Тест), Тип("Структура"));
817818
юТест.ПроверитьРавенство(ТЗ[5].Тест, "СтрЪ");
818819
КонецПроцедуры
820+
821+
Процедура ТестДолжен_ПроверитьСортировкуПоПредставлению() Экспорт
822+
ТЗ = Новый ТаблицаЗначений();
823+
ТЗ.Колонки.Добавить("Тест");
824+
825+
ТекстКласса =
826+
"Процедура ОбработкаПолученияПредставления(Представление, СтандартнаяОбработка)
827+
| СтандартнаяОбработка = Ложь;
828+
| Представление = ""Представление0"";
829+
|КонецПроцедуры";
830+
КлассИзСтроки0 = ЗагрузитьСценарийИзСтроки(ТекстКласса);
831+
832+
ТекстКласса =
833+
"Процедура ОбработкаПолученияПредставления(Представление, СтандартнаяОбработка)
834+
| СтандартнаяОбработка = Ложь;
835+
| Представление = ""Представление1"";
836+
|КонецПроцедуры";
837+
КлассИзСтроки1 = ЗагрузитьСценарийИзСтроки(ТекстКласса);
838+
839+
ТекстКласса =
840+
"Процедура ОбработкаПолученияПредставления(Представление, СтандартнаяОбработка)
841+
| СтандартнаяОбработка = Ложь;
842+
| Представление = ""Представление3"";
843+
|КонецПроцедуры";
844+
КлассИзСтроки3 = ЗагрузитьСценарийИзСтроки(ТекстКласса);
845+
846+
ТЗ.Добавить().Тест = КлассИзСтроки3;
847+
ТЗ.Добавить().Тест = "Представление2";
848+
ТЗ.Добавить().Тест = КлассИзСтроки0;
849+
ТЗ.Добавить().Тест = КлассИзСтроки1;
850+
851+
ТЗ.Сортировать("Тест");
852+
юТест.ПроверитьРавенство(Строка(ТЗ[0].Тест), "Представление0");
853+
юТест.ПроверитьРавенство(Строка(ТЗ[1].Тест), "Представление1");
854+
юТест.ПроверитьРавенство(ТЗ[2].Тест, "Представление2");
855+
юТест.ПроверитьРавенство(Строка(ТЗ[3].Тест), "Представление3");
856+
857+
КонецПроцедуры
858+

0 commit comments

Comments
 (0)