comparison tests/test-revset.t @ 29001:923fa9e06ea0 stable

revset: make sort() do dumb multi-pass sorting for multiple keys (issue5218) Our invert() function was too clever to not take length into account. I could fix the problem by appending '\xff' as a terminator (opposite to '\0'), but it turned out to be slower than simple multi-pass sorting. New implementation is pretty straightforward, which just calls sort() from the last key. We can do that since Python sort() is guaranteed to be stable. It doesn't sound nice to call sort() multiple times, but actually it is faster. That's probably because we have fewer Python codes in hot loop, and can avoid heavy string and list manipulation. revset #0: sort(0:10000, 'branch') 0) 0.412753 1) 0.393254 revset #1: sort(0:10000, '-branch') 0) 0.455377 1) 0.389191 85% revset #2: sort(0:10000, 'date') 0) 0.408082 1) 0.376332 92% revset #3: sort(0:10000, '-date') 0) 0.406910 1) 0.380498 93% revset #4: sort(0:10000, 'desc branch user date rev') 0) 0.542996 1) 0.486397 89% revset #5: sort(0:10000, '-desc -branch -user -date -rev') 0) 0.965032 1) 0.518426 53%
author Yuya Nishihara <yuya@tcha.org>
date Sat, 23 Apr 2016 16:09:30 +0900
parents 87b89dca669d
children dbed4c4f48ae
comparison
equal deleted inserted replaced
29000:2d3837a4bded 29001:923fa9e06ea0
950 9 950 9
951 8 951 8
952 6 952 6
953 2 953 2
954 954
955 $ cd ..
956
957 test sorting by multiple keys including variable-length strings
958
959 $ hg init sorting
960 $ cd sorting
961 $ cat <<EOF >> .hg/hgrc
962 > [ui]
963 > logtemplate = '{rev} {branch|p5}{desc|p5}{author|p5}{date|hgdate}\n'
964 > [templatealias]
965 > p5(s) = pad(s, 5)
966 > EOF
967 $ hg branch -qf b12
968 $ hg ci -m m111 -u u112 -d '111 10800'
969 $ hg branch -qf b11
970 $ hg ci -m m12 -u u111 -d '112 7200'
971 $ hg branch -qf b111
972 $ hg ci -m m11 -u u12 -d '111 3600'
973 $ hg branch -qf b112
974 $ hg ci -m m111 -u u11 -d '120 0'
975 $ hg branch -qf b111
976 $ hg ci -m m112 -u u111 -d '110 14400'
977 created new head
978
979 compare revisions (has fast path):
980
981 $ hg log -r 'sort(all(), rev)'
982 0 b12 m111 u112 111 10800
983 1 b11 m12 u111 112 7200
984 2 b111 m11 u12 111 3600
985 3 b112 m111 u11 120 0
986 4 b111 m112 u111 110 14400
987
988 $ hg log -r 'sort(all(), -rev)'
989 4 b111 m112 u111 110 14400
990 3 b112 m111 u11 120 0
991 2 b111 m11 u12 111 3600
992 1 b11 m12 u111 112 7200
993 0 b12 m111 u112 111 10800
994
995 compare variable-length strings (issue5218):
996
997 $ hg log -r 'sort(all(), branch)'
998 1 b11 m12 u111 112 7200
999 2 b111 m11 u12 111 3600
1000 4 b111 m112 u111 110 14400
1001 3 b112 m111 u11 120 0
1002 0 b12 m111 u112 111 10800
1003
1004 $ hg log -r 'sort(all(), -branch)'
1005 0 b12 m111 u112 111 10800
1006 3 b112 m111 u11 120 0
1007 2 b111 m11 u12 111 3600
1008 4 b111 m112 u111 110 14400
1009 1 b11 m12 u111 112 7200
1010
1011 $ hg log -r 'sort(all(), desc)'
1012 2 b111 m11 u12 111 3600
1013 0 b12 m111 u112 111 10800
1014 3 b112 m111 u11 120 0
1015 4 b111 m112 u111 110 14400
1016 1 b11 m12 u111 112 7200
1017
1018 $ hg log -r 'sort(all(), -desc)'
1019 1 b11 m12 u111 112 7200
1020 4 b111 m112 u111 110 14400
1021 0 b12 m111 u112 111 10800
1022 3 b112 m111 u11 120 0
1023 2 b111 m11 u12 111 3600
1024
1025 $ hg log -r 'sort(all(), user)'
1026 3 b112 m111 u11 120 0
1027 1 b11 m12 u111 112 7200
1028 4 b111 m112 u111 110 14400
1029 0 b12 m111 u112 111 10800
1030 2 b111 m11 u12 111 3600
1031
1032 $ hg log -r 'sort(all(), -user)'
1033 2 b111 m11 u12 111 3600
1034 0 b12 m111 u112 111 10800
1035 1 b11 m12 u111 112 7200
1036 4 b111 m112 u111 110 14400
1037 3 b112 m111 u11 120 0
1038
1039 compare dates (tz offset should have no effect):
1040
1041 $ hg log -r 'sort(all(), date)'
1042 4 b111 m112 u111 110 14400
1043 0 b12 m111 u112 111 10800
1044 2 b111 m11 u12 111 3600
1045 1 b11 m12 u111 112 7200
1046 3 b112 m111 u11 120 0
1047
1048 $ hg log -r 'sort(all(), -date)'
1049 3 b112 m111 u11 120 0
1050 1 b11 m12 u111 112 7200
1051 0 b12 m111 u112 111 10800
1052 2 b111 m11 u12 111 3600
1053 4 b111 m112 u111 110 14400
1054
1055 be aware that 'sort(x, -k)' is not exactly the same as 'reverse(sort(x, k))'
1056 because '-k' reverses the comparison, not the list itself:
1057
1058 $ hg log -r 'sort(0 + 2, date)'
1059 0 b12 m111 u112 111 10800
1060 2 b111 m11 u12 111 3600
1061
1062 $ hg log -r 'sort(0 + 2, -date)'
1063 0 b12 m111 u112 111 10800
1064 2 b111 m11 u12 111 3600
1065
1066 $ hg log -r 'reverse(sort(0 + 2, date))'
1067 2 b111 m11 u12 111 3600
1068 0 b12 m111 u112 111 10800
1069
1070 sort by multiple keys:
1071
1072 $ hg log -r 'sort(all(), "branch -rev")'
1073 1 b11 m12 u111 112 7200
1074 4 b111 m112 u111 110 14400
1075 2 b111 m11 u12 111 3600
1076 3 b112 m111 u11 120 0
1077 0 b12 m111 u112 111 10800
1078
1079 $ hg log -r 'sort(all(), "-desc -date")'
1080 1 b11 m12 u111 112 7200
1081 4 b111 m112 u111 110 14400
1082 3 b112 m111 u11 120 0
1083 0 b12 m111 u112 111 10800
1084 2 b111 m11 u12 111 3600
1085
1086 $ hg log -r 'sort(all(), "user -branch date rev")'
1087 3 b112 m111 u11 120 0
1088 4 b111 m112 u111 110 14400
1089 1 b11 m12 u111 112 7200
1090 0 b12 m111 u112 111 10800
1091 2 b111 m11 u12 111 3600
1092
1093 $ cd ..
1094 $ cd repo
1095
955 test subtracting something from an addset 1096 test subtracting something from an addset
956 1097
957 $ log '(outgoing() or removes(a)) - removes(a)' 1098 $ log '(outgoing() or removes(a)) - removes(a)'
958 8 1099 8
959 9 1100 9