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 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 3588 3589 3590 3591 3592 3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603 3604 3605 3606 3607 3608 3609 3610 3611 3612 3613 3614 3615 3616 3617 3618 3619 3620 3621 3622 3623 3624 3625 3626 3627 3628 3629 3630 3631 3632 3633 3634 3635 3636 3637 3638 3639 3640 3641 3642 3643 3644 3645 3646 3647 3648 3649 3650 3651 3652 3653 3654 3655 3656 3657 3658 3659 3660 3661 3662 3663 3664 3665 3666 3667 3668 3669 3670 3671 3672 3673 3674 3675 3676 3677 3678 3679 3680 3681 3682 3683 3684 3685 3686 3687 3688 3689 3690 3691 3692 3693 3694 3695 3696 3697 3698 3699 3700 3701 3702 3703 3704 3705 3706 3707 3708 3709 3710 3711 3712 3713 3714 3715 3716 3717 3718 3719 3720 3721 3722 3723 3724 3725 3726 3727 3728 3729 3730 3731 3732 3733 3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746 3747 3748 3749 3750 3751 3752 3753 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771 3772 3773 3774 3775 3776 3777 3778 3779 3780 3781 3782 3783 3784 3785 3786 3787 3788 3789 3790 3791 3792 3793 3794 3795 3796 3797 3798 3799 3800 3801 3802 3803 3804 3805 3806 3807 3808 3809 3810 3811 3812 3813 3814 3815 3816 3817 3818 3819 3820 3821 3822 3823 3824 3825 3826 3827 3828 3829 3830 3831 3832 3833 3834 3835 3836 3837 3838 3839 3840 3841 3842 3843 3844 3845 3846 3847 3848 3849 3850 3851 3852 3853 3854 3855 3856 3857 3858 3859 3860 3861 3862 3863 3864 3865 3866 3867 3868 3869 3870 3871 3872 3873 3874 3875 3876 3877 3878 3879 3880 3881 3882 3883 3884 3885 3886 3887 3888 3889 3890 3891 3892 3893 3894 3895 3896 3897 3898 3899 3900 3901 3902 3903 3904 3905 3906 3907 3908 3909 3910 3911 3912 3913 3914 3915 3916 3917 3918 3919 3920 3921 3922 3923 3924 3925 3926 3927 3928 3929 3930 3931 3932 3933 3934 3935 3936 3937 3938 3939 3940 3941 3942 3943 3944 3945 3946 3947 3948 3949 3950 3951 3952 3953 3954 3955 3956 3957 3958 3959 3960 3961 3962 3963 3964 3965 3966 3967 3968 3969 3970 3971 3972 3973 3974 3975 3976 3977 3978 3979 3980 3981 3982 3983 3984 3985 3986 3987 3988 3989 3990 3991 3992 3993 3994 3995 3996 3997 3998 3999 4000 4001 4002 4003 4004 4005 4006 4007 4008 4009 4010 4011 4012 4013 4014 4015 4016 4017 4018 4019 4020 4021 4022 4023 4024 4025 4026 4027 4028 4029 4030 4031 4032 4033 4034 4035 4036 4037 4038 4039 4040 4041 4042 4043 4044 4045 4046 4047 4048 4049 4050 4051 4052 4053 4054 4055 4056 4057 4058 4059 4060 4061 4062 4063 4064 4065 4066 4067 4068 4069 4070 4071 4072 4073 4074 4075 4076 4077 4078 4079 4080 4081 4082 4083 4084 4085 4086 4087 4088 4089 4090 4091 4092 4093 4094 4095 4096 4097 4098 4099 4100 4101 4102 4103 4104 4105 4106 4107 4108 4109 4110 4111 4112 4113 4114 4115 4116 4117 4118 4119 4120 4121 4122 4123 4124 4125 4126 4127 4128 4129 4130 4131 4132 4133 4134 4135 4136 4137 4138 4139 4140 4141 4142 4143 4144 4145 4146 4147 4148 4149 4150 4151 4152 4153 4154 4155 4156 4157 4158 4159 4160 4161 4162 4163 4164 4165 4166 4167 4168 4169 4170 4171 4172 4173 4174 4175 4176 4177 4178 4179 4180 4181 4182 4183 4184 4185 4186 4187 4188 4189 4190 4191 4192 4193 4194 4195 4196 4197 4198 4199 4200 4201 4202 4203 4204 4205 4206 4207 4208 4209 4210 4211 4212 4213 4214 4215 4216 4217 4218 4219 4220 4221 4222 4223 4224 4225 4226 4227 4228 4229 4230 4231 4232 4233 4234 4235 4236 4237 4238 4239 4240 4241 4242 4243 4244 4245 4246 4247 4248 4249 4250 4251 4252 4253 4254 4255 4256 4257 4258 4259 4260 4261 4262 4263 4264 4265 4266 4267 4268 4269 4270 4271 4272 4273 4274 4275 4276 4277 4278 4279 4280 4281 4282 4283 4284 4285 4286 4287 4288 4289 4290 4291 4292 4293 4294 4295 4296 4297 4298 4299 4300 4301 4302 4303 4304 4305 4306 4307 4308 4309 4310 4311 4312 4313 4314 4315 4316 4317 4318 4319 4320 4321 4322 4323 4324 4325 4326 4327 4328 4329 4330 4331 4332 4333 4334 4335 4336 4337 4338 4339 4340 4341 4342 4343 4344 4345 4346 4347 4348 4349 4350 4351 4352 4353 4354 4355 4356 4357 4358 4359 4360 4361 4362 4363 4364 4365 4366 4367 4368 4369 4370 4371 4372 4373 4374 4375 4376 4377 4378 4379 4380 4381 4382 4383 4384 4385 4386 4387 4388 4389 4390 4391 4392 4393 4394 4395 4396 4397 4398 4399 4400 4401 4402 4403 4404 4405 4406 4407 4408 4409 4410 4411 4412 4413 4414 4415 4416 4417 4418 4419 4420 4421 4422 4423 4424 4425 4426 4427 4428 4429 4430 4431 4432 4433 4434 4435 4436 4437 4438 4439 4440 4441 4442 4443 4444 4445 4446 4447 4448 4449 4450 4451 4452 4453 4454 4455 4456 4457 4458 4459 4460 4461 4462 4463 4464 4465 4466 4467 4468 4469 4470 4471 4472 4473 4474 4475 4476 4477 4478 4479 4480 4481 4482 4483 4484 4485 4486 4487 4488 4489 4490 4491 4492 4493 4494 4495 4496 4497 4498 4499 4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 4510 4511 4512 4513 4514 4515 4516 4517 4518 4519 4520 4521 4522 4523 4524 4525 4526 4527 4528 4529 4530 4531 4532 4533 4534 4535 4536 4537 4538 4539 4540 4541 4542 4543 4544 4545 4546 4547 4548 4549 4550 4551 4552 4553 4554 4555 4556 4557 4558 4559 4560 4561 4562 4563 4564 4565 4566 4567 4568 4569 4570 4571 4572 4573 4574 4575 4576 4577 4578 4579 4580 4581 4582 4583 4584 4585 4586 4587 4588 4589 4590 4591 4592 4593 4594 4595 4596 4597 4598 4599 4600 4601 4602 4603 4604 4605 4606 4607 4608 4609 4610 4611 4612 4613 4614 4615 4616 4617 4618 4619 4620 4621 4622 4623 4624 4625 4626 4627 4628 4629 4630 4631 4632 4633 4634 4635 4636 4637 4638 4639 4640 4641 4642 4643 4644 4645 4646 4647 4648 4649 4650 4651 4652 4653 4654 4655 4656 4657 4658 4659 4660 4661 4662 4663 4664 4665 4666 4667 4668 4669 4670 4671 4672 4673 4674 4675 4676 4677 4678 4679 4680 4681 4682 4683 4684 4685 4686 4687 4688 4689 4690 4691 4692 4693 4694 4695 4696 4697 4698 4699 4700 4701 4702 4703 4704 4705 4706 4707 4708 4709 4710 4711 4712 4713 4714 4715 4716 4717 4718 4719 4720 4721 4722 4723 4724 4725 4726 4727 4728 4729 4730 4731 4732 4733 4734 4735 4736 4737 4738 4739 4740 4741 4742 4743 4744 4745 4746 4747 4748 4749 4750 4751 4752 4753 4754 4755 4756 4757 4758 4759 4760 4761 4762 4763 4764 4765 4766 4767 4768 4769 4770 4771 4772 4773 4774 4775 4776 4777 4778 4779 4780 4781 4782 4783 4784 4785 4786 4787 4788 4789 4790 4791 4792 4793 4794 4795 4796 4797 4798 4799 4800 4801 4802 4803 4804 4805 4806 4807 4808 4809 4810 4811 4812 4813 4814 4815 4816 4817 4818 4819 4820 4821 4822 4823 4824 4825 4826 4827 4828 4829 4830 4831 4832 4833 4834 4835 4836 4837 4838 4839 4840 4841 4842 4843 4844 4845 4846 4847 4848 4849 4850 4851 4852 4853 4854 4855 4856 4857 4858 4859 4860 4861 4862 4863 4864 4865 4866 4867 4868 4869 4870 4871 4872 4873 4874 4875 4876 4877 4878 4879 4880 4881 4882 4883 4884 4885 4886 4887 4888 4889 4890 4891 4892 4893 4894 4895 4896 4897 4898 4899 4900 4901 4902 4903 4904 4905 4906 4907 4908 4909 4910 4911 4912 4913 4914 4915 4916 4917 4918 4919 4920 4921 4922 4923 4924 4925 4926 4927 4928 4929 4930 4931 4932 4933 4934 4935 4936 4937 4938 4939 4940 4941 4942 4943 4944 4945 4946 4947 4948 4949 4950 4951 4952 4953 4954 4955 4956 4957 4958 4959 4960 4961 4962 4963 4964 4965 4966 4967 4968 4969 4970 4971 4972 4973 4974 4975 4976 4977 4978 4979 4980 4981 4982 4983 4984 4985 4986 4987 4988 4989 4990 4991 4992 4993 4994 4995 4996 4997 4998 4999 5000 5001 5002 5003 5004 5005 5006 5007 5008 5009 5010 5011 5012 5013 5014 5015 5016 5017 5018 5019 5020 5021 5022 5023 5024 5025 5026 5027 5028 5029 5030 5031 5032 5033 5034 5035 5036 5037 5038 5039 5040 5041 5042 5043 5044 5045 5046 5047 5048 5049 5050 5051 5052 5053 5054 5055 5056 5057 5058 5059 5060 5061 5062 5063 5064 5065 5066 5067 5068 5069 5070 5071 5072 5073 5074 5075 5076 5077 5078 5079 5080 5081 5082 5083 5084 5085 5086 5087 5088 5089 5090 5091 5092 5093 5094 5095 5096 5097 5098 5099 5100 5101 5102 5103 5104 5105 5106 5107 5108 5109 5110 5111 5112 5113 5114 5115 5116 5117 5118 5119 5120 5121 5122 5123 5124 5125 5126 5127 5128 5129 5130 5131 5132 5133 5134 5135 5136 5137 5138 5139 5140 5141 5142 5143 5144 5145 5146 5147 5148 5149 5150 5151 5152 5153 5154 5155 5156 5157 5158 5159 5160 5161 5162 5163 5164 5165 5166 5167 5168 5169 5170 5171 5172 5173 5174 5175 5176 5177 5178 5179 5180 5181 5182 5183 5184 5185 5186 5187 5188 5189 5190 5191 5192 5193 5194 5195 5196 5197 5198 5199 5200 5201 5202 5203 5204 5205 5206 5207 5208 5209 5210 5211 5212 5213 5214 5215 5216 5217 5218 5219 5220 5221 5222 5223 5224 5225 5226 5227 5228 5229 5230 5231 5232 5233 5234 5235 5236 5237 5238 5239 5240 5241 5242 5243 5244 5245 5246 5247 5248 5249 5250 5251 5252 5253 5254 5255 5256 5257 5258 5259 5260 5261 5262 5263 5264 5265 5266 5267 5268 5269 5270 5271 5272 5273 5274 5275 5276 5277 5278 5279 5280 5281 5282 5283 5284 5285 5286 5287 5288 5289 5290 5291 5292 5293 5294 5295 5296 5297 5298 5299 5300 5301 5302 5303 5304 5305 5306 5307 5308 5309 5310 5311 5312 5313 5314 5315 5316 5317 5318 5319 5320 5321 5322 5323 5324 5325 5326 5327 5328 5329 5330 5331 5332 5333 5334 5335 5336 5337 5338 5339 5340 5341 5342 5343 5344 5345 5346 5347 5348 5349 5350 5351 5352 5353 5354 5355 5356 5357 5358 5359 5360 5361 5362 5363 5364 5365 5366 5367 5368 5369 5370 5371 5372 5373 5374 5375 5376 5377 5378 5379 5380 5381 5382 5383 5384 5385 5386 5387 5388 5389 5390 5391 5392 5393 5394 5395 5396 5397 5398 5399 5400 5401 5402 5403 5404 5405 5406 5407 5408 5409 5410 5411 5412 5413 5414 5415 5416 5417 5418 5419 5420 5421 5422 5423 5424 5425 5426 5427 5428 5429 5430 5431 5432 5433 5434 5435 5436 5437 5438 5439 5440 5441 5442 5443 5444 5445 5446 5447 5448 5449 5450 5451 5452 5453 5454 5455 5456 5457 5458 5459 5460 5461 5462 5463 5464 5465 5466 5467 5468 5469 5470 5471 5472 5473 5474 5475 5476 5477 5478 5479 5480 5481 5482 5483 5484 5485 5486 5487 5488 5489 5490 5491 5492 5493 5494 5495 5496 5497 5498 5499 5500 5501 5502 5503 5504 5505 5506 5507 5508 5509 5510 5511 5512 5513 5514 5515 5516 5517 5518 5519 5520 5521 5522 5523 5524 5525 5526 5527 5528 5529 5530 5531 5532 5533 5534 5535 5536 5537 5538 5539 5540 5541 5542 5543 5544 5545 5546 5547 5548 5549 5550 5551 5552 5553 5554 5555 5556 5557 5558 5559 5560 5561 5562 5563 5564 5565 5566 5567 5568 5569 5570 5571 5572 5573 5574 5575 5576 5577 5578 5579 5580 5581 5582 5583 5584 5585 5586 5587 5588 5589 5590 5591 5592 5593 5594 5595 5596 5597 5598 5599 5600 5601 5602 5603 5604 5605 5606 5607 5608 5609 5610 5611 5612 5613 5614 5615 5616 5617 5618 5619 5620 5621 5622 5623 5624 5625 5626 5627 5628 5629 5630 5631 5632 5633 5634 5635 5636 5637 5638 5639 5640 5641 5642 5643 5644 5645 5646 5647 5648 5649 5650 5651 5652 5653 5654 5655 5656 5657 5658 5659 5660 5661 5662 5663 5664 5665 5666 5667 5668 5669 5670 5671 5672 5673 5674 5675 5676 5677 5678 5679 5680 5681 5682 5683 5684 5685 5686 5687 5688 5689 5690 5691 5692 5693 5694 5695 5696 5697 5698 5699 5700 5701 5702 5703 5704 5705 5706 5707 5708 5709 5710 5711 5712 5713 5714 5715 5716 5717 5718 5719 5720 5721 5722 5723 5724 5725 5726 5727 5728 5729 5730 5731 5732 5733 5734 5735 5736 5737 5738 5739 5740 5741 5742 5743 5744 5745 5746 5747 5748 5749 5750 5751 5752 5753 5754 5755 5756 5757 5758 5759 5760 5761 5762 5763 5764 5765 5766 5767 5768 5769 5770 5771 5772 5773 5774 5775 5776 5777 5778 5779 5780 5781 5782 5783 5784 5785 5786 5787 5788 5789 5790 5791 5792 5793 5794 5795 5796 5797 5798 5799 5800 5801 5802 5803 5804 5805 5806 5807 5808 5809 5810 5811 5812 5813 5814 5815 5816 5817 5818 5819 5820 5821 5822 5823 5824 5825 5826 5827 5828 5829 5830 5831 5832 5833 5834 5835 5836 5837 5838 5839 5840 5841 5842 5843 5844 5845 5846 5847 5848 5849 5850 5851 5852 5853 5854 5855 5856 5857 5858 5859 5860 5861 5862 5863 5864 5865 5866 5867 5868 5869 5870 5871 5872 5873 5874 5875 5876 5877 5878 5879 5880 5881 5882 5883 5884 5885 5886 5887 5888 5889 5890 5891 5892 5893 5894 5895 5896 5897 5898 5899 5900 5901 5902 5903 5904 5905 5906 5907 5908 5909 5910 5911 5912 5913 5914 5915 5916 5917 5918 5919 5920 5921 5922 5923 5924 5925 5926 5927 5928 5929 5930 5931 5932 5933 5934 5935 5936 5937 5938 5939 5940 5941 5942 5943 5944 5945 5946 5947 5948 5949 5950 5951 5952 5953 5954 5955 5956 5957 5958 5959 5960 5961 5962 5963 5964 5965 5966 5967 5968 5969 5970 5971 5972 5973 5974 5975 5976 5977 5978 5979 5980 5981 5982 5983 5984 5985 5986 5987 5988 5989 5990 5991 5992 5993 5994 5995 5996 5997 5998 5999 6000 6001 6002 6003 6004 6005 6006 6007 6008 6009 6010 6011 6012 6013 6014 6015 6016 6017 6018 6019 6020 6021 6022 6023 6024 6025 6026 6027 6028 6029 6030 6031 6032 6033 6034 6035 6036 6037 6038 6039 6040 6041 6042 6043 6044 6045 6046 6047 6048 6049 6050 6051 6052 6053 6054 6055 6056 6057 6058 6059 6060 6061 6062 6063 6064 6065 6066 6067 6068 6069 6070 6071 6072 6073 6074 6075 6076 6077 6078 6079 6080 6081 6082 6083 6084 6085 6086 6087 6088 6089 6090 6091 6092 6093 6094 6095 6096 6097 6098 6099 6100 6101 6102 6103 6104 6105 6106 6107 6108 6109 6110 6111 6112 6113 6114 6115 6116 6117 6118 6119 6120 6121 6122 6123 6124 6125 6126 6127 6128 6129 6130 6131 6132 6133 6134 6135 6136 6137 6138 6139 6140 6141 6142 6143 6144 6145 6146 6147 6148 6149 6150 6151 6152 6153 6154 6155 6156 6157 6158 6159 6160 6161 6162 6163 6164 6165 6166 6167 6168 6169 6170 6171 6172 6173 6174 6175 6176 6177 6178 6179 6180 6181 6182 6183 6184 6185 6186 6187 6188 6189 6190 6191 6192 6193 6194 6195 6196 6197 6198 6199 6200 6201 6202 6203 6204 6205 6206 6207 6208 6209 6210 6211 6212 6213 6214 6215 6216 6217 6218 6219 6220 6221 6222 6223 6224 6225 6226 6227 6228 6229 6230 6231 6232 6233 6234 6235 6236 6237 6238 6239 6240 6241 6242 6243 6244 6245 6246 6247 6248 6249 6250 6251 6252 6253 6254 6255 6256 6257 6258 6259 6260 6261 6262 6263 6264 6265 6266 6267 6268 6269 6270 6271 6272 6273 6274 6275 6276 6277 6278 6279 6280 6281 6282 6283 6284 6285 6286 6287 6288 6289 6290 6291 6292 6293 6294 6295 6296 6297 6298 6299 6300 6301 6302 6303 6304 6305 6306 6307 6308 6309 6310 6311 6312 6313 6314 6315 6316 6317 6318 6319 6320 6321 6322 6323 6324 6325 6326 6327 6328 6329 6330 6331 6332 6333 6334 6335 6336 6337 6338 6339 6340 6341 6342 6343 6344 6345 6346 6347 6348 6349 6350 6351 6352 6353 6354 6355 6356 6357 6358 6359 6360 6361 6362 6363 6364 6365 6366 6367 6368 6369 6370 6371 6372 6373 6374 6375 6376 6377 6378 6379 6380 6381 6382 6383 6384 6385 6386 6387 6388 6389 6390 6391 6392 6393 6394 6395 6396 6397 6398 6399 6400 6401 6402 6403 6404 6405 6406 6407 6408 6409 6410 6411 6412 6413 6414 6415 6416 6417 6418 6419 6420 6421 6422 6423 6424 6425 6426 6427 6428 6429 6430 6431 6432 6433 6434 6435 6436 6437 6438 6439 6440 6441 6442 6443 6444 6445 6446 6447 6448 6449 6450 6451 6452 6453 6454 6455 6456 6457 6458 6459 6460 6461 6462 6463 6464 6465 6466 6467 6468 6469 6470 6471 6472 6473 6474 6475 6476 6477 6478 6479 6480 6481 6482 6483 6484 6485 6486 6487 6488 6489 6490 6491 6492 6493 6494 6495 6496 6497 6498 6499 6500 6501 6502 6503 6504 6505 6506 6507 6508 6509 6510 6511 6512 6513 6514 6515 6516 6517 6518 6519 6520 6521 6522 6523 6524 6525 6526 6527 6528 6529 6530 6531 6532 6533 6534 6535 6536 6537 6538 6539 6540 6541 6542 6543 6544 6545 6546 6547 6548 6549 6550 6551 6552 6553 6554 6555 6556 6557 6558 6559 6560 6561 6562 6563 6564 6565 6566 6567 6568 6569 6570 6571 6572 6573 6574 6575 6576 6577 6578 6579 6580 6581 6582 6583 6584 6585 6586 6587 6588 6589 6590 6591 6592 6593 6594 6595 6596 6597 6598 6599 6600 6601 6602 6603 6604 6605 6606 6607 6608 6609 6610 6611 6612 6613 6614 6615 6616 6617 6618 6619 6620 6621 6622 6623 6624 6625 6626 6627 6628 6629 6630 6631 6632 6633 6634 6635 6636 6637 6638 6639 6640 6641 6642 6643 6644 6645 6646 6647 6648 6649 6650 6651 6652 6653 6654 6655 6656 6657 6658 6659 6660 6661 6662 6663 6664 6665 6666 6667 6668 6669 6670 6671 6672 6673 6674 6675 6676 6677 6678 6679 6680 6681 6682 6683 6684 6685 6686 6687 6688 6689 6690 6691 6692 6693 6694 6695 6696 6697 6698 6699 6700 6701 6702 6703 6704 6705 6706 6707 6708 6709 6710 6711 6712 6713 6714 6715 6716 6717 6718 6719 6720 6721 6722 6723 6724 6725 6726 6727 6728 6729 6730 6731 6732 6733 6734 6735 6736 6737 6738 6739 6740 6741 6742 6743 6744 6745 6746 6747 6748 6749 6750 6751 6752 6753 6754 6755 6756 6757 6758 6759 6760 6761 6762 6763 6764 6765 6766 6767 6768 6769 6770 6771 6772 6773 6774 6775 6776 6777 6778 6779 6780 6781 6782 6783 6784 6785 6786 6787 6788 6789 6790 6791 6792 6793 6794 6795 6796 6797 6798 6799 6800 6801 6802 6803 6804 6805 6806 6807 6808 6809 6810 6811 6812 6813 6814 6815 6816 6817 6818 6819 6820 6821 6822 6823 6824 6825 6826 6827 6828 6829 6830 6831 6832 6833 6834 6835 6836 6837 6838 6839 6840 6841 6842 6843 6844 6845 6846 6847 6848 6849 6850 6851 6852 6853 6854 6855 6856 6857 6858 6859 6860 6861 6862 6863 6864 6865 6866 6867 6868 6869 6870 6871 6872 6873 6874 6875 6876 6877 6878 6879 6880 6881 6882 6883 6884 6885 6886 6887 6888 6889 6890 6891 6892 6893 6894 6895 6896 6897 6898 6899 6900 6901 6902 6903 6904 6905 6906 6907 6908 6909 6910 6911 6912 6913 6914 6915 6916 6917 6918 6919 6920 6921 6922 6923 6924 6925 6926 6927 6928 6929 6930 6931 6932 6933 6934 6935 6936 6937 6938 6939 6940 6941 6942 6943 6944 6945 6946 6947 6948 6949 6950 6951 6952 6953 6954 6955 6956 6957 6958 6959 6960 6961 6962 6963 6964 6965 6966 6967 6968 6969 6970 6971 6972 6973 6974 6975 6976 6977 6978 6979 6980 6981 6982 6983 6984 6985 6986 6987 6988 6989 6990 6991 6992 6993 6994 6995 6996 6997 6998 6999 7000 7001 7002 7003 7004 7005 7006 7007 7008 7009 7010 7011 7012 7013 7014 7015 7016 7017 7018 7019 7020 7021 7022 7023 7024 7025 7026 7027 7028 7029 7030 7031 7032 7033 7034 7035 7036 7037 7038 7039 7040 7041 7042 7043 7044 7045 7046 7047 7048 7049 7050 7051 7052 7053 7054 7055 7056 7057 7058 7059 7060 7061 7062 7063 7064 7065 7066 7067 7068 7069 7070 7071 7072 7073 7074 7075 7076 7077 7078 7079 7080 7081 7082 7083 7084 7085 7086 7087 7088 7089 7090 7091 7092 7093 7094 7095 7096 7097 7098 7099 7100 7101 7102 7103 7104 7105 7106 7107 7108 7109 7110 7111 7112 7113 7114 7115 7116 7117 7118 7119 7120 7121 7122 7123 7124 7125 7126 7127 7128 7129 7130 7131 7132 7133 7134 7135 7136 7137 7138 7139 7140 7141 7142 7143 7144 7145 7146 7147 7148 7149 7150 7151 7152 7153 7154 7155 7156 7157 7158 7159 7160 7161 7162 7163 7164 7165 7166 7167 7168 7169 7170 7171 7172 7173 7174 7175 7176 7177 7178 7179 7180 7181 7182 7183 7184 7185 7186 7187 7188 7189 7190 7191 7192 7193 7194 7195 7196 7197 7198 7199 7200 7201 7202 7203 7204 7205 7206 7207 7208 7209 7210 7211 7212 7213 7214 7215 7216 7217 7218 7219 7220 7221 7222 7223 7224 7225 7226 7227 7228 7229 7230 7231 7232 7233 7234 7235 7236 7237 7238 7239 7240 7241 7242 7243 7244 7245 7246 7247 7248 7249 7250 7251 7252 7253 7254 7255 7256 7257 7258 7259 7260 7261 7262 7263 7264 7265 7266 7267 7268 7269 7270 7271 7272 7273 7274 7275 7276 7277 7278 7279 7280 7281 7282 7283 7284 7285 7286 7287 7288 7289 7290 7291 7292 7293 7294 7295 7296 7297 7298 7299 7300 7301 7302 7303 7304 7305 7306 7307 7308 7309 7310 7311 7312 7313 7314 7315 7316 7317 7318 7319 7320 7321 7322 7323 7324 7325 7326 7327 7328 7329 7330 7331 7332 7333 7334 7335 7336 7337 7338 7339 7340 7341 7342 7343 7344 7345 7346 7347 7348 7349 7350 7351 7352 7353 7354 7355 7356 7357 7358 7359 7360 7361 7362 7363 7364 7365 7366 7367 7368 7369 7370 7371 7372 7373 7374 7375 7376 7377 7378 7379 7380 7381 7382 7383 7384 7385 7386 7387 7388 7389 7390 7391 7392 7393 7394 7395 7396 7397 7398 7399 7400 7401 7402 7403 7404 7405 7406 7407 7408 7409 7410 7411 7412 7413 7414 7415 7416 7417 7418 7419 7420 7421 7422 7423 7424 7425 7426 7427 7428 7429 7430 7431 7432 7433 7434 7435 7436 7437 7438 7439 7440 7441 7442 7443 7444 7445 7446 7447 7448 7449 7450 7451 7452 7453 7454 7455 7456 7457 7458 7459 7460 7461 7462 7463 7464 7465 7466 7467 7468 7469 7470 7471 7472 7473 7474 7475 7476 7477 7478 7479 7480 7481 7482 7483 7484 7485 7486 7487 7488 7489 7490 7491 7492 7493 7494 7495 7496 7497 7498 7499 7500 7501 7502 7503 7504 7505 7506 7507 7508 7509 7510 7511 7512 7513 7514 7515 7516 7517 7518 7519 7520 7521 7522 7523 7524 7525 7526 7527 7528 7529 7530 7531 7532 7533 7534 7535 7536 7537 7538 7539 7540 7541 7542 7543 7544 7545 7546 7547 7548 7549 7550 7551 7552 7553 7554 7555 7556 7557 7558 7559 7560 7561 7562 7563 7564 7565 7566 7567 7568 7569 7570 7571 7572 7573 7574 7575 7576 7577 7578 7579 7580 7581 7582 7583 7584 7585 7586 7587 7588 7589 7590 7591 7592 7593 7594 7595 7596 7597 7598 7599 7600 7601 7602 7603 7604 7605 7606 7607 7608 7609 7610 7611 7612 7613 7614 7615 7616 7617 7618 7619 7620 7621 7622 7623 7624 7625 7626 7627 7628 7629 7630 7631 7632 7633 7634 7635 7636 7637 7638 7639 7640 7641 7642 7643 7644 7645 7646 7647 7648 7649 7650 7651 7652 7653 7654 7655 7656 7657 7658 7659 7660 7661 7662 7663 7664 7665 7666 7667 7668 7669 7670 7671 7672 7673 7674 7675 7676 7677 7678 7679 7680 7681 7682 7683 7684 7685 7686 7687 7688 7689 7690 7691 7692 7693 7694 7695 7696 7697 7698 7699 7700 7701 7702 7703 7704 7705 7706 7707 7708 7709 7710 7711 7712 7713 7714 7715 7716 7717 7718 7719 7720 7721 7722 7723 7724 7725 7726 7727 7728 7729 7730 7731 7732 7733 7734 7735 7736 7737 7738 7739 7740 7741 7742 7743 7744 7745 7746 7747 7748 7749 7750 7751 7752 7753 7754 7755 7756 7757 7758 7759 7760 7761 7762 7763 7764 7765 7766 7767 7768 7769 7770 7771 7772 7773 7774 7775 7776 7777 7778 7779 7780 7781 7782 7783 7784 7785 7786 7787 7788 7789 7790 7791 7792 7793 7794 7795 7796 7797 7798 7799 7800 7801 7802 7803 7804 7805 7806 7807 7808 7809 7810 7811 7812 7813 7814 7815 7816 7817 7818 7819 7820 7821 7822 7823 7824 7825 7826 7827 7828 7829 7830 7831 7832 7833 7834 7835 7836 7837 7838 7839 7840 7841 7842 7843 7844 7845 7846 7847 7848 7849 7850 7851 7852 7853 7854 7855 7856 7857 7858 7859 7860 7861 7862 7863 7864 7865 7866 7867 7868 7869 7870 7871 7872 7873 7874 7875 7876 7877 7878 7879 7880 7881 7882 7883 7884 7885 7886 7887 7888 7889 7890 7891 7892 7893 7894 7895 7896 7897 7898 7899 7900 7901 7902 7903 7904 7905 7906 7907 7908 7909 7910 7911 7912 7913 7914 7915 7916 7917 7918 7919 7920 7921 7922 7923 7924 7925 7926 7927 7928 7929 7930 7931 7932 7933 7934 7935 7936 7937 7938 7939 7940 7941 7942 7943 7944 7945 7946 7947 7948 7949 7950 7951 7952 7953 7954 7955 7956 7957 7958 7959 7960 7961 7962 7963 7964 7965 7966 7967 7968 7969 7970 7971 7972 7973 7974 7975 7976 7977 7978 7979 7980 7981 7982 7983 7984 7985 7986 7987 7988 7989 7990 7991 7992 7993 7994 7995 7996 7997 7998 7999 8000 8001 8002 8003 8004 8005 8006 8007 8008 8009 8010 8011 8012 8013 8014 8015 8016 8017 8018 8019 8020 8021 8022 8023 8024 8025 8026 8027 8028 8029 8030 8031 8032 8033 8034 8035 8036 8037 8038 8039 8040 8041 8042 8043 8044 8045 8046 8047 8048 8049 8050 8051 8052 8053 8054 8055 8056 8057 8058 8059 8060 8061 8062 8063 8064 8065 8066 8067 8068 8069 8070 8071 8072 8073 8074 8075 8076 8077 8078 8079 8080 8081 8082 8083 8084 8085 8086 8087 8088 8089 8090 8091 8092 8093 8094 8095 8096 8097 8098 8099 8100 8101 8102 8103 8104 8105 8106 8107 8108 8109 8110 8111 8112 8113 8114 8115 8116 8117 8118 8119 8120 8121 8122 8123 8124 8125 8126 8127 8128 8129 8130 8131 8132 8133 8134 8135 8136 8137 8138 8139 8140 8141 8142 8143 8144 8145 8146 8147 8148 8149 8150 8151 8152 8153 8154 8155 8156 8157 8158 8159 8160 8161 8162 8163 8164 8165 8166 8167 8168 8169 8170 8171 8172 8173 8174 8175 8176 8177 8178 8179 8180 8181 8182 8183 8184 8185 8186 8187 8188 8189 8190 8191 8192 8193 8194 8195 8196 8197 8198 8199 8200 8201 8202 8203 8204 8205 8206 8207 8208 8209 8210 8211 8212 8213 8214 8215 8216 8217 8218 8219 8220 8221 8222 8223 8224 8225 8226 8227 8228 8229 8230 8231 8232 8233 8234 8235 8236 8237 8238 8239 8240 8241 8242 8243 8244 8245 8246 8247 8248 8249 8250 8251 8252 8253 8254 8255 8256 8257 8258 8259 8260 8261 8262 8263 8264 8265 8266 8267 8268 8269 8270 8271 8272 8273 8274 8275 8276 8277 8278 8279 8280 8281 8282 8283 8284 8285 8286 8287 8288 8289 8290 8291 8292 8293 8294 8295 8296 8297 8298 8299 8300 8301 8302 8303 8304 8305 8306 8307 8308 8309 8310 8311 8312 8313 8314 8315 8316 8317 8318 8319 8320 8321 8322 8323 8324 8325 8326 8327 8328 8329 8330 8331 8332 8333 8334 8335 8336 8337 8338 8339 8340 8341 8342 8343 8344 8345 8346 8347 8348 8349 8350 8351 8352 8353 8354 8355 8356 8357 8358 8359 8360 8361 8362 8363 8364 8365 8366 8367 8368 8369 8370 8371 8372 8373 8374 8375 8376 8377 8378 8379 8380 8381 8382 8383 8384 8385 8386 8387 8388 8389 8390 8391 8392 8393 8394 8395 8396 8397 8398 8399 8400 8401 8402 8403 8404 8405 8406 8407 8408 8409 8410 8411 8412 8413 8414 8415 8416 8417 8418 8419 8420 8421 8422 8423 8424 8425 8426 8427 8428 8429 8430 8431 8432 8433 8434 8435 8436 8437 8438 8439 8440 8441 8442 8443 8444 8445 8446 8447 8448 8449 8450 8451 8452 8453 8454 8455 8456 8457 8458 8459 8460 8461 8462 8463 8464 8465 8466 8467 8468 8469 8470 8471 8472 8473 8474 8475 8476 8477 8478 8479 8480 8481 8482 8483 8484 8485 8486 8487 8488 8489 8490 8491 8492 8493 8494 8495 8496 8497 8498 8499 8500 8501 8502 8503 8504 8505 8506 8507 8508 8509 8510 8511 8512 8513 8514 8515 8516 8517 8518 8519 8520 8521 8522 8523 8524 8525 8526 8527 8528 8529 8530 8531 8532 8533 8534 8535 8536 8537 8538 8539 8540 8541 8542 8543 8544 8545 8546 8547 8548 8549 8550 8551 8552 8553 8554 8555 8556 8557 8558 8559 8560 8561 8562 8563 8564 8565 8566 8567 8568 8569 8570 8571 8572 8573 8574 8575 8576 8577 8578 8579 8580 8581 8582 8583 8584 8585 8586 8587 8588 8589 8590 8591 8592 8593 8594 8595 8596 8597 8598 8599 8600 8601 8602 8603 8604 8605 8606 8607 8608 8609 8610 8611 8612 8613 8614 8615 8616 8617 8618 8619 8620 8621 8622 8623 8624 8625 8626 8627 8628 8629 8630 8631 8632 8633 8634 8635 8636 8637 8638 8639 8640 8641 8642 8643 8644 8645 8646 8647 8648 8649 8650 8651 8652 8653 8654 8655 8656 8657 8658 8659 8660 8661 8662 8663 8664 8665 8666 8667 8668 8669 8670 8671 8672 8673 8674 8675 8676 8677 8678 8679 8680 8681 8682 8683 8684 8685 8686 8687 8688 8689 8690 8691 8692 8693 8694 8695 8696 8697 8698 8699 8700 8701 8702 8703 8704 8705 8706 8707 8708 8709 8710 8711 8712 8713 8714 8715 8716 8717 8718 8719 8720 8721 8722 8723 8724 8725 8726 8727 8728 8729 8730 8731 8732 8733 8734 8735 8736 8737 8738 8739 8740 8741 8742 8743 8744 8745 8746 8747 8748 8749 8750 8751 8752 8753 8754 8755 8756 8757 8758 8759 8760 8761 8762 8763 8764 8765 8766 8767 8768 8769 8770 8771 8772 8773 8774 8775 8776 8777 8778 8779 8780 8781 8782 8783 8784 8785 8786 8787 8788 8789 8790 8791 8792 8793 8794 8795 8796 8797 8798 8799 8800 8801 8802 8803 8804 8805 8806 8807 8808 8809 8810 8811 8812 8813 8814 8815 8816 8817 8818 8819 8820 8821 8822 8823 8824 8825 8826 8827 8828 8829 8830 8831 8832 8833 8834 8835 8836 8837 8838 8839 8840 8841 8842 8843 8844 8845 8846 8847 8848 8849 8850 8851 8852 8853 8854 8855 8856 8857 8858 8859 8860 8861 8862 8863 8864 8865 8866 8867 8868 8869 8870 8871 8872 8873 8874 8875 8876 8877 8878 8879 8880 8881 8882 8883 8884 8885 8886 8887 8888 8889 8890 8891 8892 8893 8894 8895 8896 8897 8898 8899 8900 8901 8902 8903 8904 8905 8906 8907 8908 8909 8910 8911 8912 8913 8914 8915 8916 8917 8918 8919 8920 8921 8922 8923 8924 8925 8926 8927 8928 8929 8930 8931 8932 8933 8934 8935 8936 8937 8938 8939 8940 8941 8942 8943 8944 8945 8946 8947 8948 8949 8950 8951 8952 8953 8954 8955 8956 8957 8958 8959 8960 8961 8962 8963 8964 8965 8966 8967 8968 8969 8970 8971 8972 8973 8974 8975 8976 8977 8978 8979 8980 8981 8982 8983 8984 8985 8986 8987 8988 8989 8990 8991 8992 8993 8994 8995 8996 8997 8998 8999 9000 9001 9002 9003 9004 9005 9006 9007 9008 9009 9010 9011 9012 9013 9014 9015 9016 9017 9018 9019 9020 9021 9022 9023 9024 9025 9026 9027 9028 9029 9030 9031 9032 9033 9034 9035 9036 9037 9038 9039 9040 9041 9042 9043 9044 9045 9046 9047 9048 9049 9050 9051 9052 9053 9054 9055 9056 9057 9058 9059 9060 9061 9062 9063 9064 9065 9066 9067 9068 9069 9070 9071 9072 9073 9074 9075 9076 9077 9078 9079 9080 9081 9082 9083 9084 9085 9086 9087 9088 9089 9090 9091 9092 9093 9094 9095 9096 9097 9098 9099 9100 9101 9102 9103 9104 9105 9106 9107 9108 9109 9110 9111 9112 9113 9114 9115 9116 9117 9118 9119 9120 9121 9122 9123 9124 9125 9126 9127 9128 9129 9130 9131 9132 9133 9134 9135 9136 9137 9138 9139 9140 9141 9142 9143 9144 9145 9146 9147 9148 9149 9150 9151 9152 9153 9154 9155 9156 9157 9158 9159 9160 9161 9162 9163 9164 9165 9166 9167 9168 9169 9170 9171 9172 9173 9174 9175 9176 9177 9178 9179 9180 9181 9182 9183 9184 9185 9186 9187 9188 9189 9190 9191 9192 9193 9194 9195 9196 9197 9198 9199 9200 9201 9202 9203 9204 9205 9206 9207 9208 9209 9210 9211 9212 9213 9214 9215 9216 9217 9218 9219 9220 9221 9222 9223 9224 9225 9226 9227 9228 9229 9230 9231 9232 9233 9234 9235 9236 9237 9238 9239 9240 9241 9242 9243 9244 9245 9246 9247 9248 9249 9250 9251 9252 9253 9254 9255 9256 9257 9258 9259 9260 9261 9262 9263 9264 9265 9266 9267 9268 9269 9270 9271 9272 9273 9274 9275 9276 9277 9278 9279 9280 9281 9282 9283 9284 9285 9286 9287 9288 9289 9290 9291 9292 9293 9294 9295 9296 9297 9298 9299 9300 9301 9302 9303 9304 9305 9306 9307 9308 9309 9310 9311 9312 9313 9314 9315 9316 9317 9318 9319 9320 9321 9322 9323 9324 9325 9326 9327 9328 9329 9330 9331 9332 9333 9334 9335 9336 9337 9338 9339 9340 9341 9342 9343 9344 9345 9346 9347 9348 9349 9350 9351 9352 9353 9354 9355 9356 9357 9358 9359 9360 9361 9362 9363 9364 9365 9366 9367 9368 9369 9370 9371 9372 9373 9374 9375 9376 9377 9378 9379 9380 9381 9382 9383 9384 9385 9386 9387 9388 9389 9390 9391 9392 9393 9394 9395 9396 9397 9398 9399 9400 9401 9402 9403 9404 9405 9406 9407 9408 9409 9410 9411 9412 9413 9414 9415 9416 9417 9418 9419 9420 9421 9422 9423 9424 9425 9426 9427 9428 9429 9430 9431 9432 9433 9434 9435 9436 9437 9438 9439 9440 9441 9442 9443 9444 9445 9446 9447 9448 9449 9450 9451 9452 9453 9454 9455 9456 9457 9458 9459 9460 9461 9462 9463 9464 9465 9466 9467 9468 9469 9470 9471 9472 9473 9474 9475 9476 9477 9478 9479 9480 9481 9482 9483 9484 9485 9486 9487 9488 9489 9490 9491 9492 9493 9494 9495 9496 9497 9498 9499 9500 9501 9502 9503 9504 9505 9506 9507 9508 9509 9510 9511 9512 9513 9514 9515 9516 9517 9518 9519 9520 9521 9522 9523 9524 9525 9526 9527 9528 9529 9530 9531 9532 9533 9534 9535 9536 9537 9538 9539 9540 9541 9542 9543 9544 9545 9546 9547 9548 9549 9550 9551 9552 9553 9554 9555 9556 9557 9558 9559 9560 9561 9562 9563 9564 9565 9566 9567 9568 9569 9570 9571 9572 9573 9574 9575 9576 9577 9578 9579 9580 9581 9582 9583 9584 9585 9586 9587 9588 9589 9590 9591 9592 9593 9594 9595 9596 9597 9598 9599 9600 9601 9602 9603 9604 9605 9606 9607 9608 9609 9610 9611 9612 9613 9614 9615 9616 9617 9618 9619 9620 9621 9622 9623 9624 9625 9626 9627 9628 9629 9630 9631 9632 9633 9634 9635 9636 9637 9638 9639 9640 9641 9642 9643 9644 9645 9646 9647 9648 9649 9650 9651 9652 9653 9654 9655 9656 9657 9658 9659 9660 9661 9662 9663 9664 9665 9666 9667 9668 9669 9670 9671 9672 9673 9674 9675 9676 9677 9678 9679 9680 9681 9682 9683 9684 9685 9686 9687 9688 9689 9690 9691 9692 9693 9694 9695 9696 9697 9698 9699 9700 9701 9702 9703 9704 9705 9706 9707 9708 9709 9710 9711 9712 9713 9714 9715 9716 9717 9718 9719 9720 9721 9722 9723 9724 9725 9726 9727 9728 9729 9730 9731 9732 9733 9734 9735 9736 9737 9738 9739 9740 9741 9742 9743 9744 9745 9746 9747 9748 9749 9750 9751 9752 9753 9754 9755 9756 9757 9758 9759 9760 9761 9762 9763 9764 9765 9766 9767 9768 9769 9770 9771 9772 9773 9774 9775 9776 9777 9778 9779 9780 9781 9782 9783 9784 9785 9786 9787 9788 9789 9790 9791 9792 9793 9794 9795 9796 9797 9798 9799 9800 9801 9802 9803 9804 9805 9806 9807 9808 9809 9810 9811 9812 9813 9814 9815 9816 9817 9818 9819 9820 9821 9822 9823 9824 9825 9826 9827 9828 9829 9830 9831 9832 9833 9834 9835 9836 9837 9838 9839 9840 9841 9842 9843 9844 9845 9846 9847 9848 9849 9850 9851 9852 9853 9854 9855 9856 9857 9858 9859 9860 9861 9862 9863 9864 9865 9866 9867 9868 9869 9870 9871 9872 9873 9874 9875 9876 9877 9878 9879 9880 9881 9882 9883 9884 9885 9886 9887 9888 9889 9890 9891 9892 9893 9894 9895 9896 9897 9898 9899 9900 9901 9902 9903 9904 9905 9906 9907 9908 9909 9910 9911 9912 9913 9914 9915 9916 9917 9918 9919 9920 9921 9922 9923 9924 9925 9926 9927 9928 9929 9930 9931 9932 9933 9934 9935 9936 9937 9938 9939 9940 9941 9942 9943 9944 9945 9946 9947 9948 9949 9950 9951 9952 9953 9954 9955 9956 9957 9958 9959 9960 9961 9962 9963 9964 9965 9966 9967 9968 9969 9970 9971 9972 9973 9974 9975 9976 9977 9978 9979 9980 9981 9982 9983 9984 9985 9986 9987 9988 9989 9990 9991 9992 9993 9994 9995 9996 9997 9998 9999 10000 10001 10002 10003 10004 10005 10006 10007 10008 10009 10010 10011 10012 10013 10014 10015 10016 10017 10018 10019 10020 10021 10022 10023 10024 10025 10026 10027 10028 10029 10030 10031 10032 10033 10034 10035 10036 10037 10038 10039 10040 10041 10042 10043 10044 10045 10046 10047 10048 10049 10050 10051 10052 10053 10054 10055 10056 10057 10058 10059 10060 10061 10062 10063 10064 10065 10066 10067 10068 10069 10070 10071 10072 10073 10074 10075 10076 10077 10078 10079 10080 10081 10082 10083 10084 10085 10086 10087 10088 10089 10090 10091 10092 10093 10094 10095 10096 10097 10098 10099 10100 10101 10102 10103 10104 10105 10106 10107 10108 10109 10110 10111 10112 10113 10114 10115 10116 10117 10118 10119 10120 10121 10122 10123 10124 10125 10126 10127 10128 10129 10130 10131 10132 10133 10134 10135 10136 10137 10138 10139 10140 10141 10142 10143 10144 10145 10146 10147 10148 10149 10150 10151 10152 10153 10154 10155 10156 10157 10158 10159 10160 10161 10162 10163 10164 10165 10166 10167 10168 10169 10170 10171 10172 10173 10174 10175 10176 10177 10178 10179 10180 10181 10182 10183 10184 10185 10186 10187 10188 10189 10190 10191 10192 10193 10194 10195 10196 10197 10198 10199 10200 10201 10202 10203 10204 10205 10206 10207 10208 10209 10210 10211 10212 10213 10214 10215 10216 10217 10218 10219 10220 10221 10222 10223 10224 10225 10226 10227 10228 10229 10230 10231 10232 10233 10234 10235 10236 10237 10238 10239 10240 10241 10242 10243 10244 10245 10246 10247 10248 10249 10250 10251 10252 10253 10254 10255 10256 10257 10258 10259 10260 10261 10262 10263 10264 10265 10266 10267 10268 10269 10270 10271 10272 10273 10274 10275 10276 10277 10278 10279 10280 10281 10282 10283 10284 10285 10286 10287 10288 10289 10290 10291 10292 10293 10294 10295 10296 10297 10298 10299 10300 10301 10302 10303 10304 10305 10306 10307 10308 10309 10310 10311 10312 10313 10314 10315 10316 10317 10318 10319 10320 10321 10322 10323 10324 10325 10326 10327 10328 10329 10330 10331 10332 10333 10334 10335 10336 10337 10338 10339 10340 10341 10342 10343 10344 10345 10346 10347 10348 10349 10350 10351 10352 10353 10354 10355 10356 10357 10358 10359 10360 10361 10362 10363 10364 10365 10366 10367 10368 10369 10370 10371 10372 10373 10374 10375 10376 10377 10378 10379 10380 10381 10382 10383 10384 10385 10386 10387 10388 10389 10390 10391 10392 10393 10394 10395 10396 10397 10398 10399 10400 10401 10402 10403 10404 10405 10406 10407 10408 10409 10410 10411 10412 10413 10414 10415 10416 10417 10418 10419 10420 10421 10422 10423 10424 10425 10426 10427 10428 10429 10430 10431 10432 10433 10434 10435 10436 10437 10438 10439 10440 10441 10442 10443 10444 10445 10446 10447 10448 10449 10450 10451 10452 10453 10454 10455 10456 10457 10458 10459 10460 10461 10462 10463 10464 10465 10466 10467 10468 10469 10470 10471 10472 10473 10474 10475 10476 10477 10478 10479 10480 10481 10482 10483 10484 10485 10486 10487 10488 10489 10490 10491 10492 10493 10494 10495 10496 10497 10498 10499 10500 10501 10502 10503 10504 10505 10506 10507 10508 10509 10510 10511 10512 10513 10514 10515 10516 10517 10518 10519 10520 10521 10522 10523 10524 10525 10526 10527 10528 10529 10530 10531 10532 10533 10534 10535 10536 10537 10538 10539 10540 10541 10542 10543 10544 10545 10546 10547 10548 10549 10550 10551 10552 10553 10554 10555 10556 10557 10558 10559 10560 10561 10562 10563 10564 10565 10566 10567 10568 10569 10570 10571 10572 10573 10574 10575 10576 10577 10578 10579 10580 10581 10582 10583 10584 10585 10586 10587 10588 10589 10590 10591 10592 10593 10594 10595 10596 10597 10598 10599 10600 10601 10602 10603 10604 10605 10606 10607 10608 10609 10610 10611 10612 10613 10614 10615 10616 10617 10618 10619 10620 10621 10622 10623 10624 10625 10626 10627 10628 10629 10630 10631 10632 10633 10634 10635 10636 10637 10638 10639 10640 10641 10642 10643 10644 10645 10646 10647 10648 10649 10650 10651 10652 10653 10654 10655 10656 10657 10658 10659 10660 10661 10662 10663 10664 10665 10666 10667 10668 10669 10670 10671 10672 10673 10674 10675 10676 10677 10678 10679 10680 10681 10682 10683 10684 10685 10686 10687 10688 10689 10690 10691 10692 10693 10694 10695 10696 10697 10698 10699 10700 10701 10702 10703 10704 10705 10706 10707 10708 10709 10710 10711 10712 10713 10714 10715 10716 10717 10718 10719 10720 10721 10722 10723 10724 10725 10726 10727 10728 10729 10730 10731 10732 10733 10734 10735 10736 10737 10738 10739 10740 10741 10742 10743 10744 10745 10746 10747 10748 10749 10750 10751 10752 10753 10754 10755 10756 10757 10758 10759 10760 10761 10762 10763 10764 10765 10766 10767 10768 10769 10770 10771 10772 10773 10774 10775 10776 10777 10778 10779 10780 10781 10782 10783 10784 10785 10786 10787 10788 10789 10790 10791 10792 10793 10794 10795 10796 10797 10798 10799 10800 10801 10802 10803 10804 10805 10806 10807 10808 10809 10810 10811 10812 10813 10814 10815 10816 10817 10818 10819 10820 10821 10822 10823 10824 10825 10826 10827 10828 10829 10830 10831 10832 10833 10834 10835 10836 10837 10838 10839 10840 10841 10842 10843 10844 10845 10846 10847 10848 10849 10850 10851 10852 10853 10854 10855 10856 10857 10858 10859 10860 10861 10862 10863 10864 10865 10866 10867 10868 10869 10870 10871 10872 10873 10874 10875 10876 10877 10878 10879 10880 10881 10882 10883 10884 10885 10886 10887 10888 10889 10890 10891 10892 10893 10894 10895 10896 10897 10898 10899 10900 10901 10902 10903 10904 10905 10906 10907 10908 10909 10910 10911 10912 10913 10914 10915 10916 10917 10918 10919 10920 10921 10922 10923 10924 10925 10926 10927 10928 10929 10930 10931 10932 10933 10934 10935 10936 10937 10938 10939 10940 10941 10942 10943 10944 10945 10946 10947 10948 10949 10950 10951 10952 10953 10954 10955 10956 10957 10958 10959 10960 10961 10962 10963 10964 10965 10966 10967 10968 10969 10970 10971 10972 10973 10974 10975 10976 10977 10978 10979 10980 10981 10982 10983 10984 10985 10986 10987 10988 10989 10990 10991 10992 10993 10994 10995 10996 10997 10998 10999 11000 11001 11002 11003 11004 11005 11006 11007 11008 11009 11010 11011 11012 11013 11014 11015 11016 11017 11018 11019 11020 11021 11022 11023 11024 11025 11026 11027 11028 11029 11030 11031 11032 11033 11034 11035 11036 11037 11038 11039 11040 11041 11042 11043 11044 11045 11046 11047 11048 11049 11050 11051 11052 11053 11054 11055 11056 11057 11058 11059 11060 11061 11062 11063 11064 11065 11066 11067 11068 11069 11070 11071 11072 11073 11074 11075 11076 11077 11078 11079 11080 11081 11082 11083 11084 11085 11086 11087 11088 11089 11090 11091 11092 11093 11094 11095 11096 11097 11098 11099 11100 11101 11102 11103 11104 11105 11106 11107 11108 11109 11110 11111 11112 11113 11114 11115 11116 11117 11118 11119 11120 11121 11122 11123 11124 11125 11126 11127 11128 11129 11130 11131 11132 11133 11134 11135 11136 11137 11138 11139 11140 11141 11142 11143 11144 11145 11146 11147 11148 11149 11150 11151 11152 11153 11154 11155 11156 11157 11158 11159 11160 11161 11162 11163 11164 11165 11166 11167 11168 11169 11170 11171 11172 11173 11174 11175 11176 11177 11178 11179 11180 11181 11182 11183 11184 11185 11186 11187 11188 11189 11190 11191 11192 11193 11194 11195 11196 11197 11198 11199 11200 11201 11202 11203 11204 11205 11206 11207 11208 11209 11210 11211 11212 11213 11214 11215 11216 11217 11218 11219 11220 11221 11222 11223 11224 11225 11226 11227 11228 11229 11230 11231 11232 11233 11234 11235 11236 11237 11238 11239 11240 11241 11242 11243 11244 11245 11246 11247 11248 11249 11250 11251 11252 11253 11254 11255 11256 11257 11258 11259 11260 11261 11262 11263 11264 11265 11266 11267 11268 11269 11270 11271 11272 11273 11274 11275 11276 11277 11278 11279 11280 11281 11282 11283 11284 11285 11286 11287 11288 11289 11290 11291 11292 11293 11294 11295 11296 11297 11298 11299 11300 11301 11302 11303 11304 11305 11306 11307 11308 11309 11310 11311 11312 11313 11314 11315 11316 11317 11318 11319 11320 11321 11322 11323 11324 11325 11326 11327 11328 11329 11330 11331 11332 11333 11334 11335 11336 11337 11338 11339 11340 11341 11342 11343 11344 11345 11346 11347 11348 11349 11350 11351 11352 11353 11354 11355 11356 11357 11358 11359 11360 11361 11362 11363 11364 11365 11366 11367 11368 11369 11370 11371 11372 11373 11374 11375 11376 11377 11378 11379 11380 11381 11382 11383 11384 11385 11386 11387 11388 11389 11390 11391 11392 11393 11394 11395 11396 11397 11398 11399 11400 11401 11402 11403 11404 11405 11406 11407 11408 11409 11410 11411 11412 11413 11414 11415 11416 11417 11418 11419 11420 11421 11422 11423 11424 11425 11426 11427 11428 11429 11430 11431 11432 11433 11434 11435 11436 11437 11438 11439 11440 11441 11442 11443 11444 11445 11446 11447 11448 11449 11450 11451 11452 11453 11454 11455 11456 11457 11458 11459 11460 11461 11462 11463 11464 11465 11466 11467 11468 11469 11470 11471 11472 11473 11474 11475 11476 11477 11478 11479 11480 11481 11482 11483 11484 11485 11486 11487 11488 11489 11490 11491 11492 11493 11494 11495 11496 11497
|
Xapian-core 1.4.11 (2019-03-02):
API:
* MSet::SNIPPET_CJK_NGRAM - new flag for use with MSet::snippet() to enable
support for selecting and highlighting snippets which works with the
QueryParser and TermGenerator FLAG_CJK_NGRAM flags. This mode can also be
enabled by setting environment variable XAPIAN_CJK_NGRAM to a non-empty
value. (There was nominally already support for XAPIAN_CJK_NGRAM in
MSet::snippet(), but it didn't work usefully - the highlighting added was all
empty start/end pairs at the end of the span of CJK characters containing the
CJK ngram terms, which to the user would typically look like it was selecting
the end of the text and not highlighting anything).
* Deprecate XAPIAN_CJK_NGRAM environment variable. There are now flags which
can be used instead in all cases, and there's sadly no portable thread-safe
way to read an environment variable so checking environment variables is
problematic in library code that may be used in multithreaded programs.
* Query::OP_ELITE_SET currently incorrectly recursively flattens any OP_OR (or
OP_OR-like) subqueries into the list of subqueries it selects from - until
that's fixed, we now select from the full exploded list rather than the last
n (where n is the number of direct subqueries of the OP_ELITE_SET).
testsuite:
* Testcases which need a generated database now get run with a sharded
database.
* Avoid using strerror() in the testsuite which removes an obstacle to running
tests in parallel in separate threads.
matcher:
* Extend detection of cases of OP_SYNONYM with disjoint subqueries (which means
we don't need document length) which was added in 1.4.8 - we now detect when
all subqueries are different terms, or when all subqueries are
non-overlapping wildcards. The second case is what QueryParser produces for
a wildcard or partial query with a query prefix which maps to more than one
term prefix.
glass backend:
* Handle an empty value slot lower bound gracefully. This shouldn't happen for
a non-empty slot, but has been reported by a notmuch user so it seems there
is (or perhaps was as the database was several years old) a way it can come
about. We now check for this situation and set the smallest possible valid
lower bound instead, so other code assuming a valid lower bound will work
correctly. Reported by jb55.
chert backend:
* Handle an empty value slot lower bound gracefully, equivalent to the change
made for glass.
documentation:
* HACKING: We no longer use auto_ptr<>.
* NEWS: Correct factual error in old entry - the 0.4.1 release was Open Muscat
not OmSee (the OmSee name was only applied after that final release was made,
and only used internally to BrightStation).
portability:
* Suppress more clang -Wself-assign-overloaded warnings in testcases which are
deliberately testing handling of self-assignment.
* Add missing includes of <cerrno>. Fixes #776, reported by Matthieu Gautier.
debug code:
* When configured with --enable-log, the O_SYNC flag was always specified when
opening the logfile, with the intention that the most recent log entries
wouldn't get lost if there was a crash, but O_SYNC can incur a significant
performance overhead and most debugging is not of such crashes. So we no
longer specify O_SYNC by default, but you can now request synchronous logging
by including %! anywhere in the filename specified with XAPIAN_DEBUG_LOG
(the %! is replaced with the empty string). We also now use O_DSYNC if
available in preference to O_SYNC, since the mtime of the log file isn't
important.
Xapian-core 1.4.10 (2019-02-12):
API:
* DatabaseClosedError: New exception class thrown instead of DatabaseError when
an operation is attempted which can't be completed because it involves a
database which close() was previously called on. DatabaseClosedError is a
subclass of DatabaseError so existing code catching DatabaseError will still
work as before. Fixes #772, reported by Germán M. Bravo. Patch from
Vaibhav Kansagara.
* DatabaseNotFoundError: New exception class thrown instead of
DatabaseOpeningError when the problem is the problem is "file not found" or
similar. DatabaseNotFoundError is a subclass of DatabaseOpeningError so
existing code catching DatabaseOpeningError will still work as before. Fixes
#773, reported by Germán M. Bravo. Patch from Vaibhav Kansagara.
* Query: Make &=, |= and ^= on Query objects opportunistically append to
an existing query with a matching query operator which has a reference
count of 1. This provides an easy way to incrementally build flatter query
trees.
* Query: Support `query &= ~query2` better - this now is handled exactly
equivalent to `query = query & ~query2` and gives `query AND_NOT query2`
instead of `query AND (<alldocuments> AND_NOT query2)`.
* QueryParser: Now uses &=, |= and ^= to produce flatter query trees. This
fixes problems with running out of stack space when handling Query object
trees built by abusing QueryParser to parse very large machine-generated
queries.
* Stopper: Fix incorrect accents in Hungarian stopword list. Patch from David
Corbett.
testsuite:
* Test MSet::snippet() with small and zero lengths. Fixes #759. Patch from
Vaibhav Kansagara.
* Fix testcase stubdb4 annotations - this testcase doesn't need a backend.
* Add PATH annotation for testcases needing get_database_path() to avoid having
to repeatedly list the backends where this is supported in testcase
annotations.
* TEST_EXCEPTION helper macro now checks that the exact specified exception
type is thrown. Previously it would allow a subclass of the specified
exception type, but in testcases we really want to be able to test for an
exact type. Issue noted by Vaibhav Kansagara on IRC.
matcher:
* Map OP_VALUE_GE/OP_VALUE_LE on an empty slot to EmptyPostList. We already do
this for OP_VALUE_RANGE, and it's a little more efficient than creating a
postlist object which checks the empty value slot.
glass backend:
* We no longer flush all pending positional changes when a postlist, termlist
or all-terms is opened on a modified WritableDatabase. Doing so was
incurring a significant performance cost, and the first of these happens
internally when `replace_document(term, doc)` is used, which is the usual way
to support non-numeric unique ids. We now only flush pending positional
changes when committing. Reported and diagnosed by Germán M. Bravo.
remote backend:
* Use poll() where available instead of select(). poll() is specified by
POSIX.1-2001 so should be widely available by now, and it allows watching any
fd (select() is limited to watching fds < FD_SETSIZE). For any platforms
which still lack poll() we now workaround this select() limitation when a
high numbered fd needs to be watched (for example, by trying a non-blocking
read or write and on EAGAIN sleeping for a bit before retrying).
* Stop watching fds for "exceptional conditions" - none of these are relevant
to our usage.
* Remove 0.1s timeout in ready_to_read(). The comment says this is to avoid a
busy loop, but that's out of date - the matcher first checks which remotes
are ready to read and then does a second pass to handle those which weren't
with a blocking read.
build system:
* Stop probing for header sys/errno.h which is no longer used - it was only
needed for Compaq C++, support for which was dropped in 1.4.8.
documentation:
* docs/valueranges.html: Update to document RangeProcessor instead of
ValueRangeProcessor - the latter is deprecated and will be gone in the next
release series.
* Document RangeProcessor::operator()() returns OP_INVALID to signal it doesn't
recognise a range.
* Update some URLs for pages which have moved.
* Use https for URLs where available.
* HACKING: Update "empty()" section for changes in C++11.
portability:
* Suppress clang warnings for self-assignment tests. Some testcases trigger
this new-ish clang warning while testing that self-assignment works, which
seems a useful thing to be testing - at least one of these is a regression
test.
* Add std::move to fix clang -Wreturn-std-move warning (which is enabled by
-Wall).
* Add casts to fix ubsan warnings. These cases aren't undefined behaviour, but
are reported by ubsan extra checks implicit-integer-truncation and/or
implicit-conversion which it is useful to be able to enable to catch
potential bugs.
* Fix check for when to use _byteswap_ulong() - in practice this would only
have caused a problem if a platform provided _byteswap_ushort() but not
_byteswap_ulong(), but we're not aware of any which do.
* Fix return values of do_bswap() helpers to match parameter types (previously
we always returned int and only supported swapping types up to 32 bits, so
this probably doesn't result in any behavioural changes).
* Only include <intrin.h> if we'll use it instead of always including it when
it exists. Including <intrin.h> can result in warnings about duplicate
declarations of builtin functions under mingw.
* Remove call to close()/closesocket() when the argument is always -1 (since
the change to use getaddrinfo() in 1.3.3).
Xapian-core 1.4.9 (2018-11-02):
API:
* Document::add_posting(): Fix bugs with the change in 1.4.8 to more
efficiently handle insertion of a batch of extra positions in ascending
order. These could lead to missing positions and corrupted encoded
positional data.
remote backend:
* Avoid hang if remote connection shutdown fails by not waiting for the
connection to close in this situation. Seems to fix occasional hangs seen on
macOS. Patch from Germán M. Bravo.
Xapian-core 1.4.8 (2018-10-25):
API:
* QueryParser,TermGenerator: Add new stemming mode STEM_SOME_FULL_POS.
This stores positional information for both stemmed and unstemmed terms,
allowing NEAR and ADJ to work with stemmed terms. The extra positional
information is likely to take up a significant amount of extra disk space so
the default STEM_SOME is likely to be a better choice for most users.
* Database::check(): Fetch and decompress the document data to catch problems
with the splitting of large data into multiple entries, corruption of the
compressed data, etc. Also check that empty document data isn't explicitly
stored for glass.
* Fix an incorrect type being used for term positions in the TermGenerator API.
These were Xapian::termcount but should be Xapian::termpos. Both are
typedefs for the same 32-bit unsigned integer type by default (almost always
"unsigned int") so this change is entirely compatible, except that if you
were configuring 1.4.7 or earlier with --enable-64bit-termcount you need to
also use the new --enable-64bit-termpos configure option with 1.4.8 and up or
rebuild your applications. This change was necessary to make
--enable-64bit-termpos actually useful.
* Add Document::remove_postings() method which removes all postings in a
specified term position range much more efficiently than by calling
remove_posting() repeatedly. It returns the number of postings removed.
* Fix bugs with handling term positions >= 0x80000000. Reported by Gaurav
Arora.
* Document::add_posting(): More efficiently handle insertion of a batch of
extra positions in ascending order.
* Query: Simplify OP_SYNONYM with single OP_WILDCARD subquery by converting to
OP_WILDCARD with combiner OP_SYNONYM, which means such cases can take
advantage of the new matcher optimisation in this release to avoid needing
document length for OP_WILDCARD with combiner OP_SYNONYM.
testsuite:
* Catch and report std::exception from the test harness itself.
* apitest: Drop special case for not storing doc length in testcase postlist5 -
all backends have stored document lengths for a long time.
* test_harness: Create directories in a race-free way.
matcher:
* Avoid needing document length for an OP_WILDCARD with combiner OP_SYNONYM.
We know that we can't get any duplicate terms in the expansion of a wildcard
so the sum of the wdf from them can't possibly exceed the document length.
* OP_SYNONYM: No longer tries to initialise weights for its subquery, which
should reduce the time taken to set up a large wildcard query.
* OP_SYNONYM: Fix frequency estimates when OP_SYNONYM is used with a
subquery containing OP_XOR or OP_MAX - in such cases the frequency
estimates for the first subquery of the OP_XOR/OP_MAX were used for
all its subqueries. Also the estimated collection frequency is
now rounded to the nearest integer rather than always being rounded
down.
glass backend:
* Revert change made in 1.4.6:
Enable glass's "open_nearby_postlist" optimisation (which especially helps
large wildcard queries) for writable databases without any uncommitted
changes as well.
The amended check isn't conservative enough as there may be postlist changes
in the inverter while the table is unmodified. This breaks testcase
T150-tagging.sh in notmuch's testsuite, reported by David Bremner.
* When indexing a document without any terms we now avoid some unnecessary work
when storing its termlist.
build system:
* New --enable-64bit-termpos configure option which makes Xapian::termpos a
64-bit type and enables support for storing 64-bit termpos values in the
glass backend in an upwardly compatible way. Few people will actually want
to index documents more than 4 billion words long, but the extra numbering
space can be helpful if you want to use term positions in "interesting" ways.
* Hook up configure --disable-sse/--enable-sse=sse options for MSVC.
* Fix configure probes for builtin functions for clang. We need to specify the
argument types for each builtin since otherwise AC_CHECK_DECLS tries to
compile code which just tries to take a pointer to the builtin function
causing clang to give an error saying that's not allowed. If the argument
types are specified then AC_CHECK_DECLS tries to compile a call to the
builtin function instead.
documentation:
* Fix documentation comment typo.
tools:
* xapian-delve: Test for all docs empty using get_total_length() which is
slightly simpler internally than get_avlength(), and avoids an exact floating
point equality check.
examples:
* quest: Support --weight=coord.
* xapian-pos: New tool to show term position info to help debugging when using
positional information in more complex ways.
portability:
* Fix undefined behaviour from C++ ODR violation due to using the same name
two different non-static inline functions. It seems that with current GCC
versions the desired function always ends up being used, but with current
clang the other function is sometimes used, resulting in database corruption
when using value slots in docid 16384 or higher with the default glass
backend. Patch from Germán M. Bravo.
* Suppress alignment cast warning on sparc Linux. The pointer being cast is to
a record returned by getdirentries(), so it should be suitable aligned.
* Drop special handling for Compaq C++. We never actually achieved a working
build using it, and I can find no evidence that this compiler still exists,
let alone that it was updated for C++11 which we now require.
* Create new database directories in race-free way.
* Avoid throwing and handling an exception in replace_document() when
adding a document with a specified docid which is <= last_docid but currently
unused.
* Use our portable code for handling UUIDs on all platforms, and only use
platform-specific code for generating a new UUID. This fixes a bug with
converting UUIDs to and from string representation on FreeBSD, NetBSD and
OpenBSD on little-endian platforms which resulted in reversed byte order in
the first three components, so the same database would report a different
UUID on these platforms compared to other platforms. With this fix, the
UUIDs of existing databases will appear to change on these platforms
(except in rare "palindronic" cases). Reported by Germán M. Bravo.
* Fix to build with a C++17 compiler. Previously we used a "byte" type
internally which clashed with "std::byte" in source files which use
"using namespace std;". Fixes #768, reported by Laurent Stacul.
* Adjust apitest testcase stubdb2 to allow for NetBSD oddity: NetBSD's
getaddrinfo() in IPv4 mode seems to resolve ::1 to an IPv4 address on the
local network.
* Avoid timer_create() on OpenBSD and NetBSD. On OpenBSD it always fails with
ENOSYS (and there's no prototype in the libc headers), while on NetBSD it
seems to work, but the timer never seems to fire, so it's useless to us (see
#770).
* Use SOCK_NONBLOCK if available to avoid a call to fcntl(). It's supported by
at least Linux, FreeBSD, NetBSD and OpenBSD.
* Use O_NOINHERIT for O_CLOEXEC on Windows. This flag has essentially the same
effect, and it's common in other codebases to do this.
* On AIX O_CLOEXEC may be a 64-bit constant which won't fit in an int. To
workaround this stupidity we now call the non-standard open64x() instead
of open() when the flags don't fit in an int.
* Add functions to add/multiply with overflow check. These are implemented
with compiler builtins or equivalent where possible, so the overflow check
will typically just require a check of the processor's overflow or carry
flag.
Xapian-core 1.4.7 (2018-07-19):
API:
* Database::check(): Fix bogus error reports for documents with length zero
due to a new check added in 1.4.6 that the doclength was between the stored
upper and lower bounds, which failed to allow for the lower bound ignoring
documents with length zero (since documents indexed only by boolean terms
aren't involved in weighted searches). Reported by David Bremner.
* Query: Use of Query::MatchAll in multithreaded code causes problems because
the reference counting gets messed up by concurrent updates. Document that
Query(string()) should be used instead of MatchAll in multithreaded code, and
avoid using it in library code. Reported by Germán M. Bravo.
* Stem:
+ Stemming algorithms added for Irish, Lithuanian, Nepali and Tamil.
+ Merge Snowball compiler changes which improve code generation.
+ Merge optimisations to the Arabic and Turkish stemmers.
testsuite:
+ Fix duplicate test in apitest closedb10 testcase. Patch from Guruprasad
Hegde.
glass backend:
* A long-lived cursor on a table in a WritableDatabase could get into
an invalid state, which typically resulted in a DatabaseCorruptError
being thrown with the message:
Db block overwritten - are there multiple writers?
But in fact the on-disk database is not corrupted - it's just that
the cursor in memory has got into an inconsistent state. It looks
like we'll always detect the inconsistency before it can cause on-disk
corruption but it's hard to be completely certain.
The bug is in code to rebuild the cursor when the underlying table
changes in ways which require that, which is a fairly rare occurrence
to start with, and only triggers when a block in the cursor has been
released, reallocated, and we tried to load it in the cursor at the
same level - the cursor wrongly assumes it has the current version
of the block.
Reported with a reproducer by Sylvain Taverne. Confirmed by David
Bremner as also fixing a problem in notmuch for which he hadn't managed
to find a reduced reproducer.
documentation:
* INSTALL: Document need to have MSVC command line tools on PATH.
portability:
* Cygwin: Work around oddity where unlink() sometimes seems to indicate failure
with errno set to ECHILD.
Xapian-core 1.4.6 (2018-07-02):
API:
* API classes now support C++11 move semantics when using a compiler which
we are confident supports them (currently compilers which define
__cplusplus >= 201103 plus a special check for MSVC 2015 or later).
C++11 move semantics provide a clean and efficient way for threaded code to
hand-off Xapian objects to worker threads, but in this case it's very
unhelpful for availability of these semantics to vary by compiler as it
quietly leads to a build with non-threadsafe behaviour. To address this,
user code can #define XAPIAN_MOVE_SEMANTICS before #include <xapian.h> to
force this on, and will then get a compilation failure if the compiler lacks
suitable support.
* MSet::snippet():
+ We were only escaping output for HTML/XML in some cases, which would
potentially allow HTML to be injected into output (this has been assigned
CVE-2018-0499).
+ Include certain leading non-word characters in snippets. Previously we
started the snippet at the start of the first actual word, but there are
various cases where including non-word characters in front of the actual
word adds useful context or otherwise aids comprehension. Reported by
Robert Stepanek in https://github.com/xapian/xapian/pull/180
* Add MSetIterator::get_sort_key() method. The sort key has always been
available internally, but wasn't exposed via the public API before, which
seems like an oversight as the collapse key has long been available.
Reported by 张少华 on xapian-discuss.
* Database::compact():
+ Allow Compactor::resolve_duplicate_metadata() implementations to delete
entries. Previously if an implementation returned an empty string this
would result in a user meta-data entry with an empty value, which isn't
normally achievable (empty meta-data values aren't stored), and so will
cause odd behaviour. We now handle an empty returned value by interpreting
it in the natural way - it means that the merged result is to not set a
value for that key in the output database.
+ Since 1.3.5 compacting a WritableDatabase with uncommitted changes throws
Xapian::InvalidOperationError when compacting to a single-file glass
database. This release adds similar checks for chert and when compacting
to a multiple-file glass database.
+ In the unlikely event that the total number of documents or the total
length of all documents overflow when trying to compact a multi-database,
we throw an exception. This is now a DatabaseError exception instead of a
const char* exception (a hang-over from before this code was turned into a
public API in the library).
* Document::remove_term(): Handle removing term at current TermIterator
position - previously the underlying iterator was invalidated, leading to
undefined behaviour (typically a segmentation fault). Reported by Gaurav
Arora.
* TermIterator::get_termfreq() now always returns an exact answer. Previously
for multi-databases we approximated the result, which is probably either a
hang-over from when this method was used during Enquire::get_eset(), or else
due to a thinking that this method would be used in that situation (it
certainly is not now). If the user creates a TermIterator object and asks it
for term frequencies then we really should give them the correct answer - it
isn't hugely costly and the documentation doesn't warn that it might be
approximated.
* QueryParser::parse_query():
+ Now adds a colon after the prefix when prefixing a boolean term which
starts with a colon. This means the mapping is reversible, and matches
what omega actually does in this case when it tries to reverse the mapping.
Thanks to Andy Chilton for pointing out this corner case.
+ The parser now makes use of newer features in the lemon parser generator to
make parsing faster and use less memory.
* Enquire::get_mset(): Fix bug with get_mset(0, 0, X) when X > 0 which was
causing an attempt to access an element in an empty vector. Reported by
sielicki in #xapian.
* Stem:
+ Add Indonesian stemming algorithm.
+ Small optimisations to almost all stemming algorithms.
* Stopper:
+ Add Indonesian stopword list.
+ The installed version of the Finnish stopword list now has one word per
line. Previously it had several space-separated words on some lines, which
works with C++'s std::istream_iterator but may be inconvenient for use from
some other languages.
+ The installed versions of stopword lists are now sorted in byte order
rather than whatever collation order is specified by LC_COLLATE or similar
at build time. This makes the build more reproducible, and also may be
more efficient for loading into some data structures.
* WritableDatabase::replace_document(term, doc): Check for last_docid wrapping
when used on a sharded database.
* Database::locked(): Consistently throw FeatureUnavailableError on platforms
where we can't test for a database lock without trying to take it.
Previously GNU Hurd threw DatabaseLockError while platforms where we don't
use fcntl() locking at all threw UnimplementedError.
* Database and WritableDatabase constructors: Fix handling of entries for
disabled backends in stub database files to throw FeatureUnavailableError
instead of DatabaseError.
* Database::get_value_lower_bound() now works correctly for sharded databases.
Previously it returned the empty string if any shard had no values in the
specified slot.
* PostingIterator was failing to keep an internal reference to the parent
Database object for sharded databases.
* ValueIterator::skip_to() and check() had an off-by-one error in their docid
calculations in some cases with sharded databases.
testsuite:
* apitest:
+ Enable testcases flagged metadata, synonym and/or writable to run on
sharded databases.
+ Enable testcases flagged writable to run on sharded databases. Writing to
a sharded WritableDatabase has been supported since 1.3.2, but the test
harness wasn't running many of the tests that could be with a sharded
WritableDatabase. This uncovered three bugs which are fixed in this
release.
+ Support "generated" testcases for the inmemory backend, which uncovered a
bug which is fixed in this release.
+ Skip testcase testlock1 on platforms that don't allow us to implement
Database::locked() (which notably include GNU Hurd and Microsoft Windows).
+ Disable testlock2 on sharded databases as it fails for platforms which
don't actually support testing the lock.
+ Extend tests of behaviour after database close. Patch from Guruprasad
Hegde. Fixes https://trac.xapian.org/ticket/337
+ Enable testcase closedb5 for remote backends. This testcase failed for
remote backends when it was added and the cause wasn't clear, but it turns
out it was actually a bug in the disk based backends, which was fixed way
back in 2010. Reported by Guruprasad Hegde.
+ Check for select() failing in retrylock1 testcase. Retry on EINTR or
EAGAIN, and report other errors rather than trying the read() anyway.
Previously the read() would likely fail for the same reason the select()
did, but at best this is liable to make what's going on less clear if the
testcase fails.
* Report bool values as true/false not 1/0.
* Assorted minor testcase improvements.
* The test harness now supports testcases which are expected to fail (XFAIL).
Based on patch from Richard Boulton in https://trac.xapian.org/ticket/156.
* Fix demangling of std::exception subclass names which wasn't happening due
to a typo in the preprocessor check for the required header. This was broken
by changes in 1.4.2.
* Make TEST_EQUAL() arguments side-effect free. The TEST_EQUAL() macro
evaluates its arguments a second time if the test fails in order to report
their values. This isn't ideal and really ought to be addressed, but for now
fix uses where the argument has side-effect (e.g. *i++) such that the
reported value should match the tested value.
* runtest: Show usage if first option starts '-'. Previously we ended up
passing such options to libtool, so putting -v on runtest instead of apitest
would run the tests but -v would effectively do nothing (it would make
libtool verbose, but that doesn't make any difference in this case):
./runtest -v ./apitest
* Suppress output from xcopy on MS Windows.
* The test harness machinery for detecting file descriptor leaks should now
work on any platform which has /dev/fd.
* Implement recursive delete of a database directory in the test harness
using nftw() if available (and not buggy like mingw64's seems to be), rather
than running "rm -rf" as an external command. This avoids the overhead of
starting a new process each time we clean up a test database, which happens a
lot during a test run.
* Speed up generated test databases a little by adding a stat() check to avoid
throwing and catching an exception when the database doesn't yet exist.
* Skip timed tests when configured with --enable-log. The logging can easily
turn O(1) operations into O(n), and that's hard to avoid. Fixes
https://trac.xapian.org/ticket/757, reported by Guruprasad Hegde.
matcher:
* OP_VALUE_*: When a value slot's lower and upper bound are equal, we know
that exactly how many documents the subquery can match (either 0 or those
bounds). This also avoids a division by zero which previously happened
when trying to calculate the estimate.
* Speed up sorting by keys. Use string::compare() to avoid having to call
operator< if operator> returns false.
* Fix clamping of maxitems argument to get_mset() - it was being clamped
to db.get_doccount(), now it's clamped to db.get_doccount() - first. In
practice this doesn't actually seem to cause any issues.
* If a match time limit is in effect, when it expires we now clamp
check_at_least to first + maxitems instead of to maxitems. In practice this
also doesn't seem to actually cause any issues (at least we've failed to
construct a testcase where it actually makes an observable difference).
* Fix percentages when only some shards have positions. If the final shard
didn't have positions this would lead to under-counting the total number leaf
of subqueries which would lead to incorrect positional calculations (and a
division by zero if the top level of the query was positional. This bug was
introduced in 1.4.3.
* OP_NEAR: Fix "phantom positions", where OP_NEAR would think a term without
positional information occurred at position 1 if it had the lowest term
frequency amongst the OP_NEAR's subqueries.
* Fix termfreq used in weight calculations for a term occurring more than once
in the query. Previously the termfreq for such terms was multiplied by the
number of different query positions they appeared at.
* OP_SYNONYM: We use the doclength upper bound for the wdf upper bound of a
synonym - now we avoid fetching it twice when the doclength upper bound is
explicitly needed.
* Short-cut init() when factor is 0 in most Weight subclasses. This indicates
the object is for the term-independent weight contribution, which is always 0
for most schemes, so there's no point fetching any stats or doing any
calculations. This fixes a divide by zero for TfIdfWeight, detected by
UBSan.
* OP_OR: Fix bug which caused orcheck1 to fail once hooked up to run with the
inmemory backend.
glass backend:
* Fix glass freelist bug when changes to a new database which didn't modify the
termlist table were committed. In this corner case, a block which had been
allocated to be the root block in the termlist table was leaked. This was
largely harmless, except that it was detected by Database::check() and caused
it to report an error. Reported by Antoine Beaupré and David Bremner.
* Fix glass freelist bug with cancel_transaction(). The freelist wasn't
reset to how it was before the transaction, resulting in leaked blocks.
This was largely harmless, except that it was detected by Database::check()
and caused it to report an error.
* Improve the per-term wdf upper bound. Previously we used min(cf(term),
wdf_upper_bound(db)) which is tight for any terms which attain that
upper bound, and also for terms with termfreq == 1 (the latter are common
in the database (e.g. 66% for a database of wikipedia), but probably
much less common in searches). When termfreq > 1 we now use
max(first_wdf(term), cf(term) - first_wdf(term)), which means terms with
termfreq == 2 will also attain their bound (another 11% for the same
database) while terms with higher termfreq but below the global bound will
get a tighter bound.
* Fix Database::locked() on single-file glass db to just return false (such
databases can't be opened as a WritableDatabase so there can't be a write
lock). Previously this failed with: "DatabaseLockError: Unable to get write
lock on /flintlock: Testing lock"
* Fix compaction when both the input and output are specified as a file
descriptor. Previously this threw an exception due to an overeager check
that destination != source.
* Use O_TRUNC when compacting to single file. If the output already exists but
is larger than our output we don't want to just overwrite the start of it.
This case also used to result in confusing compaction percentages.
* Enable glass's "open_nearby_postlist" optimisation (which especially helps
large wildcard queries) for writable databases without any uncommitted
changes as well.
* Make get_unique_terms() more efficient for glass. We approximate
get_unique_terms() by the length of the termlist (which counts boolean terms
too) but clamp this to be no larger than the document length. Since we need
to open the termlist to get its length, it makes more sense to get the
document length from that termlist for no extra cost rather than looking it
up in the postlist table.
* Database::check() now checks document lengths against the stored document
length lower and upper bounds. Patch from Uppinder Chugh. Fixes
https://trac.xapian.org/ticket/617.
* Fix bogus handling of most-recently-read value slot statistics. It seems
that we get lucky and this can't actually cause a problem in practice due
to another layer of caching above, but if nothing else it's a bug waiting to
happen.
* If we fail to create the directory for a new database because the path
already exists, the exception now reports EEXIST as the errno value rather
than whatever errno value happened to be set from an earlier library call.
remote backend:
* xapian-tcpsrv --one-shot no longer forks. We need fork to handle multiple
concurrent connections, but when handling a single connection forking just
adds overhead and potentially complicates process management for our caller.
This aligns with the behaviour under __WIN32__ where we use threads instead
of forking, and service the connection from the main thread with --one-shot.
* Fix repeat call to ValueIterator::check() on the same docid to not always
set valid to true for remote backend.
inmemory backend:
* Fix repeat call to ValueIterator::check() on the same docid to not always
set valid to true for inmemory backend.
build system:
* configure: Fix potentially confusing messages suggesting snprintf was added
in C90 - it was actually standardised in C99.
* Eliminate configure probes related to off_t by using C++11 features.
* The installed xapian-config script is now cleaned up by removing code to
handle use before installation. This extra code contained build paths
which meant the build wasn't bit-for-bit reproducible unless the same
build directory name was used. This change also eliminates use of
automake's $(transform) (which seems to be intended an internal mechanism)
and fixes "make uninstall" to remove xapian-config when a program-prefix or
-suffix is in use (e.g. there's a default -1.5 suffix for git master
currently).
* Directory separator knowledge is now factored out into configure, based on
$host_os and __WIN32__ (it seems hard to probe for this in a way which works
when cross-compiling).
* Fix build with --disable-backend-remote.
* In an out-of-tree build configured with --enable-maintainer-mode
and --disable-dependency-tracking we would fail to create the
"tests/soaktest" and "unicode" directories in the build directory.
Patch from Gaurav Arora.
* Improve handling of multitarget rule stamp files. Clean them on "make
maintainer-clean" and ship them so that --enable-maintainer-mode when
building from a tarball doesn't needlessly rerun the multitarget rules.
* Split out allsnowballheaders.h again to avoid include path issues with
unittest in out-of-tree maintainer-mode builds.
* xapian-core.pc: Both the Name and Description were too long compared to
pkg-config norms, and the Description was trying to be multi-line which it
seems pkg-config doesn't support. Fixes
https://github.com/xapian/xapian/pull/203, reported by orbea.
documentation:
* Stop describing Xapian as "Probabilistic" - we've also had non-probabilistic
weighting schemes since 1.3.2.
* Improve API docs for MSet::snippet().
* Correct some class names in doxygen file documentation comments.
* Mark up shell command as code-block:: sh.
tools:
* xapian-delve:
+ Document values can contain binary data, so escape them by default for
output. Other options now supported are to decode as a packed integer
(like omindex uses for last modified), decode using
Xapian::sortable_unserialise(), and to show the raw form (which was the
previous behaviour).
+ Report current database revision.
* xapian-inspect:
+ Report entry count when opening table
+ Support inspecting single file DBs via a new --table option (which can also
be used with a non-single-file DB instead of specifying the path to the
table).
+ Add "first" and "last" commands which jump to the first/last entry in the
current table respectively.
+ "until" now counts and reports the number of entries advanced by.
+ Document "until" with no arguments - this advances to the end of the table,
but wasn't mentioned in the help.
+ Commands "goto" and "until" which take a key as an argument now expect the
key in the same escaped form that's used for display. This makes it much
simpler to interact with tables with binary keys.
+ Fix to expect .glass not .DB extension of glass tables.
portability:
* Sort out building using MSVC with the standard build system, and fix assorted
problems. MSVC 2015 or later is required for decent C++11 support. Both 32-
and 64-bit builds are now supported.
* Remove code specific to old MSVC nmake build system. The latter has been
removed already.
* Don't use WIN32 API to parse/unparse UUIDs. So much glue code is needed that
it's simpler to just do the parsing and unparsing ourselves, and we already
have an implementation which is used when generating UUIDs using /proc on
Linux. We still use UuidCreate() to generate a new UUID.
* Improve compiler visibility attribute detection to check that using the
attributes doesn't result in a warning - previously we'd enable them even on
platforms which don't support them, which would result in a compiler warning
for every file compiled. We now probe for -fvisibility=hidden and
-fvisibility-inlines-hidden together as it seems all compilers implement both
or neither, and it's faster to do one probe instead of two.
* Don't pass the same FDSET twice in same select() - this appears not to be
allowed by current POSIX, and causes warnings with GCC8.
* Fix compacttofd testcases to specify O_BINARY so they pass on platforms
where O_BINARY matters.
* configure: Probe for declaration of _putenv_s. It seems that the symbol is
always present in the MSVCRT DLL, but older mingw may not provide a
declaration for it.
* Fix "may be used uninitialised" warning with GCC 4.9.2 and -Os.
* Suppress mingw32 deprecation warning for useconds_t. We've already switched
away from useconds_t on git master, but it's not easy to do for 1.4.x without
ABI breakage.
* Fix signed vs unsigned warnings with assertions on.
* Use $(SED) instead of hard-coding "sed". The rules concerned are all ones
that only maintainers currently need to run, but we're likely to enable
maintainer-mode by default at some point and then portability here will
matter more.
* Add missing explicit <algorithm> for std::max()/std::min().
* Check for EAGAIN as well as EINTR from select(). The Linux select(2) man
page says: "Portable programs may wish to check for EAGAIN and loop, just as
with EINTR" and that seems to be necessary for Cygwin at least.
* Probe for exp10() declaration as Cygwin seems to have the symbol but lacks a
declaration in the headers. Just ignoring it is simplest and we'll use GCC's
__builtin_exp10() instead.
* Fix warnings when building Snowball compiler with recent GCC.
* Fix Perl script used during maintainer builds to work with Perl < 5.10. Such
old perl versions shouldn't really be relevant for maintainer builds at this
point, but appveyor's mingw install has such a Perl version.
* Remove unused macro STATIC_ASSERT_TYPE_DOMINATES (unused, except by
internaltest unit test for it, since the flint backend was removed in 2011)
and replace uses of STATIC_ASSERT_UNSIGNED_TYPE with C++11 features
static_assert and std::is_unsigned instead.
* Don't retry on (errno == EINTR) when read() or pread() indicates end-of-file.
This could potentially have put us into an infinite loop if we encountered
this situation and errno happened to be EINTR from a previous library call.
* Make read-only data arrays consistently static and const.
* Avoid casting invalid value to enum reply_type if an invalid reply code is
received from a remote server. This is technically undefined behaviour,
though in practice probably not a problem.
* Eliminate an array of function pointers and some char* array members in
library, reducing the number of relocations needed at shared library load
time, which reduces the total time to load the library.
packaging:
* Use https for tarball URLs in .spec files. This provides protection against
MITM attacks on people building packages using these spec files, and is also
slightly more efficient as the http: URLs redirect to the https: versions
anyway.
debug code:
* Fix build when configured with --enable-log due to bugs in debug logging
annotations. Patch from Uppinder Chugh.
* Fix assertion for value range on empty slot.
* Use AssertEq() rather than Assert with ==, the former reports the two
values if the assertion fails.
Xapian-core 1.4.5 (2017-10-16):
API:
* Add Database::get_total_length() method. Previously you had to calculate
this from get_avlength() and get_doccount(), taking into account rounding
issues. But even then you couldn't reliably get the exact value when total
length is large since a double's mantissa has more limited precision than an
unsigned long long.
* Add Xapian::iterator_rewound() for bidirectional iterators, to test if the
iterator is at the start (useful for testing whether we're done when
iterating backwards).
* DatabaseOpeningError exceptions now provide errno via get_error_string()
rather than turning it into a string and including it in the exception
message.
* WritableDatabase::replace_document(): when passed a Document object which
came from a database and has unmodified values, we used to always read
those values into a memory structure. Now we only do this if the document
is being replaced to the same document ID which it came from, which should
make other cases a bit more efficient.
* Enquire::get_eset(): When approximating term frequencies we now round to the
nearest integer - previously we always rounded down.
testsuite:
* Improve Xapian::Document test coverage.
* Pass --child-silent-after-fork=yes to valgrind which stops us creating a
.valgrind.log.* file for every remote testcase run. This option was added in
valgrind 3.3.0 which is already the minimum version we support.
* Open and unlink valgrind log before option parsing so we no longer leave a
log file behind if there's an error parsing options or for options like
--help which report and exit.
* Delete .valgrind.log.* on "make clean" - if tests are run under valgrind and
the test is killed at just the wrong moment then a log file may be left
behind.
* Fix the NetworkError with ECHILD check added in 1.4.4 - this will no longer
segfault if the test harness catches a NetworkError without an error string.
matcher:
* Iterating of positions has been sped up, which means phrase matching is now
faster (by a little over 5% in some simple tests).
* Fix use after free of QueryOptimiser hint in certain cases involving
multiple databases only some of which have positional information.
This bug was introduced by changes in xapian-core 1.4.3. Fixes #752,
reported and analysed by Robert Stepanek.
* An unweighted OP_AND_MAYBE is now optimised to just its left branch - the
other branch or branches only contribute weight, so can be completely ignored
when the operator is unweighted.
inmemory backend:
* Use binary chop instead of linear search in all places where we're searching
for a term or document - we weren't taking advantage of the sorted order
everywhere.
build system:
* xapian-core.pc: Specify Libs.private in pkgconfig file, which is needed for
static linking, and probably also for shared libraries on platforms without
DT_NEEDED or something equivalent. Fixes #751, reported by Matthieu Gautier.
documentation:
* Document that QueryParser::set_default_op() supports OP_MAX - this
has been the case since OP_MAX was added, but the API docs for
set_default_op() weren't updated to reflect this.
* Document OP_MAX and OP_WILDCARD.
* Fix documentation of TermGenerator stop_strategy values STOP_ALL and
STOP_STEMMED. Reported by Matthieu Gautier in #750. Thanks to Gaurav Arora
for additional investigation.
* net/remote_protocol.rst: Update the current version of the remote protocol
version (39 not 38). The differences between the two are only in the Query
and MSet serialisations which aren't documented in detail here.
* Link get_unique_terms_begin() and get_terms_begin() API documentation -
the cross-referencing is useful in itself, but also helps to highlight
the difference between the two.
* Fix "IPv5" -> "IPv6" comment typo. Noted by James Clarke
* deprecation.html:
+ Add deprecated Enquire::get_eset() overload - this was marked as deprecated
in the header file, but hadn't been added here.
+ Move deprecated typedefs to the "to be removed" list - they'd been
accidentally added to the "removed" list.
+ Improve descriptions of several deprecated features.
* QueryParser::set_max_expansion() is now discussed in the API documentation
instead of the deprecated set_max_wildcard_expansion().
* Clarify PostList::check() API documentation: If valid is set to false, then
NULL must be returned (pruning in this situation doesn't make sense) and
at_end() shouldn't be called (because it implicitly depends on the current
position being valid).
* HACKING:
+ Update re -Wold-style-cast which we enabled and then had to disable again.
+ Update links to C++ FAQ and libstdc++'s debug mode.
+ Update several URLs to use https.
+ The 1.2 release branch has now been retired, so remove 1.2-specific
backporting tips.
portability:
* Also check <errno.h> for sys_nerr and sys_errlist. This is probably a more
common location for them than Linux's <stdio.h> (even on Linux the man page
says they're in <errno.h> but that doesn't match reality).
* Use $(CC) not $(CC_FOR_BUILD) to build zlib-vg.so. The test for whether we
need it is based on the host OS, so it makes more sense to use the host
compiler to build it when cross compiling.
* On Hurd F_GETLK currently always fails with errno set to ENOSYS - treat this
the same way as ENOLCK. This fixes the testsuite on GNU Hurd, broken since
the addition on Database::locked() in 1.4.3.
* Add missing #include "safesyssocket.h", needed on at least FreeBSD to get
AF_INET and SOCK_STREAM defined. Fixes
https://github.com/xapian/xapian/pull/154, reported by Po-Chuan Hsieh
(alternative fix applied was suggested by James Aylett).
* configure: Fixed the probe for whether the test harness can use RTTI with
IBM's xlC compiler (which defaults to not generating RTTI). Previously the
probe would always think RTTI was available.
debug code:
* Fix some incorrect class/method names in debug logging.
* Stop disabling ccache for coverage builds as ccache 3.2.2 now supports
caching compilations with --coverage, and they work as far back as ccache 3.0
(caching is automatically disabled by these older versions).
* Drop --enable-quiet from in COVERAGE_CONFIGURE - this option no longer does
anything since 1.3.1.
Xapian-core 1.4.4 (2017-04-19):
API:
* Database::check():
+ Fix checking a single table - changes in 1.4.2 broke such checks unless you
specified the table without any extension.
+ Errors from failing to find the file specified are now thrown as
DatabaseOpeningError (was DatabaseError, of which DatabaseOpeningError is
a subclass so existing code should continue to work). Also improved the
error message when the file doesn't exist is better.
* Drop OP_SCALE_WEIGHT over OP_VALUE_RANGE, OP_VALUE_GE and OP_VALUE_LE in the
Query constructor. These operators always return weight 0 so OP_SCALE_WEIGHT
over them has no effect. Eliminating it at query construction time is cheap
(we only need to check the type of the subquery), eliminates the confusing
"0 * " from the query description, and means the OP_SCALE_WEIGHT Query object
can be released sooner. Inspired by Shivanshu Chauhan asking about the query
description on IRC.
* Drop OP_SCALE_WEIGHT on the right side of OP_AND_NOT in the Query
constructor. OP_AND_NOT takes no weight from the right so OP_SCALE_WEIGHT
has no effect there. Eliminating it at query construction time is cheap
(just need to check the subquery's type), eliminates the confusing "0 * "
from the query description, and means the OP_SCALE_WEIGHT object can be
released sooner.
testsuite:
* Add more tests of Database::check(). Fixes #238, reported by Richard
Boulton.
* Make apitest testcase nosuchdb1 fail if we manage to open the DB.
* Skip testcases which throw NetworkError with errno value ECHILD - this
indicates system resource starvation rather than a Xapian bug. Such failures
are seen on Debian buildds from time to time, see:
https://bugs.debian.org/681941
matcher:
* Fix incorrect results due to uninitialised memory. The array holding max
weight values in MultiAndPostList is never initialised if the operator is
unweighted, but the values are still used to calculate the max weight to pass
to subqueries, leading to incorrect results. This can be observed with an OR
under an unweighted AND (e.g. OR under AND on the right side of AND_NOT).
The fix applied is to simply default initialise this array, which should lead
to a max weight of 0.0 being passed on to subqueries. Bug reported in
notmuch by Kirill A. Shutemov, and forwarded by David Bremner.
documentation:
* Correct "Query::feature_flag" -> "QueryParser::feature_flag". Fixes #747,
reported by James Aylett.
* Rename set_metadata() `value` parameter to `metadata`. This change is
particularly motivated by making it easier to map this case specially in SWIG
bindings, but the new name is also clearer and better documents its purpose.
* Rename value range parameters. The new names (`range_limit` instead of
`limit`, `range_lower` instead of `begin` and `range_upper` instead of `end`)
are particularly motivated by making it easier to map them specially in SWIG
bindings, but they're also clearer names which better document their
purposes.
* Change "(key, tag)" to "(key, value)" in user metadata docs. The user
metadata is essentially what's often called a "key-value store" so users
are likely to be familiar with that terminology.
* Consistently name parameter of Weight::unserialise() overridden forms.
In xapian/weight.h it was almost always named `serialised`, but LMWeight
named it `s` and CoordWeight omitted the name.
* Fix various minor documentation comment typos.
portability:
* Fix configure probe for __builtin_exp10() to work around bug on mingw - there
GCC generates a call to exp10() for __builtin_exp10() but there is no exp10()
function in the C library, so we get a link failure. Use a full link test
instead to avoid this issue. Reported by Mario Emmenlauer on xapian-devel.
* Fix configure probe for log2() which was failing on at least some platforms
due to ambiguity between overloaded forms of log2(). Make the probe
explicitly check for log2(double) to avoid this problem.
* Workaround the unhelpful semantics of AI_ADDRCONFIG on platforms which follow
the old RFC instead of POSIX (such as Linux) - if only loopback networking is
configured, localhost won't resolve by name or IP address, which causes
testsuites using the remote backend over localhost to fail in auto-build
environments which deliberately disable networking during builds. The
workaround implemented is to check if the hostname is "::1", "127.0.0.1" or
"localhost" and disable AI_ADDRCONFIG for these. This doesn't catch all
possible ways to specify localhost, but should catch all the ways these might
be specified in a testsuite. Fixes https://bugs.debian.org/853107, reported
by Daniel Schepler and the root cause uncovered by James Clarke.
debug code:
* Adjust assertion in InMemoryPostList. Calling skip_to() is fine when the
postlist hasn't been started yet (but the assertion was failing for a term
not in the database). Latent bug, triggered by testcases complexphrase1 and
complexnear1 as updated for addition of support for OP_OR subqueries of
OP_PHRASE/OP_NEAR.
Xapian-core 1.4.3 (2017-01-25):
API:
* MSet::snippet(): Favour candidate snippets which contain more of a diversity
of matching terms by discounting the relevance of repeated terms using an
exponential decay. A snippet which contains more terms from the query is
likely to be better than one which contains the same term or terms multiple
times, but a repeated term is still interesting, just less with each
additional appearance. Diversity issue highlighted by Robert Stepanek's
patch in https://github.com/xapian/xapian/pull/117 - testcases taken from his
patch.
* MSet::snippet(): New flag SNIPPET_EMPTY_WITHOUT_MATCH to get an empty snippet
if there are no matches in the text passed in. Implemented by Robert
Stepanek.
* Round MSet::get_matches_estimated() to an appropriate number of significant
figures. The algorithm used looks at the lower and upper bound and where the
estimate sits between them, and then picks an appropriate number of
significant figures. Thanks to Sébastien Le Callonnec for help sorting out a
portability issue on OS X.
* Add Database::locked() method - where possible this non-invasively checks if
the database is currently open for writing, which can be useful for
dashboards and other status reporting tools.
testsuite:
* Use terms that exist in the database for most snippet tests. It's good to
test that snippet highlighting works for terms that aren't in the database,
but it's not good for all our snippet tests to feature such terms - it's
not the common usage.
matcher:
* Improve value range upper bound and estimated matches. The value slot
frequency provides a tighter upper bound than Database::get_doccount().
The estimate is now calculated by working out the proportion of possible
values between the slot lower and upper bounds which the range covers
(assuming a uniform distribution). This seems to work fairly well in
practice, and is certainly better than the crude estimate we were using:
Database::get_doccount() / 2
* Handle arbitrary combinations of OP_OR under OP_NEAR/OP_PHRASE, partly
addressing #508. Thanks to Jean-Francois Dockes for motivation and testing.
* Only convert OP_PHRASE to OP_AND if full DB has no positions. Until now the
conversion was done independently for each sub-database, but being consistent
with the results from a database containing all the same documents seems more
useful.
* Avoid double get_wdf() call for first subquery of OP_NEAR and OP_PHRASE,
which will speed them up by a small amount.
documentation:
* INSTALL: Update section about -Bsymbolic-functions which is not a new
GNU ld feature at this point.
tools:
* xapian-delve: Uses new Database::locked() method to report if the database
is currently locked.
portability:
* Fix build failure cross-compiling for android due to not pulling in header
for errno.
* Fix compiler warnings.
Xapian-core 1.4.2 (2016-12-26):
API:
* Add XAPIAN_AT_LEAST(A,B,C) macro.
* MSet::snippet(): Optimise snippet generation - it's now ~46% faster in a
simple test.
* Add Xapian::DOC_ASSUME_VALID flag which tells Database::get_document() that
it doesn't need to check that the passed docid is valid. Fixes #739,
reported by Germán M. Bravo.
* TfIdfWeight: Add support for the L wdf normalisation. Patch from Vivek Pal.
* BB2Weight: Fix weights when database has just one document. Our existing
attempt to clamp N to be at least 2 was ineffective due to computing
N - 2 < 0 in an unsigned type.
* DPHWeight: Fix reversed sign in quadratic formula, making the upper bound a
tiny amount higher.
* DLHWeight: Correct upper bound which was a bit too low, due to flawed logic
in its derivation. The new bound is slightly less tight (by a few percent).
* DLHWeight,DPHWeight: Avoid calculating log(0) when wdf is equal to the
document length.
* TermGenerator: Handle stemmer returning empty string - the Arabic stemmer
can currently do this (e.g. for a single tatweel) and user stemmers can too.
Fixes #741, reported by Emmanuel Engelhart.
* Database::check(): Fix check that the first docid in each doclength chunk is
more than the last docid in the previous chunk - this code was in the wrong
place so didn't actually work.
* Database::get_unique_terms(): Clamp returned value to be <= document length.
Ideally get_unique_terms() ought to only count terms with wdf > 0, but that's
expensive to calculate on demand.
glass backend:
* When compacting we now only write the iamglass file out once, and we write it
before we sync the tables but sync it after, which is more I/O friendly.
* Database::check(): Fix in SEGV when out == NULL and opts != 0.
* Fix potential SEGV with corrupt value stats.
chert backend:
* Fix potential SEGV with corrupt value stats.
build system:
* Add XO_REQUIRE autoconf macro to provide an easy way to handle version checks
in user configure scripts.
tools:
* quest: Support BM25+, LM and PL2+ weighting schemes.
* xapian-check: Fix when ellipses are shown in 't' mode. They were being shown
when there were exactly 6 entries, but we only start omitting entries when
there are *more* than 6. Fix applies to both glass and chert.
portability:
* Avoid using opendir()/readdir() in our closefrom() implementation as these
functions can call malloc(), which isn't safe to do between fork() and exec()
in a multi-threaded program, but after fork() is exactly where we want to
use closefrom(). Instead we now use getdirentries() on Linux and
getdirentriesattr() on OS X (OS X support bugs shaken out with help from
Germán M. Bravo).
* Support reading UUIDs from /proc/sys/kernel/random/uuid which is especially
useful when building for Android, as it avoids having to cross-build a UUID
library.
* Disable volatile workaround for excess precision SEGV for SSE - previously it
was only being disabled for SSE2.
* When building for x86 using a compiler where we don't know how to disable
use of 387 FP instructions, we now run remote servers for the testsuite under
valgrind --tool=none, like we do when --disable-sse is explicitly specified.
* Add alignment_cast<T> which has the same effect as reinterpret_cast<T> but
avoids warnings about alignment issues.
* Suppress warnings about unused private members. DLHWeight and DPHWeight
have an unused lower_bound member, which clang warns about, but we need to
keep them there in 1.4.x to preserve ABI compatibility.
* Remove workaround for g++ 2.95 bug as we require at least 4.7 now.
* configure: Probe for <cxxabi.h>. GCC added this header in GCC 3.1, which
is much older than we support, so we've just assumed it was available if
__GNUC__ was defined. However, clang lies and defines __GNUC__ yet doesn't
seem to reliably provide <cxxabi.h>, so we need to probe for it.
* Fix "unused assignment" warning.
* configure: Probe for __builtin_* functions. Previously we just checked for
__GNUC__ being defined, but it's cleaner to probe for them properly -
compilers other than GCC and those that pretend to be GCC might provide these
too.
* Use __builtin_clz() with compilers which support it to speed up encoding
and especially decoding of positional data. This speeds up phrase searching
by ~0.5% in a simple test.
* Check signed right shift behaviour at compile time - we can use a test on a
constant expression which should optimise away to just the required version
of the code, which means that on platforms which perform sign-extension
(pretty much everything current it seems) we don't have to rely on the
compiler optimising a portable idiom down to the appropriate right shift
instruction.
* Improve configure check for log2(). We include <cmath> so the check really
should succeed if only std::log2() is declared.
* Enable win32-dll option to LT_INIT.
debug code:
* xapian-inspect:
+ Support glass instead of chert.
+ Allow control of showing keys/tags.
+ Use more mnemonic letters than X for command arguments in help.
Xapian-core 1.4.1 (2016-10-21):
API:
* Constructing a Query for a non-reference counted PostingSource object will
now try to clone the PostingSource object (as happened in 1.3.4 and
earlier). This clone code was removed as part of the changes in 1.3.5 to
support optional reference counting of PostingSource objects, but that breaks
the case when the PostingSource object is on the stack and goes out of scope
before the Query object is used. Issue reported by Till Schäfer and analysed
by Daniel Vrátil in a bug report against Akonadi:
https://bugs.kde.org/show_bug.cgi?id=363741
* Add BM25PlusWeight class implementing the BM25+ weighting scheme, implemented
by Vivek Pal (https://github.com/xapian/xapian/pull/104).
* Add PL2PlusWeight class implementing the PL2+ weighting scheme, implemented
by Vivek Pal (https://github.com/xapian/xapian/pull/108).
* LMWeight: Implement Dir+ weighting scheme as DIRICHLET_PLUS_SMOOTHING.
Patch from Vivek Pal.
* Add CoordWeight class implementing coordinate matching. This can be useful
for specialised uses - e.g. to implement sorting by the number of matching
filters.
* DLHWeight,DPHWeight,PL2Weight: With these weighting schemes, the formulae
can give a negative weight contribution for a term in extreme cases. We
used to try to handle this by calculating a per-term lower bound on the
contribution and subtracting this from the contribution, but this idea
is fundamentally flawed as the total offset it adds to a document depends on
what combination of terms that document matches, meaning in general the
offset isn't the same for every matching document. So instead we now clamp
each term's weight contribution to be >= 0.
* TfIdfWeight: Always scale term weight by wqf - this seems the logical
approach as it matches the weighting we'd get if we weighted every non-unique
term in the query, as well as being explicit in the Piv+ formula.
* Fix OP_SCALE_WEIGHT to work with all weighting schemes - previously it was
ignored when using PL2Weight and LMWeight.
* PL2Weight: Greatly improve upper bound on weight:
+ Split the weight equation into two parts and maximise each separately as
that gives an easily solvable problem, and in common cases the maximum is
at the same value of wdfn for both parts. In a simple test, the upper
bounds are now just over double the highest weight actually achieved -
previously they were several hundred times. This approach was suggested by
Aarsh Shah in: https://github.com/xapian/xapian/pull/48
+ Improve upper bound on normalised wdf (wdfn) - when wdf_upper_bound >
doclength_lower_bound, we get a tighter bound by evaluating at
wdf=wdf_upper_bound. In a simple test, this reduces the upper bound on
wdfn by 36-64%, and the upper bound on the weight by 9-33%.
* PL2Weight: Fix calculation of upper_bound when P2>0. P2 is typically
negative, but for a very common term it can be positive and then we should
use wdfn_lower not wdfn_upper to adjust P_max.
* Weight::unserialise(): Check serialised form is empty when unserialising
parameter-free schemes BoolWeight, DLHWeight and DPHWeight.
* TermGenerator::set_stopper_strategy(): New method to control how the Stopper
object is used. Patch from Arnav Jain.
* QueryParser: Fix handling of CJK query over multiple prefixes. Previously
all the n-gram terms were AND-ed together - now we AND together for each
prefix, then OR the results. Fixes #719, reported by Aaron Li.
* Add Database::get_revision() method which provides access to the database
revision number for chert and glass, intended for use by xapiand. Marked
as experimental, so we don't have to go through the usual deprecation cycle
if this proves not to be the approach we want to take. Fixes #709,
reported by Germán M. Bravo.
* Mark RangeProcessor constructor as `explicit`.
testsuite:
* OP_SCALE_WEIGHT: Check top weight is non-zero - if it is zero, tests which
try to check that OP_SCALE_WEIGHT works will always pass.
* testsuite: Check SerialisationError descriptions from Xapian::Weight
subclasses mention the weighting scheme name.
matcher:
* Fix stats passed to Weight with OP_SYNONYM. Previously the number of
unique terms was never calculated, and a term which matched all documents
would be optimised to an all-docs postlist, which fails to supply the
correct wdf info.
* Use floating point calculation for OR synonym freq estimates. The division
was being done as an integer division, which means the result was always
getting rounded down rather than rounded to the nearest integer.
glass backend:
* Fix allterms with prefix on glass with uncommitted changes. Glass aims to
flush just the relevant postlist changes in this case but the end of the
range to flush was wrong, so we'd only actually flush changes for a term
exactly matching the prefix. Fixes #721.
remote backend:
* Improve handling of invalid remote stub entries: Entries without a colon now
give an error rather than being quietly skipped; IPv6 isn't yet supported,
but entries with IPv6 addresses now result in saner errors (previously the
colons confused the code which looks for a port number).
build system:
* XO_LIB_XAPIAN: Check for user trying to specify configure for XAPIAN_CONFIG
and give a more helpful error.
* Fix XO_LIB_XAPIAN to work without libtool. Modern versions of GNU m4 error
out when defn is used on an undefined macro. Uncovered by Amanda Jayanetti.
* Clean build paths out of installed xapian-config, mostly in the interests of
facilitating reproducible builds, but it is also a little more robust as the
"uninstalled tree" case can't then accidentally be triggered.
* Drop compiler options that are no longer useful:
+ -fshow-column is the default in all GCC versions we now support
(checked as GCC 4.6).
+ -Wno-long-long is no longer necessary now that we require C++11 where
"long long" is a standard type.
documentation:
* Add API documentation comments for all classes, methods, constants, etc which
were lacking them, and improve the content of some existing comments.
* Stop hiding undocumented classes and members. Hiding them silences doxygen's
warnings about them, so it's hard to see what is missing, and the stub
documentation produced is perhaps better than not documenting at all.
Fixes #736, reported by James Aylett.
* xapian-check: Make command line syntax consistent with other tools.
* Note when MSet::snippet() was added.
* deprecation.rst: Recommend unsigned over useconds_t for timeout values (but
leave the API using useconds_t for 1.4.x for ABI compatibility. The type
useconds_t is now obsolete and anyway was intended to represent a time in
microseconds (confusing when Xapian's timeouts are in milliseconds). The
Linux usleep man page notes: "Programs will be more portable if they never
mention this type explicitly."
portability:
* Suppress compiler warnings about pointer alignment on some architectures.
We know the data is aligned in these cases.
* Fix replicate7 under Cygwin.
debug code:
* Add missing forward declaration needed by --enable-log build.
Xapian-core 1.4.0 (2016-06-24):
API:
* Update to Unicode 9.0.0.
portability:
* Fix build on big-endian architectures. The new unaligned word access
functions expect WORDS_BIGENDIAN to be set, but configure.ac wasn't invoking
AC_C_BIGENDIAN to arrange for this to be set.
* Suppress compiler warnings about pointer alignment. We know the data is
suitably aligned, because the whole point of these functions is to allow
reading an aligned word.
Xapian-core 1.3.7 (2016-06-01):
API:
* Reimplement ESet and ESetIterator as we did for MSet and MSetIterator in
1.3.5. ESetIterator internally now counts down to the end of the ESet, so
the end test is now against 0, rather than against eset.size(). And more of
the trivial methods are now inlined, which reduces the number of relocations
needed to load the library, and should give faster code which is a very
similar size to before.
* MSetIterator and ESetIterator are now STL-compatible random_access_iterators
(previously they were only bidirectional_iterators).
testsuite:
* Merge queryparsertest and termgentest into apitest. Their testcases now use
the backend manager machinery in the testharness, so we don't have to
hard-code use of inmemory and chert backends, but instead run them under all
backends which support the required features. This fixes some test failures
when both chert and glass are disabled due to trying to run spelling tests
with the inmemory backend.
* Avoid overflowing collection frequency in totaldoclen1. We're trying to test
total document length doesn't wrap, so avoid collection freq overflowing in
the process, as that triggers errors when running the testsuite under ubsan.
We should handle collection frequency overflow better, but that's a separate
issue.
* Add some test coverage for ESet::get_ebound().
matcher:
* Fix upper bound on matches for OP_XOR. Due to a reversed conditional, the
estimate could be one too low in some cases where the XOR matched all the
documents in the database.
* Improve lower bound on matches for OP_XOR. Previously the lower bound was
always set to 0, which is valid, but we can often do better.
glass backend:
* Fix Database::check() parsing of glass changes file header. In practice this
was unlikely to actually cause problems.
build system:
* --disable-backend-remote now disables replication too which makes it
actually usable (currently replication and the remote backend share most of
their network code, so disabling them together probably makes sense anyway).
* Improve builds with various combinations of backends disabled (see #361).
portability:
* Revert change to handle a self-initialised PIMPL object (e.g. Xapian::Query
q(q);), added in 1.3.6. It seems this case is actually undefined behaviour,
so there's not much point trying to do anything about it. Clang warns about
the testcase for it (tested with 3.5), but sadly current GCC doesn't (tested
with 6.1).
* Use <cstdint> for integer types of known widths now we require C++11.
* Replace unaligned word access functions with optimised versions which use
memcpy() and (on little-endian platforms) a byte-swap (via compiler builtins
where available). Access revision numbers in database blocks with an aligned
load, since we know they are suitably aligned.
* Simplify handling of platforms where timer_create() exists but isn't
suitable for our needs - AIX and GNU Hurd both have timer_create() but it
always seems to fail (on Hurd this is because there's a dummy implementation
in glibc which always fails with ENOSYS). Trying a call at runtime which
will never succeed is a waste of time, so we want to avoid defining
HAVE_TIMER_CREATE in such cases. Probing for this properly in configure
would need us to compile and run a test program, which is unhelpful when
cross-compiling, so for now just test against a blacklist of platforms we
know don't provide a suitable timer_create() function.
* Check _POSIX_MONOTONIC_CLOCK and if it's not defined, use CLOCK_REALTIME
instead of CLOCK_MONOTONIC. The existing hard-coded platform checks still
seem to be needed, as on these platforms CLOCK_MONOTONIC is available for
some functions, but doesn't work with timer_create() for one reason or
another. But the new check should avoid failures on platforms without any
monotonic clock support.
* Make opt_intrusive_base symbols visible to avoid UBSAN warnings.
* Avoid potential set-but-unused warning - with both chert and glass disabled,
last_docid's final set value isn't used, which GCC doesn't warn about, but
other compilers might.
* Avoid explicit recursive return of void - we've had warnings for such cases
from some compilers in the past, and it's an odd thing to do outside of a
template.
Xapian-core 1.3.6 (2016-05-09):
API:
* TfIdfWeight: Support freq and squared IDF normalisations. Patch from Vivek
Pal.
* New Xapian::Query::OP_INVALID to provide an "invalid" query object.
* Reject OP_NEAR/OP_PHRASE with non-leaf subqueries early to avoid a
potential segmentation fault if the non-leaf subquery decayed at
just the wrong moment. See #508.
* Reduce positional queries with a MatchAll or PostingSource subquery to
MatchNothing (since these subqueries have no positional information, so
the query can't match).
* Deprecate ValueRangeProcessor and introduce new RangeProcessor class as
a replacement. RangeProcessor()::operator()() method returns Xapian::Query,
so a range can expand to any query. OP_INVALID is used to signal that
a range is not recognised. Fixes #663.
* Combining of ranges over the same quantity with OP_OR is now handled by
an explicit "grouping" parameter, with a sensible default which works
for value range queries. Boolean term prefixes and FieldProcessor now
support "grouping" too, so ranges and other filters can now be grouped
together.
* Formally deprecate WritableDatabase::flush(). The replacement commit()
method was added in 1.1.0, so code can be switched to use this and still
work with 1.2.x.
* Fix handling of a self-initialised PIMPL object (e.g. Xapian::Query q(q);).
Previously the uninitialised pointer was copied to itself, resulting in
undefined behaviour when the object was used. This isn't something you'd see
in normal code, but it's a cheap check which can probably be optimised away
by the compiler (GCC 6 does).
testsuite:
* Fix testcase notermlist1 to check correct table extension - ".glass" not
".DB" (chert doesn't support DB_NO_TERMLIST).
build system:
* Bootstrap with autoconf 2.69. This requires GNU m4 >= 4.6, but that should
no longer be an issue on developer machines.
* Fix build with --enable-log. Debug logging was trying to log
compress_strategy parameter which was removed recently. Reported by Ankit
Paliwal on xapian-devel.
documentation:
* Fix misfiled deprecation notes. Various things marked as deprecated and
removed in 1.3.x have in fact been deprecated but not removed (they were just
added to the wrong list). One instance queried by David Bremner on #xapian,
and a review found several more.
* Improve docs for lcov makefile targets - say that these are targets in the
xapian-core directory (noted by poe_ on #xapian), document
coverage-reconfigure-maintainer-mode target, and clarify what the example of
how to use GENHTML_ARGS actually does.
* Note that Java bindings use xapian/iterator.h.
* Update release checklist. The script to build the release tarballs now
automates some of the changes needed in trac.
portability:
* Fix build with Android NDK which declares sys_errlist and sys_nerr in the
C library headers, but doesn't actually define them in the library itself.
The configure test now tries to link a trivial program which uses these
symbols. Patch from Tejas Jogi.
Xapian-core 1.3.5 (2016-04-01):
This release includes all changes from 1.2.23 which are relevant.
API:
* The Snipper class has been replaced with a new MSet::snippet() method.
The implementation has also been redone - the existing implementation was
slower than ideal, and didn't directly consider the query so would sometimes
selects a snippet which doesn't contain any of the query terms (which users
quite reasonably found surprising). The new implementation is faster, will
always prefer snippets containing query terms, and also understands exact
phrases and wildcards. Fixes #211.
* Add optional reference counting support for ErrorHandler, ExpandDecider,
KeyMaker, PostingSource, Stopper and TermGenerator. Fixes #186, reported
by Richard Boulton. (ErrorHandler's reference counting isn't actually used
anywhere in xapian-core currently, but means we can hook it up in 1.4.x if
ticket #3 gets addressed).
* Deprecate public member variables of PostingSource. The new getters and/or
setters added in 1.2.23 and 1.3.5 are preferred. Fixes #499, reported by
Joost Cassee.
* Reimplement MSet and MSetIterator. MSetIterator internally now counts down
to the end of the MSet, so the end test is now against 0, rather than against
mset.size(). And more of the trivial methods are now inlined, which reduces
the number of relocations needed to load the library, and should give faster
code which is a very similar size to before.
* Only issue prefetch hints for documents if MSet::fetch() is called. It's not
useful to send the prefetch hint right before the actual read, which was
happening since the implementation of prefetch hints in 1.3.4. Fixes #671,
reported by Will Greenberg.
* Fix OP_ELITE_SET selection in multi-database case - we were selecting
different sets for each subdatabase, but removing the special case check for
termfreq_max == 0 solves that.
* Remove "experimental" marker from FieldProcessor, since we're happy with the
API as-is. Reported by David Bremner on xapian-discuss.
* Remove "experimental" marker from Database::check(). We've not had any
negative feedback on the current API.
* Databse::check() now checks that doccount <= last_docid.
* Database::compact() on a WritableDatabase with uncommitted changes could
produce a corrupted output. We now throw Xapian::InvalidOperationError in
this case, with a message suggesting you either commit() or open the database
from disk to compact from. Reported by Will Greenberg on #xapian-discuss
* Add Arabic stemmer. Patch from Assem Chelli in
https://github.com/xapian/xapian/pull/45
* Improve the Arabic stopword list. Patch from Assem Chelli.
* Make functions defined in xapian/iterator.h 'inline'.
* Don't force the user to specify the metric in the geospatial API -
GreatCircleMetric is probably what most users will want, so a sensible
default.
* Xapian::DBCHECK_SHOW_BITMAP: This was added in 1.3.0 (so has never been in
a stable release) and was superseded by Xapian::DBCHECK_SHOW_FREELIST in
1.3.2, so just remove it.
* Make setting an ErrorHandler a no-op - this feature is deprecated and we're
not aware of anyone using it. We're hoping to rework ErrorHandler in 1.4.x,
which will be simpler without having to support the current behaviour as well
as the new. See #3.
testsuite:
* unittest: We can't use Assert() to unit test noexcept code as it throws an
exception if it fails. Instead set up macros to set a variable and return if
an assertion fails in a unittest testcase, and check that variable in the
harness.
glass backend:
* Make glass the default backend. The format should now be stable, except
perhaps in the unlikely event that a bug emerges which requires a format
change to address.
* Don't explicitly store the 2 byte "component_of" counter for the first
component of every Btree entry in leaf blocks - instead use one of the upper
bits of the length to store a "first component" flag. This directly saves 2
bytes per entry in the Btree, plus additional space due to fewer blocks and
fewer levels being needed as a result. This particularly helps the position
table, which has a lot of entries, many of them very small. The saving would
be expected to be a little less than the saving from the change which shaved
2 bytes of every Btree item in 1.3.4 (since that saved 2 bytes multiple times
for large entries which get split into multiple items). A simple test
suggests a saving of several percent in total DB size, which fits that. This
change reduces the maximum component size to 8194, which affects tables
with a 64KB blocksize in normal use and tables with >= 16KB blocksize with
full compaction.
* Refactor glass backend key comparison - == and < operations are replaced by
a compare() function returns negative, 0 or positive (like strcmp(), memcmp()
and std::string::compare()). This allows us to avoid a final compare to
check for equality when binary chopping, and to terminate early if the binary
chop hits the exact entry.
* If a cursor is moved to an entry which doesn't exist, we need to step back to
the first component of previous entry before we can read its tag. However we
often don't actually read its tag (e.g. if we only wanted the key), so make
this stepping back lazy so we can avoid doing it when we don't want to read
the tag.
* Avoid creating std::string objects to hold data when compressing and
decompressing tags with zlib.
* Store minimum compression length per table in the version file, with 0
meaning "don't compress". Currently you can only change this setting with a
hex editor on the file, but now it is there we can later make use of it
without needing a database format change.
* Database::check() now performs additional consistency checks for glass.
Reported by Jean-Francois Dockes and Bob Cargill via xapian-discuss.
* Database::check(): check docids don't exceed db_last_docid when checking
a single glass table.
* We now throw DatabaseCorruptError in a few cases where it's appropriate
but we didn't previously, in particular in the case where all the files in a
DB have been truncated to zero size (which makes handling of this case
consistent with chert).
* Fix compaction to a single file which already exists. This was hanging.
Noted by Will Greenberg on #xapian.
chert backend:
* When using 64-bit Xapian::docid, consistently use the actual maximum valid
docid value rather instead of the maximum value the type can hold.
build system:
* Default to only building shared libraries. Building both shared and static
means having to compile the files which make up the library twice on most
platforms. Shared libraries are the better option for most users, and if
anyone really wants static libraries they can configure with --enable-static
(or --enable-static=xapian-core if configuring a combined tree with the
bindings).
* Fix XAPIAN_TEST_LINKER_FLAG macro to actually test if it's possible to link
with the option in LDFLAGS - previously we attempted to guess based on
whether the error message from $CXX $flag contained the option name, which
doesn't actually work very well.
documentation:
* Document that OP_WILDCARD expansion limits currently work per sub-db.
* Remove reference to ChangeLog files, as we are no longer updating them.
* Remove link to apidoc.pdf which we no longer generate this by default.
* Clarify LatLongCoord::operator< purpose in API documentation.
* Fix documentation comment typo - LatLongDistancePostingSource is a posting
source, not a match decider!
* HACKING: Recommend lcov 1.11 as it uses much less memory
tools:
* xapian-replicate: Obviously corrupt replicas now self-heal. If a replica
database fails to open with DatabaseCorruptError then a full copy is now
forced.
portability:
* Eliminate arrays of C strings, which result in relocations at library load
time, slowing startup and making pages containing them unsharable.
* Refactor MSet::fetch() to reduce load time relocations.
debug code:
* Fix to build when configured with --enable-assertions.
* Fix to build when configured with --enable-log. Reported by Tim McNamara
on #xapian-discuss.
Xapian-core 1.3.4 (2016-01-01):
This release includes all changes from 1.2.22 which are relevant.
API:
* Update to Unicode 8.0.0. Fixes #680.
* Overhaul database compaction API. Add a Xapian::Database::compact() method,
with the Database object specifying the source database(s).
Xapian::Compactor is now just a functor to use if you want to control
progress reporting and/or the merging of user metadata. The existing API
has been reimplemented using the new one, but is marked as deprecated.
* Add support for a default value when sorting. Fixes #452, patch from
Richard Boulton.
* Make all functor objects non-copyable. Previously some were, some weren't,
but it's hard to correctly make use of this ability. Fixes #681.
* Fix use after free with WILDCARD_LIMIT_MOST_FREQUENT. If we tried to open a
postlist after processing such a wildcard, the postlist hint could be
pointing to a PostList object which had been deleted. Fixes #696, reported
by coventry.
* Add support for optional reference counting of MatchSpy objects.
* Improve Document::get_description() - the output is now always valid UTF-8,
doesn't contain implementation details like "Document::Internal", and more
clearly reports if the document is linked to a database.
* Remove XAPIAN_CONST_FUNCTION marker from sortable_serialise_() helper, as it
writes to the passed in buffer, so it isn't const or pure. Fixes
decvalwtsource2 testcase failure when compiled with clang.
* Make PostingSource::set_maxweight() public - it's hard to wrap for the
bindings as a protected method. Fixes #498, reported by Richard Boulton.
testsuite:
* Add unit test for internal C_isupper(), etc functions.
matcher:
* Optimise value range which is a superset of the bounds. If the value
frequency is equal to the doccount, such a range is equivalent to MatchAll,
and we now avoid having to read the valuestream at all.
* Optimise OP_VALUE_RANGE when the upper bound can't be exceeded. In this
case, we now use ValueGePostList instead of ValueRangePostList.
glass backend:
* Shave 2 bytes of every Btree item (which will probably typically reduce
database size by several percent).
* More compact item format for branch blocks - 2 bytes per item smaller. This
means each branch block can branch more ways, reducing the number of Btree
levels needed, which is especially helpful for cold-cache search times.
* Track an upper bound on spelling word frequency. This isn't currently used,
but will be useful for improving the spelling algorithm, and we want to
stabilise the glass backend format. See #225, reported by Philip Neustrom.
* Support 64-bit docids in the glass backend on-disk format. This changes the
encoding used by pack_uint_preserving_sort() to one which supports 64 bit
values, and is a byte smaller for values 16384-32767, and the same size for
all other 32 bit values. Fixes #686, from original report by James Aylett.
* Use memcpy() not memmove() when no risk of overlap.
* Store length of just the key data itself, allowing keys to be up to 255 bytes
long - the previous limit was 252.
* Change glass to store DB stats in the version file. Previously we stored
them in a special item in the postlist table, but putting them in the version
file reduces the number of block reads required to open the database, is
simpler to deal with, and means we can potentially recalculate tight upper
and lower bounds for an existing database without having to commit a new
revision.
* Add support for a single-file variant for glass. Currently such databases
can only be opened for reading - to create one you need to use
xapian-compact (or its API equivalent). You can embed such databases within
another file, and open them by passing in a file descriptor open on that file
and positioned at the offset the database starts at). Database::check() also
supports them. Fixes #666, reported by Will Greenberg (and previously
suggested on xapian-discuss by Emmanuel Engelhart).
* Avoid potential DB corruption with full-compaction when using 64K blocks.
* Where posix_fadvise() is available, use it to prefetch postlist Btree blocks
from the level below the root block which will be needed for postlists of
terms in the query, and similarly for the docdata table when MSet::fetch() is
called. Based on patch by Will Greenberg in #671.
chert backend:
* Where posix_fadvise() is available, use it to prefetch postlist Btree blocks
from the level below the root block which will be needed for postlists of
terms in the query, and similarly for the record table when MSet::fetch() is
called. Based on patch by Will Greenberg in #671.
remote backend:
* Fix hook for remote support of user weighting schemes. The commented-out
code used entirely the wrong class - now we use the server object we have
access to, and forward the method to the class which needs it.
build system:
* New configure options --enable-64bit-docid and --enable-64bit-termcount,
which control the size of these types. Because these types are used in
the API, libraries built with different combinations of them won't be ABI
compatible. Based heavily on patch from James Aylett and Dylan Griffith.
Fixes #385.
* Sort out hiding most of the internal symbols which had public visibility
for various reason. Mostly addresses #63.
tools:
* xapian-inspect: We no longer install this - it's really an aid to Xapian
development rather than a user tool.
portability:
* Minimum supported GCC version is now documented as GCC 4.7, for C++11
support. Previously we documented 4.7 as the oldest known to work.
* Use CLOCK_REALTIME with timer_create() on Cygwin.
* Don't include winsock headers on Cygwin. Instead include <arpa/inet.h> for
htons() and htonl().
* Handle AI_ADDRCONFIG not being defined by some mingw versions.
* Fix to handle mingw now providing a nanosleep() function.
* Use WSAAddressToString instead of inet_ntop under __WIN32__ - at least under
mingw we don't seem to have inet_ntop().
* Fix testsuite to compile when S_ISSOCK() isn't defined.
debug code:
* Add missing parameters to debug logging for a few methods.
Xapian-core 1.3.3 (2015-06-01):
This release includes all changes from 1.2.20-1.2.21 which are relevant.
API:
* Database:
+ Add new flag Xapian::DB_RETRY_LOCK which allows opening a database for
writing to wait until it can get a write lock. (Fixes #275, reported by
Richard Boulton).
+ Fix Database::get_doclength_lower_bound() over multiple databases when some
are empty or consist only of zero-length documents. Previously this would
report a lower bound of zero, now it reports the same lowest bound as a
single database containing all the same documents.
+ Database::check(): When checking a single table, handle the ".glass"
extension on glass database tables, and use the extension to guide the
decision of which backend the table is from.
* Query:
+ Add new OP_WILDCARD query operator, which expands wildcards lazily, so now
we create the PostList tree for a wildcard directly, rather than creating
an intermediate Query tree. OP_WILDCARD offers a choice of ways to limit
wildcard expansion (no limit, throw an exception, use the first N by term
name, or use the most frequent N). (See tickets #48 and #608).
* QueryParser:
+ Add new set_max_expansion() method which provides access to OP_WILDCARD's
choice of ways to limit expansion and can set limits for partial terms as
well as for wildcards. Partial terms now default to the 100 most frequent
matching terms. (Completes #608, reported by boomboo).
+ Deprecate set_max_wildcard_expansion() in favour of set_max_expansion().
* Add support for optional reference counting of FieldProcessor and
ValueRangeProcessor objects.
testsuite:
* If command line option --verbose/-v isn't specified, set the verbosity level
from environmental variable VERBOSE.
* Re-enable replicate3 for glass, as it no longer fails.
* Add more test coverage for get_unique_terms().
* Don't leave an extra fd open when starting xapian-tcpsrv for remotetcp tests.
glass backend:
* When reporting freelist errors during a database check, distinguish between a
block in use and in the freelist, and a block in the freelist more than once.
* Fix compaction and database checking for the change to the format of keys
in the positionlist table which happened in 1.3.2.
* After splitting a block, we always insert the new block in the parent right
after the block it was split from - there's no need to binary chop.
* Avoid infinite recursion when we hit the end of the freelist block we're
reading and the end of the block we're writing at the same time.
* Fix freelist handling to allow for the newly loaded first block of the
freelist being already used up.
chert backend:
* Fix problems with get_unique_terms() on a modified chert database.
* Fix xapian-check on a single chert table, which seg faulted in 1.3.2.
remote backend:
* Avoid dividing zero by zero when calculating the average length for an empty
database.
build system:
* Merge generate-allsnowballheaders script into collate-sbl.
portability:
* A compiler with good support for C++11 is now required to build Xapian.
Most of the actively developed C++ compilers already have decent support,
or are close to having it, and it makes development easier and more
efficient. Currently known to work: GCC >= 4.7, recent versions of clang
(3.5 works). Solaris Studio 12.4 compiles the code, but tests currently
fail. IBM's xlC doesn't support enough of C++11 yet. HP's aCC hasn't
been tested, but its documentation suggests it also doesn't support enough
of C++11 yet.
* Drop workarounds and special cases for old versions of various compilers
which don't support C++11.
* Use C++11's static_assert() and unique_ptr instead of custom implementations
of equivalent functionality.
* Building on OS/2 with EMX is no longer supported - EMX was last updated in
2001 and comes with GCC 3.2.1, which is much too old to support C++11.
* Building with SGI's and Compaq's C++ compilers is no longer supported -
both seem to have ceased development, and don't support C++11.
* Building with STLport is no longer supported - STLport was last released in
2008, so it's no longer actively developed and won't support C++11.
* Building on IRIX is no longer supported, because IRIX has reached end of
life.
* Disable "<FUNCTION> is expected to return a value" warning from Sun's C++
compiler, as it fires for functions which end in a "throw" statement.
Genuine instances of missing return values will be caught by compilers with
superior warning machinery.
* Fix warning from GCC 5.1 where template expansion leads to the comparison
(bool_value < 255) which is always true. Warning introduced by changes in
1.3.2.
* Use getaddrinfo() instead of gethostbyname(), since the latter may not be
thread-safe, and as a step towards IPv6 support (see #374), but currently we
still only look for IPv4 addresses.
* timer_create() seems to always fail on AIX with EAGAIN, so just skip the
matchtimelimit1 testcase there.
* Under __WIN32__, we need to specify Vista as the minimum supported version to
get the AI_ADDRCONFIG flag. Older versions seem to all be out of support
anyway.
* Change configure probe for log2() to check for a declaration in <cmath>
to get it to fix build on Solaris with Sun C++. C++11 compilers should all
provide log2(), but let's not rely on that just yet as it's easy to provide a
fallback implementation.
* Use scalbn() instead of ldexp() where possible (which we can in all cases
when FLT_RADIX == 2, as it is on pretty much all current platforms). On
overflow and underflow ldexp() sets errno, which it seems better to avoid
doing.
* The list of stemmers is now in the same static const struct as the version
info, and Stem::get_available_languages() is just an inlined wrapper which
fetches this structure and returns the appropriate member. This saves a
relocation, reducing library load time a little.
* Remove "pure" attribute from API functions which could throw an exception.
These functions aren't really pure, and while we're happy for calls to them
to be CSE-ed or eliminated entirely, the compiler might make more assumptions
than that about a pure function - clang seems to assume pure => nothrow and
an exception from such a function can't be caught.
* Remove "pure" attribute from sortable_unserialise(), which can raise floating
point exceptions FE_OVERFLOW and FE_UNDERFLOW.
* Add "nothrow" attribute to more API functions which will never throw an
exception.
* Make sortable_serialise() an inlined wrapper around a function which won't
throw and can be flagged with attribute 'const'.
* Tweak sortable_unserialise() not to compare with a fixed string by
constructing a temporary std::string object (which could throw
std::bad_alloc), and mark it as XAPIAN_NOTHROW.
debug code:
* Only enable assertions in sortable_serialise() and sortable_unserialise() in
the testsuite (since these functions shouldn't throw exceptions), and move
the tests of these functions from queryparsertest to unittest to facilitate
this.
* Add more assertions to the glass backend code.
Xapian-core 1.3.2 (2014-11-24):
This release includes all changes from 1.2.16-1.2.19 which are relevant.
API:
* Update Unicode character database to Unicode 7.0.0.
* New Xapian::Snipper class from Mihai Bivol's GSOC 2012 project. (mostly
fixes #211)
* Fix all get_description() methods to always return UTF-8 text. (fixes #620)
* Database::check():
+ Alter to take its "out" parameter as a pointer to std::ostream instead of a
reference, and make passing NULL mean "do not produce output", and make
the second and third parameters optional, defaulting to a quiet check.
+ Escape invalid UTF-8 data in keys and tags reported by xapian-check, using
the same code we use to clean up strings returned by get_description()
methods.
+ Correct failure message which talks above the root block when it's actually
testing a leaf key.
+ Rename DBCHECK_SHOW_BITMAP to DBCHECK_SHOW_FREELIST (old name still
provided for now, but flagged as deprecated - DBCHECK_SHOW_BITMAP was new
in 1.3.0, so will likely be removed before 1.4.0).
* Methods and functions which take a string to unserialise now consistently
call that parameter "serialised".
* Weight: Make number of distinct terms indexing each document and the
collection frequency of the term available to subclasses. Patch from
Gaurav Arora's Language Modelling branch.
* WritableDatabase: Add support for multiple subdatabases, and support opening
a stub database containing multiple subdatabases as a WritableDatabase.
* WritableDatabase can now be constructed from just a pathname (defaulting to
opening the database with DB_CREATE_OR_OPEN).
* WritableDatabase: Add flags which can be bitwise OR-ed into the second
argument when constructing:
+ Xapian::DB_NO_SYNC: to disable use of fsync, etc
+ Xapian::DB_DANGEROUS: to enable in-place updates
+ Xapian::DB_BACKEND_CHERT: if creating, create a chert database
+ Xapian::DB_BACKEND_GLASS: if creating, create a glass database
+ Xapian::DB_NO_TERMLIST: create a database without a termlist (see #181)
+ Xapian::DB_FULL_SYNC flag - if this is set for a database, we use the Mac
OS X F_FULL_SYNC instead of fdatasync()/fsync()/etc on the version file
when committing.
* Database: Add optional flags argument to constructor - the following can be
bitwise OR-ed into it:
+ Xapian::DB_BACKEND_CHERT (only open a chert database)
+ Xapian::DB_BACKEND_GLASS (only open a glass database)
+ Xapian::DB_BACKEND_STUB (only open a stub database)
* Xapian::Auto::open_stub() and Xapian::Chert::open() are now deprecated in
favour of these new flags.
* Add LMWeight class, which implements the Unigram Language Modelling weighting
scheme. Patch from Gaurav Arora.
* Add implementations of a number of DfR weighting schemes (BB2, DLH, DPH,
IfB2, IneB2, InL2, PL2). Patches from Aarsh Shah.
* Add support for the Bo1 query expansion scheme. Patch from Aarsh Shah.
* Add Enquire::set_time_limit() method which sets a timelimit after which
check_at_least will be disabled.
* Database: Trying to perform operations on a database with no subdatabases now
throws InvalidOperationError not DocNotFoundError.
* Query: Implement new OP_MAX query operator, which returns the maximum weight
of any of its subqueries. (see #360)
* Query: Add methods to allow introspection on Query objects - currently you
can read the leaf type/operator, how many subqueries there are, and get a
particular subquery. For a query which is a term, Query::get_terms_begin()
allows you to get the term. (see #159)
* Query: Only simplify OP_SYNONYM with a single subquery if that subquery is a
term or MatchAll.
* Avoid two vector copies when storing term positions in most common cases.
* Reimplement version functions to use a single function in libxapian which
returns a pointer to a static const struct containing the version
information, with inline wrappers in the API header which call this. This
means we only need one relocation instead of 4, reducing library load time a
little.
* Make TermGenerator flags an anonymous enum, and typedef TermGenerator::flags
to int for backward compatibility with existing user code which uses it.
* Stem: Fix incorrect Unicode codepoints for o-double-acute and u-double-acute
in the Hungarian Snowball stemmer. Reported by Tom Lane to snowball-discuss.
* Stem: Add an early english stemmer.
* Provide the stopword lists from Snowball plus an Arabic one, installed in
${prefix}/share/xapian-core/stopwords/. Patch from Assem Chelli, fixes #269.
* Improve check for direct inclusion of Xapian subheaders in user code to
catch more cases.
* Add simple API to help with creating language-idiomatic iterator wrappers
in <xapian/iterator.h>.
testsuite:
* Extend checkstatsweight1 to check that Weight::get_collection_freq() returns
the same number as Database::get_collection_freq().
* queryparsertest: Add testcase for FieldProcessor on boolean prefix with
quoted contents.
* queryparsertest: Enable some disabled cases which actually work (in some
cases with slightly tweaked expected answers which are equivalent to those
that were shown).
* Make use of the new writable multidatabase feature to simplify the
multi-database handling in the test harness.
* Change querypairwise1_helper to repeat the query build 100 times, as with a
fast modern machine we were sometimes trying with so many subqueries that we
would run out of stack.
* apitest: Use Xapian::Database::check() in cursordelbug1. (partly addresses
#238)
* apitest: Test Query ops with a single MatchAll subquery.
* apitest: New testcase readonlyparentdir1 to ensure that commit works with a
read-only parent directory.
matcher:
* Streamline collation of statistics for use by weighting schemes - tests show
a 2% or so increase in speed in some cases.
* If a term matches all documents and its weight doesn't depend on its wdf, we
can optimise it to MatchAll (the previous requirement that maxpart == 0 was
unnecessarily strict).
* Fix the check for a term which matches all documents to use the sub-db
termfreq, not the combined db termfreq.
* When we optimise a postlist for a term which matches all documents to use
MatchAll, we still need to set a weight object on it to get percentages
calculated correctly.
glass backend:
* 'brass' backend renamed to 'glass' - we decided to use names in ascending
alphabetical order to make it easier to understand which backend is newest,
and since 'flint' was used recently, we skipped over 'd', 'e' and 'f'.
* Change positionlist keys to be ordered by term first rather than docid first,
which helps phrase searching significantly. For more efficient indexing,
positionlist changes are now batched up in memory and written out in key
order.
* Use a separate cursor for each position list - now we're ordering the
position B-tree by term first, phrase matching would cause a single cursor
to cycle between disparate areas of the B-tree and reread the same blocks
repeatedly.
* Reference count blocks in the btree cursor, so cursors can cheaply share
blocks. This can significantly reduce the amount of memory used by cursors
for queries which contain a lot of terms (e.g. wildcards which expand to a
lot of terms).
* Under glass, optimise the turning of a query into a postlist to reuse the
cursor blocks which are the same as the previous term's postlist. This is
particularly effective for a wildcard query which expands to a lot of terms.
* Keep track of unused blocks in the Btrees using freelists rather than
bitmaps. (fixes #40)
* Eliminate the base files, and instead store the root block and freelist
pointers in the "iamglass" file.
* When compacting, sync all the tables together at the end.
* In DB_DANGEROUS mode, update the version file in-place.
* Only actually store the document data if it is non-empty. The table which
holds the document data is now lazily created, so won't exist if you never
set the document data.
chert backend:
* Improve DBCHECK_FIX:
+ if fixing a whole database, we now take the revision from the first table
we successfully look at, which should be correct in most cases, and is
definitely better than trying to determine the revision of each broken
table independently.
+ handle a zero-sized .DB file.
+ After we successfully regenerate baseA, remove any empty baseB file to
prevent it causing problems. Tracked down with help from Phil Hands.
remote backend:
* Bump remote protocol version to 38.0, due to extra statistics being tracked
for weighting.
* Make Weight::Internal track if any max_part values are set, so we don't need
to serialise them when they've not been set.
build system:
* Fix conditional for enabling replication code - if chert is disabled but
glass isn't, we should still enable it.
* configure: Add hint for which package to install for rst2html
documentation:
* Don't build, ship or install PDF versions of the API docs by default, but
provide an easy way for people to build it for themselves if they want it.
* Convert equations in rst docs to use LaTeX via the math role and directive.
* Actually ship, process and install geospatial.rst.
* postingsource.rst: Use a modern class in postingsource example. (Noted by
James Aylett)
* Move the protocol docs for the remote and replication protocols into the net/
subdirectory.
* Remove the dir_contents files and all the machinery to handle them.
* HACKING: Note we now use doxygen 1.8.8 for 1.3.x snapshots and releases.
* HACKING: Now using libtool 2.4.3 to bootstrap snapshots and 1.3.x releases.
* HACKING: Now using automake 1.14.1 to bootstrap snapshots and 1.3.x releases.
* HACKING: Drop note about needing git-svn if you're using git - bootstrap now
only uses git-svn if your Xapian tree was checked out using git-svn.
* HACKING: Need sphinx-doc to generate API docs for Python and Python 3 bindings.
* HACKING: Note that MacTeX seems to be the best option if using homebrew.
portability:
* Don't pass an integer argument to log(), to avoid ambiguity errors with xlC
and Sun's C++ compiler. (fixes #627)
* Fix compilations issues with Sun's C++ compiler (mostly missing library
headers).
* Implement RealTime::now() using clock_gettime() where it's available, since
it can provide nanosecond resolution.
* Implement RealTime::sleep() using nanosleep() where it's available, since it
has a simpler API and a finer resolution than select().
* Use lround() instead of round() in geospatial code, since we want the result
as an int. GCC 4.4.3 seems to optimise to use lround() anyway, but other
compilers may not.
* Include <math.h> for lround()/round(). (fixes #628)
* Drop code supporting Microsoft Windows 9x which reached EOL in 2006.
* Under C++11, use unique_ptr for AutoPtr.
* Stop using a reference where we may end up passing *NULL, as that's invalid.
Thanks Nick Lewycky and ubsan for helping track this down.
* In DLHWeight and DPHWeight, avoid dividing by zero when the collection size
is 0.
debug code:
* Fix assertion failure when built with --enable-assertions. The behaviour
when built without assertions happened to be correct.
* Fix assertion in BitReader::decode(), and remove 'Assert(rd);' in two places
where rd is no longer a pointer.
Xapian-core 1.3.1 (2013-05-03):
This release includes all changes from 1.2.10-1.2.15 which are relevant.
API:
* Give an compilation error if user code tries to include API headers other
than xapian.h directly - these other headers are an internal implementation
detail, but experience has shown that some people try to include them
directly. Please just use '#include <xapian.h>' instead.
* Update Unicode character database to Unicode 6.2.0.
* Add FieldProcessor class (ticket#128) - currently marked as an experimental
API while we sort out how best to sort out exactly how it interacts with
other QueryParser features.
* Add implementation of several TF-IDF weighting schemes via a new TfIdfWeight
class.
* Add ExpandDeciderFilterPrefix class which only return terms with a particular
prefix. (fixes #467)
* QueryParser: Adjust handling of Unicode opening/closing double quotes - if a
quoted boolean term was started with ASCII double quote, then only ASCII
double quote can end it, as otherwise it's impossible to quote a term
containing Unicode double quotes.
* Database::check(): If the database can't be opened, don't emit a bogus
warning about there being too many documents to cross-check doclens.
* TradWeight,BM25Weight: Throw SerialisationError instead of NetworkError if
unserialise() fails.
* QueryParser: Change the default stemming strategy to STEM_SOME, to eliminate
the API gotcha that setting a stemmer is ignored until you also set a
strategy.
* Deprecate Xapian::ErrorHandler. (ticket#3)
* Stem: Generate a compact and efficient table to decode language names. This
is both faster and smaller than the approach we were using, with the added
benefit that the table is auto-generated.
* xapian.h:
+ Add check for Qt headers being included before us and defining
'slots' as a macro - if they are, give a clear error advising how to work
around this (previously compilation would fail with a confusing error).
+ Add a similar check for Wt headers which also define 'slots' as a macro
by default.
testsuite:
* tests/generate-api_generated: Test that the string returned by a
get_description() method isn't empty.
* Use git commit hash in title of test coverage reports generated from a git
tree.
matcher:
* Drop MatchNothing subqueries in OR-like situations in add_subquery() rather
than adding them and then handling it later.
* Handle the left side of AND_NOT and AND_MAYBE being MatchNothing in
add_subquery() rather than in done().
* Handle QueryAndLike with a MatchNothing subquery in add_subquery() rather
than done().
* Query: Multi-way operators now store their subquery pointers in a custom
class rather than std::vector<Xapian::Query>. The custom class take the
same amount of space, or often less. It's particularly efficient when
there are two subqueries, which is very desirable as we no longer flatten a
subtree of the same operator as we build the query.
* Optimise an unweighted query term which matches all the documents in a
subdatabase to use the "MatchAll" postlist. (ticket#387)
brass backend:
* Iterating positional data now decodes it lazily, which should speed up
phrases which include common words.
* Compress changesets in brass replication. Increments the changeset version.
Ticket #348
* Restore two missing lines in database checking where we report a block with
the wrong level.
* When checking if a block was newly allocated in this revision, just look
at its revision number rather than consulting the base file's bitmap.
chert backend:
* Iterating positional data now decodes it lazily, which should speed up
phrases which include common words.
remote backend:
* Prefix compress list of terms and metadata keys in the remote protocol.
This requires a remote protocol major version bump.
build system:
* Fix the 'libxapian' to be 'libxapian-1.3' and 'xapian.m4' to be
'xapian-1.3.m4' (this was supposed to be the case for 1.3.0, but the
change wasn't made correctly).
* Remove support for 'configure --enable-quiet', 'make QUIET=' and 'make
QUIET=y' - automake now supports 'configure --enable-silent-rules', 'make
V=1' and 'make V=0' which are broadly equivalent and more standard.
* configure: If we fail to find a function needed for the remote backend, don't
autodisable it - it's more helpful to error out so the use can decide if they
want to pass --disable-backend-remote to disable it, or work out what values
to pass for LIBS, etc to make it work. This also matches what we do for the
disk based backends.
* automake 1.13.1 is now used to generate snapshots and releases.
* Add check-syntax make target to support editor syntax checks.
* Fix to build when configured with --disable-backend-brass
--disable-backend-chert. (ticket#586)
* Generate a check for compatible _DEBUG settings if built with MSVC.
(ticket#389)
* If you run "make coverage-check" by hand, the previous default of compressed
HTML is unhelpful, so don't default to passing --html-gzip to genhtml, but
instead add support for GENHTML_ARGS.
* API methods and functions are now marked as 'const', 'pure', or 'nothrow'
allowing compilers which support such annotations to generate more efficient
code. (tickets #151, #454)
documentation:
* HACKING: Note which MacPorts are needed for development work.
* docs/remote_protocol.rst: Correct error in documentation of REPLY_DOCDATA
message.
tools:
* xapian-check: Add "fix" option, which currently will regenerate iamchert if
it isn't valid, and will regenerate base files from the .DB files (only
really tested on databases which have just been compacted).
portability:
* Fix warning with GCC in build with assertions enabled.
* common/fileutils.cc: Add safeunistd.h for mkdir, required by GCC 4.7
(reported by Gaurav Arora).
* backends/brass/brass_databasereplicator.cc: Use new/delete to avoid variable
length array gcc extension and comply with c++98
* Mark file descriptors as close-on-exec where supported.
* api/queryinternal.cc: Need <functional> for mem_fun().
* Work around Apple's OS X SDK defining a check() macro.
* Add an option to use a flock() based locking implementation for brass and
chert - this is much simpler than using fcntl() due to saner semantics around
releasing locks when closing other descriptors on the same file (at least on
platforms where flock() isn't just a compatibility wrapper around fcntl()).
Sadly we can't simply switch to this without breaking locking compatibility
with previous releases, but it's useful for platforms without fcntl()
locking (it's enabled for DJGPP) and may be useful for custom builds for
special purposes.
packaging:
* xapian-core.spec: Remove xapian-chert-update.
debug code:
* Building with --enable-log works once again.
Xapian-core 1.3.0 (2012-03-14):
API:
* Update Unicode character database to Unicode 6.1.0. (ticket#497)
* TermIterator returned by Enquire::get_matching_terms_begin(),
Query::get_terms_begin(), Database::synonyms_begin(),
QueryParser::stoplist_begin(), and QueryParser::unstem_begin() now stores the
list of terms to iterate much more compactly.
* QueryParser:
+ Allow Unicode curly double quote characters to start and/or end phrases.
+ The set_default_op() method will now reject operators which don't make
sense to set. The operators which are allowed are now explicitly
documented in the API docs.
* Query: The internals have been completely reimplemented (ticket#280). The
notable changes are:
+ Query objects are smaller and should be faster.
+ More readable format for Query::get_description().
+ More compact serialisation format for Query objects.
+ Query operators are no longer flattened as you build up a tree (but the
query optimiser still combines groups of the same operator). This means
that Query objects are truly immutable, and so we don't need to copy Query
objects when composing them. This should also fix a few O(n*n) cases when
building up an n-way query pair-wise. (ticket#273)
+ The Query optimiser can do a few extra optimisations.
* There's now explicit support for geospatial search (this API is currently
marked as experimental). (ticket#481)
* There's now an API (currently experimental) for checking the integrity of
databases (partly addresses ticket#238).
* Database::reopen() now returns true if the database may have been reopened
(previously it returned void). (ticket#548)
* Deprecate Xapian::timeout in favour of POSIX type useconds_t.
* Deprecate Xapian::percent and use int instead in the API and our own code.
* Deprecate Xapian::weight typedef in favour of just using double and change
all uses in the API and our own code. (ticket#560)
* Rearrange members of Xapian::Error to reduce its size (from 48 to 40 bytes on
x86-64 Linux).
* Assignment operators for PositionIterator and TermIterator now return *this
rather than void.
* PositionIterator, PostingIterator, TermIterator and ValueIterator now
handle their reference counts in hand-crafted code rather than using
intrusive_ptr/RefCntPtr, which means the compiler can inline the destructor
and default constructor, so a comparison to an end iterator should now
optimise to a simple NULL pointer check, but without the issues which the
ValueIteratorEnd_ proxy class approach had (such as not working in templates
or some cases of overload resolution).
* Enquire:
+ Previously, Enquire::get_matching_terms_begin() threw InvalidArgumentError
if the query was empty. Now we just return an end iterator, which is more
consistent with how empty queries behave elsewhere.
+ Remove the deprecated old-style match spy approach of using a MatchDecider.
* Remove deprecated Sorter class and MultiValueSorter subclass.
* Xapian::Stem:
+ Add stemmers for Armenian (hy), Basque (eu), and Catalan (ca).
+ Stem::operator= now returns a reference to the assigned-to object.
testsuite:
* Make unittest use the test harness, so it gets all the valgrind and fd leak
checks, and other handy features all the other tests have.
* Improve test coverage in several places.
* Compress generated HTML files in coverage report.
flint backend:
* Remove flint backend.
remote backend:
* When propagating exceptions from a remote backend server, the protocol now
sends a numeric code to represent which exception is being propagated, rather
than the name of the type, as a number can be turned back into an exception
with a simple switch statement and is also less data to transfer.
(ticket#471)
* Remote protocol (these changes require a protocol major version bump):
+ Unify REPLY_GREETING and REPLY_UPDATE.
+ Send (last_docid - doccount) instead of last_docid and (doclen_ubound -
doclen_lbound) instead of doclen_ubound.
* Remove special check which gives a more helpful error message when a modern
client is used against a remote server running Xapian <= 0.9.6.
build system:
* Various changes allow us to now remove XAPIAN_VISIBILITY_DEFAULT from a
number of functions which aren't in the public API (partly addresses
ticket#63).
* configure: For this development series, the library gets a -1.3 suffix and
include files are installed with an extra /xapian-1.3 component to make
parallel installs easier.
* configure: Enable -fshow-column for GCC - things like vim's quickfix mode
will then jump to the appropriate column for a compiler error or warning, not
just the appropriate line.
* Snowball compiler now reports "FILE:LINE:" before each error so tools like
vim's quickfix mode can parse this and bring up the line with the error
automatically.
* docs/doxygen_api.conf.in: Don't generate XML from doxygen for the bindings -
the bindings now do this for themselves. (ticket#262)
documentation:
* INSTALL: Update GCC details - we now recommend 4.3 or newer (was 4.1), and
note that while 3.1 is the hard minimum requirement, the oldest we've tested
with at all recently was 3.3.
* docs/deprecation.rst: Updated.
tools:
* delve:
+ Move delve from examples to bin and rename to xapian-delve.
+ Send errors to stderr not stdout.
* xapian-check: Now reports useful descriptions rather than cryptic numeric
codes for B-tree errors.
debug code:
* Add assertions that the index is in range when dereferencing MSetIterator and
ESetIterator.
* Fix various errors in debug logging statements.
* Add QUERY category for debug logging.
Xapian-core 1.2.23 (2016-03-28):
API:
* PostingSource: Public member variables are now wrapped by methods (mostly
getters and/or setters, depending on whether they should be readable,
writable or both). In 1.3.5, the public members variables have been
deprecated - we've added the replacement methods in 1.2.23 as well to make
it easier for people to migrate over.
chert backend:
* xapian-check now performs additional consistency checks for chert. Reported
by Jean-Francois Dockes and Bob Cargill via xapian-discuss.
documentation:
* Update links to Xapian website and trac to use https, which is now supported,
thanks to James Aylett.
portability:
* On older Linux kernels, rename() of a file within a directory on NFS can
sometimes erroneously fail with EXDEV. This should only happen if you
try to rename a file across filing systems, so workaround this issue by
retrying up to 5 times on EXDEV (which should be plenty to avoid this
bug, and we don't want to risk looping forever). Fixes #698, reported by
Mark Dufour.
Xapian-core 1.2.22 (2015-12-29):
API:
* Add FLAG_CJK_NGRAM for QueryParser and TermGenerator. Has the same effect as
setting the environment variable XAPIAN_CJK_NGRAM. Fixes #180, reported by
Richard Boulton, with contributions from Pavel Strashkin, Mikkel Kamstrup
Erlandsen and Brandon Schaefer.
* Fix bug parsing multiple non-exclusive filter terms - previously this could
result in such filters effectively being ignored.
* Fix Database::get_doclength_lower_bound() over multiple databases when some
are empty or consist only of zero-length documents. Previously this would
report a lower bound of zero, now it reports the same lowest bound as a
single database containing all the same documents.
* Make Database::get_wdf_upper_bound("") return 0.
* Mark constructors taking a single argument as "explicit" to avoid unwanted
implicit conversions.
testsuite:
* If command line option --verbose/-v isn't specified, set the verbosity level
from environmental variable VERBOSE.
* Skip timed tests if $AUTOMATED_TESTING is set. Fixes #553, reported by
Dagobert Michelsen.
* Don't leave an extra fd open when starting xapian-tcpsrv for remotetcp tests.
* apitest: Revert disabling of part of adddoc5 for clang - the test failure was
in fact due to a bug in 1.3.x, and 1.2.x was never affected.
* apitest: Tweak bounds checks in dbstats1 testcase - multi backends should
give tight bounds.
brass backend:
* Format limit on docid now correctly imposed when sizeof(int) > 4.
* Avoid potential DB corruption with full-compaction when using 64K blocks.
chert backend:
* Format limit on docid now correctly imposed when sizeof(int) > 4.
* Avoid potential DB corruption with full-compaction when using 64K blocks.
flint backend:
* Format limit on docid now correctly imposed when sizeof(int) > 4.
* Avoid potential DB corruption with full-compaction when using 64K blocks.
remote backend:
* Fix to handle total document length exceeding 34,359,738,368. (Fixes #678,
reported by matf).
* Avoid dividing by zero when getting the average length for an empty database.
* Stop apparent error from remote server when read-only client disconnects. A
read-only client just closes the connection when done, but the server
previously reported "Got exception NetworkError: Received EOF", which sounds
like there was a problem. Now we just say "Connection closed" here, and
"Connection closed unexpectedly" if the client connects in the middle of an
exchange. Possibly fixes #654, reported by Germán M. Bravo.
* Give a clearer error message when the client and server remote protocol
versions aren't compatible.
* Check length of key in MSG_SETMETADATA.
build system:
* pkg-config: Fix library name in .pc file to say "xapian" not "xapian-core".
Reported by Eric Lindblad to the xapian-devel list.
* Private symbol decode_length() is no longer visible outside the library.
documentation:
* Stop maintaining ChangeLog files. They make merging patches harder, and stop
'git cherry-pick' from working as it should. The git repo history should be
sufficient for complying with GPLv2 2(a).
* Strip out "quickstart" examples which are out of date and rather redundant
with the "simple" examples.
* Correct documentation of Enquire::get_query(). If no query has been set,
the documentation said Xapian::InvalidArgumentError was thrown, but in
fact we just return a default initialised Query object (i.e. Query()). This
seems reasonable behaviour and has been the case since Xapian 0.9.0.
* Document xapian-compact --blocksize takes an argument.
* Update snowball website link to snowballstem.org.
tools:
* xapian-replicate: Fix replication for files > 4GB on 32-bit platforms.
Previously replication would fail to copy a file whose size didn't fit in
size_t. Fixes #685, reported by Josh Elsasser.
* xapian-tcpsrv: Better error if -p/--port not specified
* quest: Support `-f cjk_ngram`.
examples:
* xapian-metadata: Extend "list" subcommand to take optional key prefix.
portability:
* Fix new warnings from recent versions of GCC and clang.
* Add spaces between literal strings and macros which expand to literal strings
for C++11 compatibility in __WIN32__-specific code.
* Need <unistd.h> for unlink() on FreeBSD, reported by Germán M. Bravo via
github PR 72.
* Fix testsuite to build when S_ISSOCK() isn't defined.
* Don't provide our own implementation of sleep() under __WIN32__ if there
already is one - mingw provides one, and in some situations it seems to clash
with ours. Reported to xapian-discuss by John Alveris.
* Add missing '#include <arpa/inet.h>' to htons(). Seems to be implicitly
included on most platforms, but Interix needs it. Reported by Eric Lindblad
on xapian-discuss.
* Disable "<FUNCTION> is expected to return a value" warning from Sun's C++
compiler, as it fires for functions ending in a "throw" statement. Genuine
instances will be caught by compilers with superior warning machinery.
* Prefer scalbn() to ldexp() where possible, since the former doesn't ever set
errno.
* '#include <config.h>' in the "simple" examples, as when compiling with xlC on
AIX, _LARGE_FILES gets defined by AC_SYS_LARGEFILE to enable large file
support, and defining this changes the ABI of std::string, so it also needs
to be defined when compiling code using Xapian.
* On cygwin, include <arpa/inet.h> instead of winsock headers for htons() and
htonl().
* Include <cygwin/version.h> for CYGWIN_VERSION_API_MAJOR.
* Avoid referencing static members via an object in that object's own
definition, as this doesn't work with all compilers (noted with GCC 3.3), and
is a bit of an odd construct anyway. Reported by Eric Lindblad on
xapian-discuss.
* GCC < 3.4.2 lacks operator<< overloads for unsigned long long on some
platforms, so simply work around this by using str(), as this isn't
performance sensitive code. Reported by Eric Lindblad on xapian-discuss.
* Fix delete which should be delete[] in brass backend cursor code.
Xapian-core 1.2.21 (2015-05-20):
API:
* QueryParser: Extend the set of characters allowed in the start of a range to
be anything except for '(' and characters <= ' '. This better matches what's
accepted for a range end (anything except for ')' and characters <= ' ').
Reported by Jani Nikula.
matcher:
* Reimplement OP_PHRASE for non-exact phrases. The previous implementation was
buggy, giving both false positives and false negatives in rare cases when
three or more terms were involved. Fixes #653, reported by Jean-Francois
Dockes.
* Reimplement OP_NEAR - the new implementation consistently requires the terms
to occur at different positions, and fixes some previously missed matches.
* Fix a reversed check for picking the shorter position list for an exact
phrase of two terms. The difference this makes isn't dramatic, but can be
measured (at least with cachegrind). Thanks to kbwt for spotting this.
* When matching an exact phrase, if a term doesn't occur where we want, use
its actual position to advance the anchor term, rather than just checking
the next position of the anchor term.
brass backend:
* Fix cursor versioning to consider cancel() and reopen() as events where
the cursor version may need incrementing, and flag the current cursor version
as used when a cursor is rebuilt. Fixes #675, reported by Germán M. Bravo.
* Avoid using file descriptions < 3 for writable database tables, as it risks
corruption if some code in the same process tries to write to stdout or
stderr without realising it is closed. (Partly addresses #651)
chert backend:
* Fix cursor versioning to consider cancel() and reopen() as events where
the cursor version may need incrementing, and flag the current cursor version
as used when a cursor is rebuilt. Fixes #675, reported by Germán M. Bravo.
* Avoid using file descriptions < 3 for writable database tables, as it risks
corruption if some code in the same process tries to write to stdout or
stderr without realising it is closed. (Partly addresses #651)
flint backend:
* Fix cursor versioning to consider cancel() and reopen() as events where
the cursor version may need incrementing, and flag the current cursor version
as used when a cursor is rebuilt. Fixes #675, reported by Germán M. Bravo.
remote backend:
* Fix sort by value when multiple databases are in use and one or more are
remote. This change necessitated a minor version bump in the remote
protocol. Fixes #674, reported by Dylan Griffith. If you are upgrading a
live system which uses the remote backend, upgrade the servers before the
clients.
build system:
* The compiler ABI check in the public API headers now issues a warning
(instead of an error) for an ABI mismatch for ABI versions 2 and later
(which means GCC >= 3.4). The changes in these ABI versions are bug fixes
for corner cases, so there's a good chance of things working - e.g. building
xapian-bindings with GCC 5.1 (which defaults to ABI version 8) against
xapian-core built with GCC 4.9 (which defaults to ABI version 2) seems to
work OK. A warning is still useful as a clue to what is going on if linking
fails due to a missing symbol.
* xapian-config,xapian-core.pc: When compiling with xlC on AIX, the reported
--cxxflags/--cflags now include -D_LARGE_FILES=1 as this is defined for the
library, and defining it changes the ABI of std::string with this compiler,
so it must also be defined when building code using the Xapian API.
* xapian-core.pc: Include --enable-runtime-pseudo-reloc in --libs output for
mingw and cygwin, like xapian-config does.
* xapian-core.pc: Fix include directory reported by `pkg-config --cflags`.
This bug was harmless if xapian-core was installed to a directory which was
on the default header search path (such as /usr/include).
* xapian-config: Fix typo so cached result of test in is_uninstalled() is
actually used on subsequent calls. Fixes #676, reported (with patch) by Ryan
Schmidt.
* configure: Changes in 1.2.19 broke the custom macro we use to probe for
supported compiler flags such that the flags never got used. This release
fixes this problem.
* configure: Set default value for AUTOM4TE before AC_OUTPUT so the default
will actually get used. Only relevant when building in maintainer mode
(e.g. from git).
* soaktest: Link with libtool's '-no-install' or '-no-fast-install', like we
already do for other test programs, which means that libtool doesn't need to
generate shell script wrappers for them on most platforms.
documentation:
* API documentation: Minor wording tweaks and formatting improvements.
* docs/deprecation.rst: Add deprecation of omindex --preserve-nonduplicates
which happened in 1.2.4.
* HACKING: Update URL.
* HACKING: libtool 2.4.6 is now used for bootstrapping snapshots and releases.
tools:
* xapian-compact: Make sure we open all the tables of input databases at the
same revision. (Fixes #649)
* xapian-metadata: Add 'list' subcommand to list all the metadata keys.
* xapian-replicate: Fix connection timeout to be 10 seconds rather than 10000
seconds (the incorrect timeout has been the case since 1.2.3).
* xapian-replicate: Set SO_KEEPALIVE for xapian-replicate's connection to the
master, and add command line option to allow setting socket-level timeouts
(SO_RCVTIMEO and SO_SNDTIMEO) on platforms that support them. Fixes #546,
reported by nkvoll.
* xapian-replicate-server: Avoid potentially reading uninitialised data if a
changeset file is truncated.
portability:
* Add spaces between literal strings and macros which expand to literal strings
for C++11 compatibility.
* ValueCountMatchSpy::top_values_begin(): Fix the comparison function not to
return true for two equal elements, which manifests as incorrect sorting in
some cases when using clang's libc++ (which recent OS X versions do).
* apitest: The adddoc5 testcase fails under clang due to an exception handling
bug, so just #ifdef out the problematic part of the testcase when building
with clang for now.
* Fix clang warnings on OS X. Reported by Germán M. Bravo.
* Fix examples to build with IBM's xlC compiler on AIX - they were failing due
to _LARGE_FILES being defined for the library build but not for the examples,
and defining this changes the ABI of std::string with this compiler.
* configure: Improve the probe for whether the test harness can use RTTI to
work for IBM's xlC compiler (which defaults to not generating RTTI).
* Fix to build with Sun's C++ compiler.
* Use F_DUPFD where available to dup to a file descriptor which is >= 2, rather
than calling dup() until we get one.
* When unserialising a double, avoid reading one byte past the end of the
serialised value. In practice this was harmless on most platforms, as
dbl_max_mantissa is 255 for IEEE-754 format doubles, and at least GCC's
std::string keeps the buffer nul-terminated. Reported by Germán M. Bravo in
github PR#67.
* When unserialising a double, add missing cast to unsigned char when we check
if the value will fit in the double type. On machines with IEEE-754 doubles
(which is most current platforms) this happened to work OK before. It would
also have been fine on machines where char is unsigned by default.
* Fix incorrect use of "delete" which should be "delete []". This is
undefined behaviour in C++, though the type is POD, so in practice this
probably worked OK on many platforms.
debug code:
* Fix some overly strict assertions in flint, which caused apitest's
cursordelbug1 to fail with assertions on.
Xapian-core 1.2.20 (2015-03-04):
chert backend:
* After splitting a block, we always insert the new block in the parent right
after the block it was split from - there's no need to binary chop.
build system:
* Generate and install a file for pkg-config. (Fixes#540)
* configure: Update link to cygwin FAQ in error message.
documentation:
* include/xapian/weight.h: Document the enum stat_flags values.
* docs/postingsource.rst: Use a modern class in postingsource example. (Noted
by James Aylett)
* docs/deprecation.rst,docs/replication.rst: Fix typos.
* Update doxygen configuration files to avoid warnings about obsolete tags from
newer doxygen versions.
* HACKING: Update details of building Xapian packages.
tools:
* xapian-check: For chert and brass, cross-check the position and postlist
tables to detect positional data for non-existent documents.
portability:
* When locking a database for writing, use F_OFD_SETLK where available, which
avoids having to fork() a child process to hold the lock. This currently
requires Linux kernel >= 3.15, but it has been submitted to POSIX so
hopefully will be widely supported eventually. Thanks to Austin Clements for
pointing out this now exists.
* Fix detection of fdatasync(), which appears to have been broken practically
forever - this means we've probably been using fsync() instead, which
probably isn't a big additional overhead. Thanks to Vlad Shablinsky for
helping with Mac OS X portability of this fix.
* configure: Define MINGW_HAS_SECURE_API under mingw to get _putenv_s()
declared in stdlib.h.
* Use POSIX O_NONBLOCK in preference to O_NDELAY - the semantics of the latter
differ between BSD and System V.
* According to POSIX, strerror() may not be thread safe, so use alternative
thread-safe ways to translate errno values where possible.
* On Microsoft Windows, avoid defining EADDRINUSE, etc if they're already
defined, and use WSAE* constants un-negated - they start from a high value
so won't collide with E* constants.
debug code:
* Add more assertions to the chert backend code.
Xapian-core 1.2.19 (2014-10-21):
API:
* Xapian::BM25Weight:
+ Improve BM25 upper bound in the case when our wdf upper bound > our
document length lower bound. Thanks to Craig Macdonald for pointing out
this trick.
+ Pre-multiply termweight by (param_k1 + 1) rather than doing it for
every weighted term in every document considered.
testsuite:
* Don't report apparent leaks of fds opened on /dev/urandom - at least on
Linux, something in the C library seems to lazily open it, and the report of
a possible leak followed by assurance that it's OK really is just noise we
can do without.
matcher:
* Fix false matches reported for non-exact phrases in some cases. Fixes the
reduced testcase in #657, reported by Jean-Francois Dockes.
brass backend:
* Only full sync after writing the final base file (only affects Max OS X).
chert backend:
* Only full sync after writing the final base file (only affects Max OS X).
flint backend:
* Only full sync after writing the final base file (only affects Max OS X).
build system:
* For Sun's C++ compiler, pass -library=Crun separately since libtool looks for
" -library=stlport4 " (with the spaces). (fixes#650)
* Remove .replicatmp (created by the test suite) upon "make clean".
documentation:
* include/xapian/compactor.h: Fix formatting of doxygen comment.
* HACKING: freecode no longer accepts updates, so drop that item from the
release checklist.
* docs/overview.rst: Add missing database path to example of using
xapian-progsrv in a stub database file.
portability:
* Suppress unused typedef warnings from debugging logging macros, which occur
in functions which always exit via throwing an exception when compiling with
recent versions of GCC or clang.
* Fix debug logging code to compile with clang. (fixes #657, reported by
Germán M. Bravo)
debug code:
* Add missing RETURN() markup for debug logging in a few places, highlighted by
warnings from recent GCC.
* Fix incorrect return types in debug logging annotations so that code compiles
when configured with --enable-log.
Xapian-core 1.2.18 (2014-06-22):
API:
* Document: Fix get_docid() to return the docid for the sub-database (as it
is explicitly documented to) for Document objects passed to functors like
KeyMaker during the match. (fixes#636, reported by Jeff Rand).
* Document: Don't store the termname in OmDocumentTerm - we were only using it
in get_description() output and an exception message. Speeds up indexing
etext.txt using simpleindex by 0.4%, and should reduce memory usage a bit
too. (Change inspired by comments from Vishesh Handa on xapian-devel).
* Database: Iterating the values in a particular slot is now a bit more
efficient for inmemory and remote backends (but still slow compared to
flint, chert and brass).
testsuite:
* apitest: Expand crashrecovery1 to check that the expected base files exist
and ones which shouldn't exist don't.
* queryparsertest: Fix testcase for empty wildcard followed by negation to
enable FLAG_LOVEHATE so the negation is actually parsed. Fortunately the
fixed testcase passes.
matcher:
* OP_SYNONYM: avoid fetching the doclength if the weighting scheme doesn't
need it and the calculated wdf for the synonym is <= doclength_lower_bound
for the current subdatabase. (fixes #360)
build system:
* Releases are now bootstrapped with libtool 2.4.2 instead of 2.4, and with
config.guess and config.sub updated to the latest versions.
documentation:
* Add an example of initializing SimpleStopper using a file listing stopwords.
(Patch from Assem Chelli)
* Improve the descriptions of the stem_strategy values in the API docs.
(Reported by "oilap" on #xapian)
* docs/sorting.rst: Fix incorrect parameter types in Xapian::Weight
subclass example.
* docs/glossary.rst: Add definition of "collection frequency".
* HACKING:
+ makeindex is now in Debian package texlive-binaries.
+ Replace a link to the outdated autotools "goat book" with a link to the
"Portable Shell" chapter of the autoconf manual.
* include/xapian/base.h: Remove very out of date comments talking about atomic
assignment and locking - since 0.5.0 we've adopted a "user locks" policy.
(Reported by Jean-Francois Dockes)
examples:
* delve:
+ Add -A <prefix> option to list all terms with a particular prefix.
+ Send errors to stderr not stdout.
+ If -v is specified more than once, show even more info in some cases.
(NEWS file claimed this was backported in 1.2.15, but it actually wasn't).
* quest:
+ Add --default-op option.
+ Add --weight option to allow the weighting scheme to be specified.
portability:
* Explicitly '#include <algorithm>' for std::max(), fixing build with VS2013.
(Fixes#641, reported by "boomboo").
* Fix testcase blocksize1 not to try to delete an open database, which isn't
possible under Windows. (Fixes #643, reported by Chris Olds)
* docs/quickstart.rst: Split --cxxflags and --libs for portability (noted by
"Hurricane Tong" on xapian-devel).
* Fix warnings with clang 5.0.
debug code:
* Add assertions that weighting scheme upper bounds aren't exceeded.
Xapian-core 1.2.17 (2014-01-29):
API:
* Enquire::set_sort_by_relevance_then_value() and
Enquire::set_sort_by_relevance_then_key(): Fix sense of reverse parameter.
Reported by "boomboo" on IRC.
* BM25Weight: Fix case where (k1 == 0 || b == 0) but k2 != 0. Reported by
"boomboo" on IRC.
* Unicode::tolower(): Fix to give correct results for U+01C5, U+01C8, U+01CB,
and U+01F2 (previously these were left unchanged).
testsuite:
* Automatically probe for and hook in eatmydata to the testsuite using the
wrapper script it now includes.
* Fix apitest to build when brass, chert or flint are disabled.
brass backend:
* Fix handling of invalid block sizes passed to Xapian::Brass::open() - the
size gets fixed as documented, but the uncorrected size was passed to the
base file (and abort() was called if 0 was passed).
* Validate "dir_end" when reading a block. (fixes #592)
chert backend:
* Fix handling of invalid block sizes passed to Xapian::Chert::open() - the
size gets fixed as documented, but the uncorrected size was passed to the
base file (and abort() was called if 0 was passed).
* Validate "dir_end" when reading a block. (fixes #592)
flint backend:
* Fix handling of invalid block sizes passed to Xapian::Flint::open() - the
size gets fixed as documented, but the uncorrected size was passed to the
base file (and abort() was called if 0 was passed).
* Validate "dir_end" when reading a block. (fixes #592)
build system:
* configure: Improve reporting of GCC version.
* Use -no-fast-install on platforms where -no-install causes libtool to emit a
warning.
* docs/Makefile.am: Fix handling of MAINTAINER_NO_DOCS.
* Include UnicodeData.txt and the script to generate the unicode tables from
it.
documentation:
* postingsource.rst: Clarify a couple of points (reported by "vHanda" on IRC).
portability:
* Protect the ValueIterator::check() method against Mac OS X SDK headers
which define a check() macro.
* Fix warning from xlC compiler.
* Avoid use of grep -e in configure, as /usr/bin/grep on Solaris doesn't
support -e.
* Fix check for flags which might be needed for ANSI mode for compilers called
'cxx'.
* configure: Improve handling of Sun's C++ compiler - trick libtool into not
adding -library=Cstd, and prefer -library=stdcxx4 if supported. Explicitly
add -library=Crun which seems to be required, even though the documentation
suggests otherwise.
Xapian-core 1.2.16 (2013-12-04):
API:
* PositionIterator,PostingIterator,TermIterator,ValueIterator: Don't segfault
if skip_to() or check() is called on an iterator which is already at_end().
Reported by David Bremner.
* ValueCountMatchSpy: get_description() on a default-constructed
ValueCountMatchSpy object no longer fails when xapian-core is built with
--enable-log.
* ValueCountMatchSpy: get_total() on a default-constructed ValueCountMatchSpy
object now returns 0 rather than segfaulting.
testsuite:
* If -v/--verbose is specified more than once to a test program, show the
diagnostic output for passing tests as well as failing/skipped ones.
* queryparsertest: Change qp_scale1 to time 5 repetitions of the large query to
help average out variations.
* queryparsertest: Add test coverage for explicit synonym of a term with a
prefix (e.g. ~foo:search).
* apitest: Remove code from registry* testcases which tries to test the
consequences of throwing an exception from a destructor - it's complex to
ensure we don't leak memory while doing this (it seems GCC doesn't release
the object in this case, but clang does), and it's generally frowned upon,
plus C++11 makes destructors noexcept by default.
* Fix "make check" to actually removed cached databases first, as is
intended.
brass backend:
* When moving a cursor on a read-only table, check if the block we want is in
the internal cursor. We already do this for a writable table, as it is
necessary for correctness, but it's a cheap check and may avoid asking the
OS for a block we actually already have.
* Correctly report the database as closed rather than 'Bad file descriptor'
in certain cases.
* Reuse a cursor for reading values from valuestreams rather than creating
a new one each time. This can dramatically reduce the number of blocks
redundantly reread when sorting by value. The rereads will generally get
served from VM cache, but there's still an overhead to that.
chert backend:
* When moving a cursor on a read-only table, check if the block we want is in
the internal cursor. We already do this for a writable table, as it is
necessary for correctness, but it's a cheap check and may avoid asking the
OS for a block we actually already have.
* Correctly report the database as closed rather than 'Bad file descriptor'
in certain cases.
* Reuse a cursor for reading values from valuestreams rather than creating
a new one each time. This can dramatically reduce the number of blocks
redundantly reread when sorting by value. The rereads will generally get
served from VM cache, but there's still an overhead to that.
flint backend:
* When moving a cursor on a read-only table, check if the block we want is in
the internal cursor. We already do this for a writable table, as it is
necessary for correctness, but it's a cheap check and may avoid asking the
OS for a block we actually already have.
* Correctly report the database as closed rather than 'Bad file descriptor'
in certain cases.
build system:
* Compress source tarballs with xz instead of gzip.
* Split XAPIAN_LIBS out of XAPIAN_LDFLAGS so that -l flags for libraries
configure detects are needed appear after -L flags specified by the user
that may be needed to find such libraries. (fixes#626)
* XO_LIB_XAPIAN now handles the user specifying a relative path in
XAPIAN_CONFIG, e.g.: "./configure XAPIAN_CONFIG=../xapian-core/xapian-config"
* Adjust XO_LIB_XAPIAN to strip _gitNNN suffix from snapshot versions.
* configure: Handle git snapshot naming when calculating REVISION.
* configure: Enable -fshow-column for GCC - things like vim's quickfix mode
will then jump to the appropriate column for a compiler error or warning, not
just the appropriate line.
* configure: Report GCC version in configure output.
documentation:
* The API documentation shipped with the release is now generated with
doxygen 1.8.5 instead of 1.5.9, which is most evident in the different
HTML styling newer doxygen uses.
* Document how Utf8Iterator handles invalid UTF-8 in API documentation.
* Improve how descriptions of deprecated features appear in the API
documentation.
* docs/remote_protocol.rst: Correct error in documentation of REPLY_DOCDATA
message.
* docs/overview.rst: Correct documentation for how to specify "prog" remote
databases in stub files.
* Direct users to git in preference to SVN - we'll be switching entirely in
the near future.
tools:
* xapian-chert-update: Fix -b to work rather than always segfaulting (reported
in https://bugs.debian.org/716484).
* xapian-chert-update: The documented alias --blocksize for -b has never
actually been supported, so just drop mentions of it from --help and the man
page.
* xapian-check:
+ Fix chert database check that first docid in each doclength chunk is more
than the last docid in the previous chunk - previously this didn't actually
work.
+ Fix database check not to falsely report "position table: Junk after
position data" whenever there are 7 unused bits (7 is OK, *more* than 7
isn't).
+ Fix to report block numbers correctly for links within the B-tree.
+ If the METAINFO key is missing, only report it once per table.
+ Fix database consistency checking to always open all the tables at the same
revision - not doing this could lead to false errors being reported after a
commit interrupted by the process being killed or the machine crashing.
Reported by Joey Hess in https://bugs.debian.org/724610
examples:
* quest: Add --check-at-least option.
portability:
* configure: clang doesn't support -Wstrict-null-sentinel or -Wlogical-op, so
don't pass it these options.
* Fix build errors and warnings with mingw.
* Suppress "unused local typedef" warnings from GCC 4.8.
* If the compiler supports C++11, use static_assert to implement
CompileTimeAssert.
* tests/zlib-vg.c: Fix two warnings when compiled with clang.
* Fix failure when built with -D_GLIBCXX_DEBUG - we were modifying the top()
element of a heap before calling pop(), such that the heap comparison
operation (which is called when -D_GLIBCXX_DEBUG is on to verify the heap is
valid) would read off the end of the data. In a normal build, this issue
would likely never manifest.
* configure: When generating ABI compatibility checks in xapian/version.h, pass
$CXXFLAGS and $CPPFLAGS to $CXXCPP as they could contain options which affect
the ABI (such as -fabi-version for GCC). (Fixes #622)
* Microsoft GUIDs in binary form have reversed byte order in the first three
components compared to standard UUIDs, so the same database would report a
different UUID on Windows to on other platforms. We now swap the bytes to
match the standard order. With this fix, the UUIDs of existing databases
will appear to change on Windows (except in rare "palindronic" cases).
* Fix a couple of issues to get Xapian to build and work on AIX.
* common/safeuuid.h: Remove bogus take-address-of from uuid handling code for
NetBSD and OpenBSD.
* Under cygwin, use cygwin_conv_path() if using a new enough cygwin version,
rather than the now deprecated cygwin_conv_to_win32_path(). Reported by
"Haroogan" on the xapian-devel mailing list.
* common/safeuuid.h: Add missing '#include <cstdlib>' and qualify free with std.
* Fix 'unused label' warning when chert backend is disabled.
* xapian.h: Add check for Wt headers being included before us and defining
'slots' as a macro - if they are, give a clear error advising how to work
around this (previously compilation would fail with a confusing error).
debug code:
* Fix assertion failure for when an OrPostList decays to an AndPostList - the
ordering of the subqueries by estimated termfreq may not be the same as it
was when the OrPostList was constructed, as the subqueries may themselves
have decayed. Reported by Michel Pelletier.
* Fix -Wcast-qual warning from GCC 4.7 when configured with --enable-log.
Xapian-core 1.2.15 (2013-04-16):
API:
* QueryParser/TermGenerator: Don't include CJK codepoints which are
punctuation in N-grams.
* TermGenerator: Fix bug where we failed to generate the first bigram
from the second sequence of N-grammable CJK characters in a piece of text.
brass backend:
* Call fdatasync()/fsync() when creating the "iambrass" file.
chert backend:
* Call fdatasync()/fsync() when creating the "iamchert" file.
flint backend:
* Call fdatasync()/fsync() when creating the "iamflint" file.
build system:
* XO_LIB_XAPIAN now handles the user specifying XAPIAN_CONFIG without a path,
for example: ./configure XAPIAN_CONFIG=xapian-config-1.3
tools:
* delve: If -v is specified more than once, show even more info in some cases.
portability:
* Fix warning due to needlessly casting away const-ness in debug logging.
* Fix pointer truncation bug in lemon parser generator, which probably affects
regenerating the query parser on WIN64.
debug code:
* Fix to build when configured with --enable-log.
Xapian-core 1.2.14 (2013-03-14):
API:
* MSet::get_document(): Don't cache retrieved Document objects unless they
were requested with fetch(). This avoids using a lot of memory when many
MSet entries are retrieved. (Fixes #604)
testsuite:
* apitest: Improved test coverage.
matcher:
* Check if a candidate document has at least the minimum weight needed
before checking positional information, which speeds up slow phrase
searches (partly addresses #394).
brass backend:
* Fix multipass compaction not to damage document values, and to merge the
database stats correctly. (fixes #615)
chert backend:
* Fix multipass compaction not to damage document values, and to merge the
database stats correctly. (fixes #615)
flint backend:
* Fix multipass compaction bug. (fixes #615)
tools:
* xapian-replicate:
+ Fix handling of delays between replication events - the subtraction of the
target time and the current time was reversed, so we wouldn't sleep when
before the deadline, but would sleep after it for the amount we'd missed it
by.
+ On Microsoft Windows, we no longer sleep for more than 43 years if the
target time for a replication event had already passed. (Fixes #472)
portability:
* matcher/queryoptimiser.cc: Need <functional> for mem_fun().
* tests/harness/testsuite.cc: Don't provide explicit template types to
make_pair - it isn't useful, and breaks with C++11. Fixes build error with
MSVC2012.
* examples/quest.cc: Fix to build with Sun Studio 12 compiler. (ticket#611)
Xapian-core 1.2.13 (2013-01-09):
API:
* TermGenerator: Add new method TermGenerator::set_max_word_length() to allow
this limit to be adjusted by the user.
* QueryParser: Implicitly close any unclosed brackets at the end of the query
string. Patch from Sehaj Singh Kalra.
* DateValueRangeProcessor: Add extra constructor overloaded form so that in
DateValueRangeProcessor(1, "date:"), the const char * gets interpreted as
std::string rather than bool.
testsuite:
* apitest: Assorted test coverage improvements.
* When reporting valgrind errors, skip any warnings before the error in the
valgrind log.
matcher:
* Improved fix for #590 - count all matching LeafPostList objects with a Weight
object rather than trying to prune at the MultiAndPostList level based on
max_wt (if wdf is always zero for a term, BM25 gives max_wt of 0, which lead
to us never counting that subquery.
* Fix calculation of 0.0/0.0 in some cases. This then got used as a minimum
weight, but it seems this gives -nan (at least on x86-64 Linux) so it may
have been harmless in practice.
* We no longer use the highest weighted MSet entry to calculate percentages, so
remove code which finds it.
brass backend:
* Close excess file handles before we get the fcntl lock, which avoids the
lock being released again if one is open on the lock file. Notably this
avoids a situation where multiple threads in the same process could succeed
in locking a database concurrently.
chert backend:
* Close excess file handles before we get the fcntl lock, which avoids the
lock being released again if one is open on the lock file. Notably this
avoids a situation where multiple threads in the same process could succeed
in locking a database concurrently.
flint backend:
* Close excess file handles before we get the fcntl lock, which avoids the
lock being released again if one is open on the lock file. Notably this
avoids a situation where multiple threads in the same process could succeed
in locking a database concurrently.
remote backend:
* Improve the UnimplementedError message for a MatchSpy subclass which doesn't
implement name() so it's clearer that it is this particular subclass which
can't be used remotely, rather than all MatchSpy objects.
build system:
* The build system is now generated with automake 1.11.6 rather than 1.11.1,
which fixes a security issue in "make distcheck" (not something users will
usually run, but it seems worth addressing).
* Use user-specified LIBS for configure tests, which is what you'd expect to
happen, and provides a way for the user to tell configure where to find
library functions which configure can't find for itself.
* INCLUDES is now deprecated in automake, so use AM_CPPFLAGS instead.
* Test coverage rules now assume lcov 1.10 which allows them to be simpler
and not to require a patched version of lcov.
documentation:
* valueranges.html: Update documentation to reflect change in Xapian 1.1.2 -
DateValueRangeProcessor and StringValueRangeProcessor now support a prefix or
suffix.
* Clarify that the "reverse" parameter of set_sort_by_relevance_then_value()
and set_sort_by_relevance_then_key() only affects the ordering of the
value/key part of the sort.
* docs/quickstart.html: Fix seriously outdated statement that Xapian doesn't
create the database directory - that changed in 0.7.2 (released 2003-07-11).
* HACKING: Try to make it clearer we're looking for a dual-licence on submitted
patches.
tools:
* xapian-replicate:
+ Add a --full-copy option to force a full copy to be sent. (ticket#436)
+ Add --quiet option, and be a little more verbose by default.
+ Allow files > 32G to be be copied by replication.
+ Fix "if (fd > 0)" tests in some replication code to be "if (fd >= 0)".
In practice this is unlikely to actually have caused problems since
stdin is typically still open and using fd 0.
+ Simplify how we open the .DB file on the replication slave to just call
open() once with O_CREAT, rather than once without, than stat() if that
fails, and then again with O_CREAT|O_TRUNC if stat() doesn't show an
ordinary file exists.
examples:
* quest:
+ New --flags command line option to allow setting arbitrary QueryParser
flags.
+ Align option descriptions in --help output, and make the initial letter of
such descriptions consistently lowercase.
portability:
* Fix testsuite harness to compile with GCC 4.7.
* On platforms with the F_MAXFD fcntl but without closefrom(), we were failing
to close the highest numbered open fd in our closefrom() replacement.
* Our closefrom() replacement on Linux now works around valgrind not hiding
some extra fds it has open, but then complaining if we try to close them.
+ Pass O_BINARY when opening replication related files in some cases where we
weren't before, which will probably help solve ticket #472.
* configure: socketpair() needs -lnetwork on Haiku.
* Micro-optimisation in Unicode handling - GCC doesn't currently optimise the
arithmetic shift right idiom we use, but it documents that signed right shift
does sign extension so we now just use a right shift for GCC.
debug code:
* Preserve errno over debug logging calls, so they can safely be added to code
which expects errno not to change.
Xapian-core 1.2.12 (2012-06-27):
build system:
* 1.2.11 had its library version information incorrectly set. This resulted in
the shared library having an incorrect SONAME - e.g. on Linux,
libxapian.so.21 instead of libxapian.so.22. This release has been made to
fix this problem.
documentation:
* AUTHORS: Add the GSoC students.
Xapian-core 1.2.11 (2012-06-26):
API:
* Add new QueryParser::STEM_ALL_Z stemming strategy, which stems all terms and
adds a Z prefix. (Patch from Sehaj Singh Kalra, fixes ticket#562)
* Add TermGenerator::set_stemming_strategy() method, with strategies which
correspond to those of QueryParser. Based on patch from Sehaj Singh Kalra,
with some tweaks for adding term positions in more cases. (Fixes ticket#563)
* Correct "BM25Weight" to "TradWeight" in exception message from TradWeight.
* We were failing to call init() for user-defined Weight objects providing the
term-independent weight. These now get called with init(0.0).
* Xapian::Auto::open_stub() now throws a Xapian::DatabaseOpeningError exception
if the stub file can't be opened. Previously we failed to check for this
condition, which resulted in us treating the file as empty.
testsuite:
* When the testsuite is using valgrind, we used to run remote servers under
valgrind too (but with --tool=none) to get consistent behaviour as valgrind's
emulation of x87 excess precision isn't exact. Now we only do this if x87 FP
instructions are actually in use (which means x86 architecture and configure
run with --disable-sse).
* Make sure XAPIAN_MAX_CHANGESETS gets unset after replication testcases which
set it, so further testcases don't waste time generating changesets.
* Improved test coverage (including more tests for closed databases -
ticket#337).
brass backend:
* After closing the database, methods which try to use the termlist would throw
FeatureUnavailableError with message "Database has no termlist", assuming
that the termlist table not being open meant it wasn't present. Fix to check
if the postlist_table is open to determine which case we're in.
chert backend:
* After closing the database, methods which try to use the termlist would throw
FeatureUnavailableError with message "Database has no termlist", assuming
that the termlist table not being open meant it wasn't present. Fix to check
if the postlist_table is open to determine which case we're in.
inmemory backend:
* Check if the database is closed in metadata_keys_begin() for InMemory
Databases.
build system:
* xapian-config: Don't interpret a missing .la file as meaning that we only
have static libraries.
documentation:
* Fix API documentation for Query constructors - both XOR and ELITE_SET can
take any number of subqueries, not only exactly two.
* Backport missing API documentation comments for operator++ and operator*
methods or PositionIterator, PostingIterator and TermGenerator.
* docs/replication.rst: Update documentation - since 1.2.5, the value of
XAPIAN_MAX_CHANGESETS determines how many changesets we keep.
* docs/admin_notes.rst: Correction - we don't "create a lock file", we "lock a
file".
* Fix API documentation for TradWeight constructor - "k1" should be "k".
portability:
* configure: Overhaul handling of compilers which pretend to be GCC. Clang
is now detected, and we only pass it warning flags it actually understands.
And we now check for symbol visibility support with Intel's compiler.
* configure: Solaris automatically pulls in library dependencies, so set
link_all_deplibs_CXX=no there.
* configure: We now check -Bsymbolic-functions for all compilers.
* configure: Enable -Wdouble-promotion for GCC >= 4.6.
* Pass -ldl last when compiling zlib-vg.so, as that seems to be needed on
Ubuntu 12.04.
* Fix incorrect use of "delete" which should be "delete []". This is
undefined behaviour in C++, though the type is POD, so in practice this
probably worked OK on many platforms.
* In BM25Weight when k1 or b is zero (not the default), we used to multiply
an uninitialised double by zero, which is undefined behaviour, but in
practice will often give zero, leading to the desired results.
* xapian.h: Add check for Qt headers being included before us and defining
'slots' as a macro - if they are, give a clear error advising how to work
around this (previously compilation would fail with a confusing error).
Xapian-core 1.2.10 (2012-05-09):
testsuite:
* apitest: Extend tradweight1 to test that TradWeight(0) means that wdf and
document length don't affect the weight of a term.
* termgentest: Check that TermGenerator discards words > 64 bytes.
matcher:
* Don't count unweighted subqueries of MultiAndPostList in percentage
calculations, as OP_FILTER maps to MultiAndPostList now. (ticket#590)
brass backend:
* When compacting, if the output database is empty, don't write out a metainfo
tag. Take care not to divide by zero when computing the percentage size
change for a table.
chert backend:
* When compacting, if the output database is empty, don't write out a metainfo
tag. Take care not to divide by zero when computing the percentage size
change for a table.
documentation:
* API documentation:
+ Note version when Database::close() was added.
+ Fix switched lower and upper in API documentation for Weight methods
get_doclength_lower_bound() and get_doclength_upper_bound(). Correct
maximum to minimum in get_doclength_lower_bound() comment and note that this
excludes zero length documents. Fix "An lower" to "A lower".
* docs/admin_notes.html: Mention that postlist and termlist tables also hold
value info for chert. Mention that xapian-chert-update was removed in 1.3.0.
Mention that you need to use copydatabase from 1.2.x to convert flint to
chert.
* HACKING: Update section on patches to mention git (git diff and git
format-patch), and using "-r" with normal diff, and also that ptardiff offers
a nice way to diff against an unpacked tarball.
debug code:
* Fix use of AssertEq() on NULL, which doesn't compile, at least with recent
GCC.
Xapian-core 1.2.9 (2012-03-08):
API:
* QueryParser: Fix FLAG_AUTO_SYNONYMS not to enable auto multi-word synonyms
too (but in a different way to trunk so as to not break the ABI).
matcher:
* Fix issue with running AND, OR and XOR queries against a database with no
documents in it - this was leading to a divide by zero, which led to
MSet::get_matches_estimated() reporting 2147483648 on i386.
build system:
* Remove configure's --with-stlport and --with-stlport-compiler options, as
they don't allow you to actually specify what you need to (at least to use
the Debian STLport package), and instead document what to pass to configure
to enable building with STLport (though it seems to no longer be actively
maintained, and the debug mode (which is probably the most interesting
feature now) doesn't seem to work on Debian stable).
documentation:
* Document that OP_ELITE_SET with non-term subqueries might pick subqueries
which don't match anything. Closes ticket#49.
* Document that you can define a static operator delete method in your subclass
if deallocation needs to be handled specially. (Closes ticket#554)
* Assorted minor documentation improvements.
portability:
* Address new warnings from GCC 4.6.
* Fix argument order when linking xapian-check to fix mingw build.
(ticket#567)
* Add some missing explicit header includes to fix build with STLport.
Xapian-core 1.2.8 (2011-12-13):
API:
* Add support to TermGenerator and QueryParser for indexing and searching CJK
text using n-grams. Currently this is only enabled when the environmental
variable XAPIAN_CJK_NGRAM is set to a non-empty value.
documentation:
* Add link from index page to apidoc.pdf.
* quickstart.html: Correct link which was to quickstartsearch.cc.html but
should be to quickstartindex.cc.html.
* overview.html,quickstart.html: Fix several factual errors.
* API documentation:
+ Improve documentation comments for several methods.
+ Add documentation for function parameters which didn't have it.
+ Remove bogus paragraph in WritableDatabase::replace_document()
documentation comment which had been cut and pasted from delete_document()
documentation comment. (Fixes ticket#579)
+ Explicitly document which value slot numbers are valid. (Fixes ticket#555)
+ Escape < and > in doxygen comments so "<foo>" doesn't get eaten by doxygen.
portability:
+ Some fixes for warnings when cross-compiling to mingw.
* tests/soaktest/soaktest.cc: With Sun's compiler, random() and srandom()
aren't in <cstdlib> so we need to use <stdlib.h> instead.
Xapian-core 1.2.7 (2011-08-10):
API:
* Document objects now track whether any document positions have been modified
so that replacing a modified document can completely skip considering
updating positions if none have changed. Currently the flint, chert, and
brass backends implement this optimisation. A common case this speeds up is
adding and/or removing boolean filter terms to/from existing documents - for
example this gives an 18% speedup for adding tags in notmuch.
testsuite:
* Make sure that perftest isn't run with libeatmydata preloaded, as making
fsync() a no-op makes performance tests rather bogus.
remote backend:
* Remove unnecessary call to reopen() in the remote servers in a case where
either we had just called it or we are using a writable database and so
reopen() doesn't do anything.
build system:
* configure: -Wshadow gives bogus warnings with 4.0 (at least on Mac OS X), so
disable it for GCC < 4.1 (like the comments already said we did!)
documentation:
* Improve the documentation comment for Database::close(). (ticket#504)
* Fix typo in documentation comment for Enquire constructor which reversed the
intended sense (though the text was fairly obviously wrong before).
* Improve documentation of QueryParser::add_boolean_prefix()'s exclusive
parameter to talk about terms and prefixes rather than values and fields
(which was confusing since "document value" has a particular meaning in
Xapian).
* docs/facets.html: Expand descriptions for indexing and finding facets.
Fix errors in example code.
* docs/index.html: Add links to Omega and bindings documentation.
* docs/remote_protocol.html: Fixed typo which reversed the intended sense.
* xapian-check --help: Document that checking a whole database performs
additional cross-checks between the tables.
* docs/admin_notes.html: Add note about xapian-chert-update.
* docs/deprecation.html: Note here that WritableDatabase::flush() is
deprecated in favour of WritableDatabase::commit().
portability:
* Fix -Wshadow warnings from GCC 4.6.
* Fix warning from GCC 3.3.
debug code:
* Fix some problems with the templates used to implement output of parameters
and return values in debug logging.
Xapian-core 1.2.6 (2011-06-12):
API:
* QueryParser:
+ Add new set_max_wildcard_expansion() method to allow limiting the number of
terms a wildcard can expand to. (ticket#350)
+ If default_op is OP_NEAR or OP_PHRASE then disable stemming of the terms,
since we don't index positional information for stemmed terms by default.
* Spelling correction was failing to correctly handle words which had the same
trigram in an even number of times.
testsuite:
* We now actually include the soaktest code in the release tarballs.
matcher:
* Eliminate some vector copies when handling phrase subqueries in the query
optimiser.
brass backend:
* Kill the child process which holds the lock with SIGKILL as that can't be
ignored, whereas SIGHUP can be in some cases.
chert backend:
* Kill the child process which holds the lock with SIGKILL as that can't be
ignored, whereas SIGHUP can be in some cases.
flint backend:
* Kill the child process which holds the lock with SIGKILL as that can't be
ignored, whereas SIGHUP can be in some cases.
documentation:
* The HTML documentation is now maintained in reStructured Text format.
* docs/queryparser.html: Document the precedence order of operators.
* docs/scalability.html: Bring up-to-date.
* docs/overview.html: Document "remote" in stub databases.
* docs/postingsource.html: Add PostingSource example. (ticket#503)
* include/xapian/database.h: Add @exception InvalidArgumentError for
Database::get_document() (ticket#542).
* Ship ChangeLog.0 in the tarball.
* Assorted minor improvements.
examples:
* examples/delve: Report has_positions().
* examples/simpleindex: Add short description to usage message.
portability:
* Fix to build for mingw.
Xapian-core 1.2.5 (2011-04-04):
API:
* Enquire::get_eset() now accepts a min_wt argument to allow the minimum wanted
weight to be specified. Default is 0, which gives the previous behaviour.
* QueryParser: Handle NEAR/<offset> and ADJ/<offset> where offset isn't an
integer the same way at the end of the query as in the middle.
* Replication:
+ Only keep $XAPIAN_MAX_CHANGESETS changeset files when generating a new one
(previously this variable only controlled if we generated changesets or
not). Closes ticket#278.
+ $XAPIAN_MAX_CHANGESETS is reread each time, rather than only when the
database is opened.
+ If you build Xapian with DANGEROUS mode enabled, changeset files now
actually have the appropriate flag set (the reader will currently throw an
exception, but that's better than quietly handling them incorrectly).
testsuite:
* Compaction tests which generate stub files now close them before performing
the actual compaction, to avoid issues on Microsoft Windows (ticket#525).
* Improve test coverage.
matcher:
* Fix memory leak if an exception is thrown during the match.
brass backend:
* Bumped format version number (we now store the oldest revision for which we
might have a replication changeset).
* Optimise not to read the bitmaps from the base files when opening a database
for reading (cross-port of equivalent change to chert).
* Optimise not to update doclength when it hasn't changed (cross-port of
equivalent change to chert).
* If we try to delete an old base file and it isn't there, just continue rather
than throwing an exception. We wanted to get rid of it anyway, and it may be
NFS issues telling us the wrong thing. In particular, DatabaseCorruptError
was rather a pessimistic assessment.
chert backend:
* Optimise not to read the bitmaps from the base files when opening a database
for reading.
* Optimise not to update doclength when it hasn't changed.
* xapian-chert-update: Fix to handle larger databases, and databases which
have values set.
* If we try to delete an old base file and it isn't there, just continue rather
than throwing an exception. We wanted to get rid of it anyway, and it may be
NFS issues telling us the wrong thing. In particular, DatabaseCorruptError
was rather a pessimistic assessment.
flint backend:
* Optimise not to read the bitmaps from the base files when opening a database
for reading (cross-port of equivalent change to chert).
* Optimise not to update doclength when it hasn't changed (cross-port of
equivalent change to chert).
* If we try to delete an old base file and it isn't there, just continue rather
than throwing an exception. We wanted to get rid of it anyway, and it may be
NFS issues telling us the wrong thing. In particular, DatabaseCorruptError
was rather a pessimistic assessment.
remote backend:
* xapian-tcpsrv: If we can't bind to the specified port because it is a
privileged one, exit with code 77 (EX_NOPERM) to make it easier to
automatically handle failure when starting the server from a script.
build system:
* Snapshots and releases are now bootstrapped with autoconf 2.68 and libtool
2.4.
* configure: -Wstrict-null-sentinel was added in GCC 4.0.1 and so doesn't work
with GCC 4.0.0. For simplicity, only enable it for GCC >= 4.1.
documentation:
* INSTALL: Note how to build for a non-default arch on a multi-arch platform.
* include/xapian/enquire.h: Fix doxygen markup so alternative overloaded forms
of Enquire::get_mset() appear in the API documentation.
* collapsing.html: Add missing document (written some time ago, but never
actually added to builds).
* replication.html: Update documentation to make it clear that users shouldn't
create the destination directory for replication themselves.
* docs/intro_ir.html: Update link to a paper. Update text about book "to be
published in 2008".
* docs/deprecation.html:
+ PostingSource now offers a replacement for Enquire::set_bias().
+ OmegaScript: $set{spelling,true} is now deprecated.
+ Add note about botched removal of Enquire.get_matching_terms from Python
bindings (now fully removed).
+ Note removal of "if idx in mset" from Python bindings.
+ Deprecate MSet.items and ESet.items from Python bindings (ticket#531).
* docs/admin_notes.html: Update for 1.2.5.
* Updates to documentation of internals.
tools:
* xapian-replicate-server: Fix race condition between checking if a file
exists and opening it to replicate it.
* xapian-replicate: Complain unless host name and port number are specified -
previously these defaulted to an empty string and 0, which resulted in
potentially confusing error messages.
* xapian-replicate: If --master isn't specified, default to DATABASE.
examples:
* quest: Report any spelling correction (requires the database contains
spelling data of course).
* copydatabase: Add --no-renumber option.
portability:
* api/compactor.cc: Add missing header <ctime> for time() (ticket#530).
* api/compactor.cc: Use msvc_posix_rename() under __WIN32__ to atomically
update stub file after compaction (ticket#525).
* Fix uninitialised variable warnings with gcc -O3.
* Eliminate std::string member of global static object used when compiled with
--enable-log which was causes problems on Mac OS X.
* Fix some issues highlighted by clang++ warnings.
Xapian-core 1.2.4 (2010-12-19):
API:
* QueryParser:
+ Avoid a double free if Query construction throws an exception in a
particular case. Fixes ticket#515.
+ Allow phrase generators between a probabilistic prefix and the term itself
(e.g. path:/usr/local).
+ The correct window size wasn't being set in some cases when default_op was
set to OP_PHRASE.
* Enquire::get_mset():
+ Avoid pointlessly trying to allocate lots of memory if the first document
requested is larger than the size of the database.
+ An empty query now returns an MSet with firstitem set correctly -
previously firstitem was always 0 in this case.
* Document: Initialise docid to 0 when creating a document from
scratch, as documented.
* Compactor:
+ Move the database compaction and merging functionality into this new class,
and make xapian-compact a simple wrapper around this class. (ticket#175)
+ Inputs can now be stub database directories or files, in which case the
databases in the stub are used as inputs.
+ Add support for compacting to a stub database, which can be one of the
inputs (for atomic update).
+ If spellings and/or synonyms were only present in some source databases,
they weren't copied to the output database, but now they are.
testsuite:
* Improve test coverage (particularly for Xapian::Utf8Iterator and
Xapian::Stem).
* Add zlib-vg.c to distribution tarballs.
* tests/runtest: Add XAPIAN_TESTSUITE_LD_PRELOAD hook to allow libeatmydata to
easily be used to speed up testsuite runs.
matcher:
* The matcher wasn't recalculating the max possible weight after a subquery of
XOR reached its end. This caused an assertion failure in debug builds, and
is a missed optimisation opportunity.
* Implement SelectPostList::check() so that check() on OP_NEAR and OP_PHRASE
subqueries will just check a single document, not a potentially huge numbers
of documents.
* BM25Weight: Fix calculation order to avoid inconsistent weights due to
rounding when certain non-default parameter combinations are used.
* TradWeight: Fix calculation order to avoid inconsistent weights due to
rounding with TradWeight(0).
* Fix regression in speed of OP_OR queries in certain cases due to optimisation
added in 1.0.21/1.2.1.
* In the query optimiser, use value range bounds to detect value ranges which
must be empty.
remote backend:
* Add support for iterating metadata keys with the remote backend. This change
necessitated an increase in the minor version of the remote protocol. If you
are upgrading a live system which uses the remote backend, upgrade the
servers before the clients.
build system:
* xapian-config: Add --static option which makes other options report values
for static linking.
* xapian-config is now removed by "make distclean" not "make clean".
* configure: FreeBSD and OpenBSD don't need explicit dependency libraries, so
set link_all_deplibs_CXX=no there.
* This release uses autoconf 2.67 rather than 2.65.
documentation:
* INSTALL: Raise recommended GCC version from 3.3 to 4.1, since that's the
oldest we regularly test with.
* replication.html: Update and improve in various ways.
* Remove lingering "experimental" marker from PostingSource and
ValueCountMatchSpy API documentation.
* index.html: Add links to replication and facets documents, and fix typo in
serialisation document link.
* internals.html: Add link to replication protocol.
* Change the categorisation document to talk about facets, since that's the
terminology that seems to be most widely used these days, and
"categorisation" can also mean automatically assigning categories to
documents. Also update to reflect the final API.
* deprecation.html: Add guidelines for supporting other software.
* Document cases where QueryParser's FLAG_WILDCARD and FLAG_PARTIAL aren't
currently supported.
* PLATFORMS: Move PLATFORMS information to the wiki and replace with a pointer.
tools:
* xapian-compact: Fix access to empty priority_queue while merging synonyms.
This could have caused problems, though we've had no reports of any (the
bug was found with _GLIBCXX_DEBUG).
* xapian-compact: Add --quiet/-q option to suppress progress output.
(ticket#437)
* xapian-replicate: If a full copy was attempted, but was not put live, display
an explanatory message (in verbose mode).
examples:
* examples/quest: Add command line options to allow prefixes to be specified
for the QueryParser.
* examples/delve: Add '-z' option to count zero-length documents.
* examples/simplesearch: Fix cut-and-paste errors in usage message and
--version output.
portability:
* configure: Add support for --enable-sse=sse and --enable-sse=sse2 to allow
control of which SSE instructions to use.
* configure: Enable use of SSE maths on x86 by default with Sun's compiler.
* configure: Beef up the test for whether -lm is required and add a special
case to force it to be for Sun's C++ compiler - there's some interaction with
libtool and/or shared objects which means that the previous configure test
didn't think -lm is needed here when it is.
* Fix to build on OpenBSD 4.5 with GCC 3.3.5.
* Need to avoid excess precision on m68k when targeting models 68010, 68020,
68030 as well as 68000.
* Fix compilation with Sun's C++ compiler.
* Fix testsuite to build on Solaris < 10.
Xapian-core 1.2.3 (2010-08-24):
API:
* Database::get_spelling_suggestion() will now suggest a correction even if the
passed word is in the dictionary, provided the correction has at least the
same frequency. Partly addresses #225.
* QueryParser:
+ Fix handling of groups of terms which are all stopwords - in situations
where this causes a problem we now disable stopword checks for such groups.
(ticket#245)
+ Fix to be smarter about handling a boolean filter term containing ".." in
the presence of valuerangeprocessors.
testsuite:
* New "unittest" program for testing low level functions directly. Currently
this has tests for the internal resolve_relative_path() function.
(ticket#243)
remote backend:
* Retry select() if it fails with EINTR while waiting for connect(), and
discriminate cases with same failure message to aid debugging.
documentation:
* Fix documentation comment for Xapian::timeout type - it holds a time interval
in milliseconds not microseconds (the API docs for the methods which use it
explicitly correctly document that the timeouts are in milliseconds).
* libuuid moved from e2fsprogs to util-linux-ng about a year ago, so update
documentation, comments, and configure error messages to reflect this.
portability:
* configure: Don't pass -mtune=generic unless GCC >= 4.2 is in use
(ticket#492).
* Fix handling of some obscure cases of resolving relative paths on Microsoft
Windows. (ticket#243).
* Optimise closing of all unwanted file descriptors after forking by using
closefrom() if available, and otherwise providing our own implementation
(optimised to some extent for many platforms).
* Fix test harness to build under Microsoft Windows (ticket#495).
packaging:
* xapian-core.spec: Add xapian-metadata and cmake related files to RPM
packaging.
* xapian-core.spec: Update BuildRequires to specify libuuid-devel instead of
e2fsprogs-devel.
debug code:
* Improve logging of function parameter placeholder strings.
Xapian-core 1.2.2 (2010-06-27):
brass backend:
* Sync changes from each Btree table to disk right after syncing changes to
its base file, which allows more time for the table changes to be written
and may also be more efficient with some Linux kernel versions.
chert backend:
* Sync changes from each Btree table to disk right after syncing changes to
its base file, which allows more time for the table changes to be written
and may also be more efficient with some Linux kernel versions.
tools:
* xapian-check: Don't try to check document lengths are consistent between the
postlist and termlist tables if it would use more than 1GB of memory, and
handle std::bad_alloc or std::length_error when trying to allocate space
for this. This issue affected sup users, as sup allocates docids such that
they are sparse and large docids can easily occur.
examples:
* delve: Show the database's UUID.
portability:
* Revert 1.2.1 change to visibility of Xapian::Weight's copy constructor as
it making it private broke compilation with GCC 4.1 (which seems to be a
bug in this compiler version).
* tests/harness/testsuite.cc: Need <cstdio> for sprintf(). Fixes compilation
error which was masked if valgrind was installed. (ticket#489)
packaging:
* xapian-core.spec: Update for 1.2.x - add e2fsprogs-devel to BuildRequires and
add new files to install.
Xapian-core 1.2.1 (2010-06-22):
This release includes all changes from 1.0.21 which are relevant.
API:
* QueryParser: Add support for open-ended ranges (ticket#480).
* Add new optional parameter to QueryParser::add_boolean_prefix() to allow the
user to indicate a prefix isn't "exclusive" and that multiple instances
should be combined with OP_AND rather than OP_OR. Fixes ticket#402. This
change should also improve efficiency as it avoids copying the lists of
prefixes and compares them more efficiently.
* You can now specify a custom stemming algorithm by subclassing
Xapian::StemImplementation, mostly based on patch from Evgeny Sizikov in
ticket#448.
* Fix replication bug: when multiple commits were made to the master database
while a client was performing a full copy, the client would only apply the
first changeset and then try to make the database live, but fail due to
trying to set the wrong revision number.
* Replication no longer sleeps between applying changesets to an offline
database. It's only necessary to sleep for a live database (to allow readers
to complete a search without getting DatabaseModifiedErrror.
* xapian-replicate: Add new "-r" command line option to specify how long
replication sleeps for between applying changesets to a live database.
* If a Btree table doesn't exist when applying a replication changeset, create
it. This fixes replicating a revision where a lazy table is created.
(ticket#468)
testsuite:
* zlib can produce "uninitialised" output from "initialised" input - the
output does decode to the input, so this is presumably just some unused bits
in the output, so we use an LD_PRELOAD hack to get valgrind to check the
input is initialised and then tell it that the output is initialised.
* Don't pass NULL to closedir(), which fixes test harness failures on platforms
without /proc/self/fd.
* Use safesyswait.h, fixing build failure on "make check" on FreeBSD.
* Check is SA_SIGINFO is defined before using it as it isn't available
everywhere. Fixes testsuite build failure on GNU Hurd.
* Add a "soaktest" testsuite, intended to contain long-running tests with
random data. Currently contains a single test which builds and runs random
queries, checking that the results returned are consistent when asking for
different result ranges.
* Test UUID returned by Database::get_uuid() is 36 characters long.
matcher:
* Xapian no longer forces the wdf_max value to be at least one in
BM25Weight::get_maxpart(). We used to do this so that a non-existent term in
the query would cause it not to achieve 100%, but now we calculate
percentages based on the number of matching subqueries, and it is more
natural for a non-existent term to get zero weight (ditto for a term which
always has wdf 0).
* OP_VALUE_RANGE and OP_VALUE_GE now use value streams directly which is much
more efficient for chert (the default backend in 2.2.x). As an example, a
range query testcase which previously took 29 seconds now takes 0.4 seconds
(70 times faster). (ticket#432)
* The term statistics from multiple databases are now gathered in a simpler
way which is a bit faster and uses less memory.
build system:
* Install headers under PREFIX/include not PREFIX/include/xapian. If you used
XO_LIB_XAPIAN or xapian-config in your build system, the headers would still
have been found.
* Releases and snapshots are now generated with libtool 2.2.10 instead of
2.2.6.
* Fix build failures with some combinations of backends disabled (partially
addresses ticket#361 - some combinations still fail).
* Add check to configure that GCC actually supports visibility for the platform
being built for, which fixes compiler warnings with platforms which don't
(such as Mac OS X and mingw).
documentation:
* Update documentation - replication and PostingSource aren't experimental in
1.2.x.
portability:
* Make use of built-in UUID API on FreeBSD and NetBSD. (ticket#470)
* Fix mingw build.
debug code:
* Add new pretty printer for values reported by calls and returns in debug
logging - in particular, strings are now reported with non-printable
characters escaped.
* Debug logging should have less runtime overhead when built in but not in use.
* Drop support for --enable-log=profile - dedicated profiling tools are likely
to return more useful results.
Xapian-core 1.2.0 (2010-04-28):
This release includes all changes from 1.0.20 which are relevant.
testsuite:
* Fix --abort-on-error to actually work.
* Exit with status 1 not 0 if we caught an exception from the harness itself.
Xapian-core 1.1.5 (2010-04-16):
This release includes all changes from 1.0.19 which are relevant.
API:
* Database replication now handles an exception while applying a changeset
better.
* If environment variable XAPIAN_MAX_CHANGESETS is set on a replication client
then any changesets read are saved so the replicated copy can itself be
replicated.
testsuite:
* Use sigsetjmp() and siglongjmp() where available so that the set of blocked
signals get restored and the test harness can catch a second incidence of a
particular signal in a run. Use sigaction() instead of signal() where
available, which allows us to report the address associated with SIGSEGV,
SIGFPE, SIGILL, and SIGBUS.
* Add machinery to check for leaked file descriptors. Currently this requires
/proc/self/fd to work (which is present on Linux and some other platforms).
Remove the crude ulimit in runtest which has caused problems on some Debian
buildds.
* The test harness now explicitly catches const char * exceptions and reports
their contents.
brass backend:
* Ensure that the wdf upper bound is correctly updated when replacing
documents.
* xapian-compact: Now sets lastdocid correctly when using --no-renumber.
chert backend:
* Ensure that the wdf upper bound is correctly updated when replacing
documents.
* xapian-compact: Now sets lastdocid correctly when using --no-renumber.
* xapian-check: Check that the initial doclen chunk exists.
flint backend:
* xapian-compact: Now sets lastdocid correctly when using --no-renumber.
remote backend:
* Add remote backend support for WritableDatabase::add_spelling() and
WritableDatabase::remove_spelling(). This bumps the remote protocol to
version 35.0 (so both client and servers will need updating). Suggesting
spelling corrections isn't yet supported. (ticket#178)
build system:
* XO_LIB_XAPIAN: Give a more specific error message for the cases where
XAPIAN_CONFIG isn't found, is a directory, or isn't executable.
examples:
* delve:
+ If any documents are specified with "-d<docid>", "-V<slot>" now only show
values for those documents.
+ Remove undocumented -k option, which has been a compatibility alias for -V
since 0.9.10. Just use -V instead.
* xapian-metadata: Add new example program which allows you to get and set
individual user metadata entries.
Xapian-core 1.1.4 (2010-02-15):
This release includes all changes from 1.0.18 which are relevant.
API:
* Xapian::TermGenerator,Xapian::QueryParser,Xapian::Unicode::is_wordchar():
Add ENCLOSING_MARK and COMBINING_SPACING_MARK categories to is_wordchar(),
which is used by TermGenerator and QueryParser. Also make TermGenerator and
QueryParser ignore several zero-width space characters. This is a better
but less compatible version of a fix in 1.0.18.
* Implement support for iterating valuestreams for multidatabases.
* Xapian::Stem: Update the german and german2 stemming algorithms to the latest
versions from Snowball. These add an extra rule for the "-nisse" ending.
* Xapian::ValueCountMatchSpy: Replace get_values() with values_begin() and
values_end().
* Xapian::MatchSpy: Provide an iterator for accessing the top values found
instead of taking a vector by reference to return them in.
* Xapian::NumericRanges: Remove experimental API we aren't happy with yet.
* Xapian::DatabaseReplica, Xapian::DatabaseMaster: Remove experimental
API we aren't happy with. Replication is still supported via the
command line programs. (ticket#347)
* Xapian::score_evenness(): Remove as it turns out not to be useful in practice.
(ticket#435)
* Xapian::ValueWeightPostingSource: A ValueWeightPostingSource with no entries
would report -infinity as its upper bound, which could cause no results to be
incorrectly returned for some queries involving such an object.
* Xapian::WritableDatabase::close() fixed to commit() changes (unless a
transaction is in progress).
testsuite:
* apitest: Improve test coverage in various places.
matcher:
* Uses of values during the match (sorting by value or Sorter, MatchSpy,
MatchDecider, and collapsing) now use value stream iteration which is
a lot more efficient for chert and brass (but may be slower for flint).
brass backend:
* New development backend. Changes over chert:
+ Batched posting list changes during indexing use significantly less memory.
+ Instead of using complex code to iterate modified posting lists and
documents length lists, brass can flush individual such lists to disk
and then iterates them from there.
+ To iterate all terms, chert flushes all pending postlist changes. In the
case where a prefix is specified, brass only flushes postlist changes for
terms starting with the specified prefix, and doesn't flush document length
changes.
chert backend:
* Promote chert to being the stable backend.
* Change the packing of integers and strings into sortable keys, which reduces
database size by 2.5% in tests. This means an incompatible change in the
chert format. You can use the new xapian-chert-update utility to update a
chert database from the old format to the new format. It works much like
xapian-compact so should take a similar amount of time (and results in a
compact database).
* xapian-compact:
+ Prune unused docids off the end of each database when merging multiple
databases with renumbering.
+ Extend --no-renumber to support merging databases, but only if they have
disjoint ranges of used document ids.
+ Ensure that the resultant database has a fresh UUID (previously chert
copied the UUID from the first input).
* xapian-check:
+ Fix checking of the METAINFO key in chert. For small databases, the
statistics fit in few enough bytes that incorrect check appeared to
succeed and no errors were reported, but for larger databases an
error was incorrectly reported.
+ Rework the checking of postlist chunks to use a cleaner approach which
should report errors better.
+ Use a type wider than 32 bits to keep count of items in a table.
Previously xapian-check would report the number of entries modulo
4294967296.
* When iterating a value stream, skip_to() now only assigns the value to a
std::string when it reaches its target. This saves a lot of unnecessary
string copying - in a real-world test it improved the time for 100 queries
from 3.66s to 3.10s.
* When skipping through a chunk of postings to find the one we want, don't
bother to unpack the wdf values we're skipping over. This should save a
significant amount of time in certain cases where the profile data shows
about a third of the time is spent in the function where this happens.
* Report locking failure due to running out of file descriptors better.
flint backend:
* xapian-compact:
+ Prune unused docids off the end of each database when merging multiple
databases with renumbering.
+ Ensure that the resultant database has a fresh UUID (previously flint
didn't set a UUID so one would be generated on demand when next requested,
but only if the database was writable).
* Report locking failure due to running out of file descriptors better.
remote backend:
* Add support for WritableDatabase::set_metadata() and Database::get_metadata()
to the remote backend (based largely on patch in #178).
inmemory backend:
* Read the document data and values lazily for the inmemory backend like we do
for other backends. They're much less costly to fetch than if a disk or
network access is involved, but it avoids copying potentially large data
which may not be needed. Consistency here also makes things easier to
understand for both users and developers.
build system:
* This release uses autoconf 2.65 rather than 2.64.
documentation:
* docs/replication.html: Add note about not using reopen() with databases being
updated by the replication client.
* docs/admin_notes.html: Update for chert and other recent changes.
* Remove out-of-date reference in the API documentation comment to an
add_slot() method. This no longer exists - you need to use multiple
ValueCountMatchSpy objects to monitor more than one slot.
examples:
* simpleexpand,simpleindex,simplesearch: Handle --help and --version.
debug code:
* The debug log now reports boolean values as "true" and "false" (instead of
"1" and "0").
Xapian-core 1.1.3 (2009-09-18):
This release includes all changes from 1.0.15-1.0.17 which are relevant.
API:
* Update Unicode character database to Unicode 5.2. (ticket#351)
* Rename Xapian::Sorter to Xapian::KeyMaker, paving the way for using it to
build collapse keys too. Xapian::Sorter remains for compatibility (and is
now a subclass of Xapian::KeyMaker) but is deprecated.
* Resolve the inconsistency in MultiValueSorter::add()'s "forward" parameter
versus the "reverse" parameters which the Enquire sorting functions now take
by replacing the class with MultiKeyMaker with a renamed method add_value()
with a "reverse" parameter. MultiValueSorter remains with the old semantics
for compatibility but is deprecated. (ticket#359)
* QueryParser: Don't apply spelling correction to wildcarded terms, or to terms
at the end of the query which we expand under FLAG_PARTIAL.
* Add new Error subclass SerialisationError which we throw for serialisation
related errors (which previously mostly threw NetworkError.
* Rename Xapian::SerialisationContext to Xapian::Registry.
* Add DecreasingValueWeightPostingSource class, which reads weights from a
value slot in which a significant range of the values are in decreasing
order. This functions similarly to ValueWeightPostingSource, but can be much
more efficient.
* Add new Xapian::MatchSpy class:
+ This replaces the use of Xapian::MatchDecider as a "matchspy", which is now
deprecated. The new class only inspects, and can't reject. It can work
with remote databases, with the results being serialised to return them
across the link.
+ Add subclass ValueCountMatchSpy, which counts the occurrences of each value
in a slot in the search results seen (useful for faceted or categorisation
systems). The results can be grouped into ranges using the NumericRange
and NumericRanges classes, and the score_evenness() function. This API is
currently experimental.
* Remove default implementation of Weight::clone() which returns NULL. We
always need clone() to be implemented because it's called for every term
in the query, not just used for the remote backend.
chert backend:
* Rewrite the low level packing and unpacking functions more efficiently. As
well as being generally faster, the pack functions now take a reference to a
string to append to, which avoids creating a lot of temporary string objects.
Indexing HTML files with omindex is 5-10% faster. Searching for "The" on
gmane (which results in a lot of unpacking of postings and document lengths)
is about 35% faster. (ticket#326)
* xapian-compact: Don't report an absent lazy input table as 0 size.
* Fix ChertModifiedPostList to skip added-but-then-deleted-before-flush
documents. (ticket#392)
* Fix WritableDatabase::get_doclength() to work properly after a call to commit
for the chert backend (ticket#397).
* Fix to work with the metainfo key stored in the latest format of chert
databases.
* Avoid doing pointless work by trying to delete non-existent lists of values
when we're just adding documents.
* Fix code to find the first docid in the next chunk (ticket#399).
* Add support for chert databases without a termlist table (ticket#181).
Currently the only way to create such a database is to create a chert
database and do "rm termlist.*".
flint backend:
* xapian-compact: Don't report an absent lazy input table as 0 size.
remote backend:
* Remote protocol major version has changed to support serialising MatchSpy
objects.
* Fixed not to sometimes read off the end of the returned matches when
searching multiple databases, some of which are remote, and when the primary
ordering is by relevance.
build system:
* This release uses autoconf 2.64 rather than 2.63. This means configure now
makes use of shell functions, which makes it ~13% smaller, and should also
make it execute faster.
* configure: Send stderr output from ldconfig to config.log.
* Add optional third parameter to XO_LIB_XAPIAN autoconf macro which specifies
the basename for the "xapian-config" script (defaults to "xapian-config" to
give the current behaviour).
* This release uses doxygen 1.5.9 to generate the API documentation.
documentation:
* Minor improvements to the formatting of the collated API documentation.
portability:
* Fix code to compile with Sun's C++ compiler.
* Fix our uuid_unparse_lower() replacement for older libuuid to actually
compile (really fixes ticket#368).
* Fix xapian-config to work with Solaris 10 /bin/sh. (ticket#405)
debug code:
* Use C++ syntax for NULL with a type in log output.
Xapian-core 1.1.2 (2009-07-23):
This release includes all changes from 1.0.14 which are relevant.
API:
* Move support for a prefix/suffix from NumberValueRangeProcessor to
StringValueRangeProcessor, and change NumberValueRangeProcessor and
DateValueRangeProcessor to inherit from StringValueRangeProcessor so all
three now support a prefix/suffix. (ticket#220)
* Query: Trim 4 bytes off the internals. (ticket#280)
* QueryParser: If default_op is OP_NEAR or OP_PHRASE then make the window size
(9 + no_of_terms) to match the default for an explicit NEAR or PHRASE.
(ticket#254)
testsuite:
* Sort out the clash between two different patches to fix leaking file
descriptors when running tests with the remotetcp backend (broken by
changes in 1.1.1).
matcher:
* If the highest weighted document doesn't match all the terms in the query,
its percentage weight is now calculated by simply counting how many weighted
leaf subqueries match it instead of scaling by the proportion of the weight
which matches (which required accessing the termlist for that document).
(ticket#363).
* XOR with a SYNONYM subquery could previously achieve 100% - this has been
fixed.
flint backend:
* Backport the lazy update changes from chert to flint:
WritableDatabase::replace_document() now updates the database lazily in
simple cases - for example, if you just change a document's values and
replace it with the same docid, then the terms and document data aren't
needlessly rewritten. Caveats: currently we only check if you've looked at
the values/terms/data, not if they've actually been modified, and only keep
track of the last document read.
build system:
* Update to always use C++ forms for ISO C standard headers (ticket#330).
* Fix several places where Xapian::doccount is used instead of
Xapian::termcount, and similar issues. It's still not possible to make
these types different sizes, but we're now closer to this goal.
(ticket#385).
documentation:
* Note that PostingSource and Weight objects returned by clone() and
unserialise() methods will be deallocated with "delete".
debug code:
* Fix debug logging not to segfault on NULL Query::Internal pointers.
Xapian-core 1.1.1 (2009-06-09):
This release includes all changes from 1.0.13 which are relevant.
API:
* New Query::OP_SYNONYM operator, which matches the same documents as OP_OR,
but attempts to weight as if the all the subqueries were a single term with
their combined wdf, which should give better relevance weights.
* QueryParser's synonym, wildcard, and partial query features now use
the new OP_SYNONYM operator.
* PostingSource: Add new set_maxweight() method to allow subclasses to tell
the matcher that their maximum weight has decreased. Make get_maxweight()
a non-virtual method of the baseclass which returns the last set maxweight
(which will require updates to most user subclasses. (ticket#340)
* DatabaseReplica: Fix SEGV when calling get_description() on a default
constructed DatabaseReplica.
* Make Query::MatchAll and Query::MatchNothing const since they're immutable.
All the public methods of Query are const, so this should be completely API
compatible.
* Methods returning an end iterator for a ValueIterator now actually return a
proxy object which silently converts to ValueIterator if required. This
proxy object allows a comparison with an "_end()" method to be optimised
better so that it just ends up comparing the internal member of the iterator
class with NULL (previously a call to ValueIterator's destructor remained).
This should be API compatible, but note that it is definitely now more
efficient just to compare against the return value of the relevant _end()
method than to store the end iterator explicitly.
testsuite:
* Testcase valuestats4 requires transactions, so indicate that and remove the
explicit SKIP for inmemory.
* Testcase changemaxweightsource1 uses ChangeMaxweightPostingSource, which
doesn't work with multi or remote, so mark the test accordingly.
* We've decided that "going back" with skip_to() or check() should have
unspecified behaviour, so stop testing how this case behaves!
matcher:
* Subclass MultiPostList directly from PostList instead of from LeafPostList.
This gets rid of two unused data members per MultiPostList in exchange for
having to define 5 extra "never called" methods, but 4 of these just
tailcall.
* Store termfreqs and reltermfreqs for query terms in a single map rather than
one map for each, which saves is more compact and likely to be faster.
chert backend:
* xapian-check: For chert, check value stats are the correct format and that
the streamed values are consistent with their stats (ticket#277).
* xapian-check: Chert doesn't store termlist entries for documents without
terms, which resulted in us reporting an error when we found document ids in
the doclength "postlist" which were greater than any with an entry in the
termlist. Instead compare these entries against db.get_last_docid() if we
are checking a whole db and the db can be opened. If not, suppress this
check.
remote backend:
* When serialising stats, serialise the termfreq and reltermfreq together,
rather than in separate lists. This gives a smaller serialised form, and
matches these both being stored in the same map now. This is an incompatible
remote protocol change, so bump the major version to 32. (ticket#362)
build system:
* Some build failures with --disable-backend-XXX options have been fixed, but
we haven't exhaustively tested all combinations.
* Ship common/win32_uuid.cc and common/win32_uuid.h (ticket#367).
documentation:
* Update PostingSource documentation to describe how init() is called again if
a PostingSource is reused. Fixes #352.
portability:
* Fixed to build with GCC 4.4.
* Drop support for GCC 2.95.3 and 3.0.x - we now require at least 3.1 as doing
so eliminates some preprocessor conditionals which we aren't able to test
regularly as we don't have easy access to such old GCC versions. GCC 3.1 is
nearly 7 years old now, and GCC3 didn't get widespread use until later
versions anyway. If you still need to use GCC < 3.1, Xapian 1.0.x should
build with 2.95.3 or newer.
* Older versions of libuuid don't have uuid_unparse_lower() so probe for it in
configure, and if it isn't present provide an inline version in safeuuid.h
(ticket#368).
* Fixed to build with MSVC (ticket#379).
* Add static_cast<char>() to str(bool) overload to suppress bogus MSVC warning
(ticket#377).
debug code:
* common/debuglog.h: Add missing initialisation of uncaught_exception variable
in a couple of places.
Xapian-core 1.1.0 (2009-04-22):
API:
* All deprecated xapian-core features listed for removal in 1.1.0 have been
removed. See deprecation.html for details, and suggested updates.
* The Unicode character categorisation functions have been updated from
Unicode 5.0 to 5.1.
* Add NON_SPACING_MARK to is_wordchar() for better tokenisation of languages
which use such marks - for example, Arabic. This is better than the stop-gap
fix in 1.0 of treating NON_SPACING_MARK as a phrase-generator character
when parsing queries, but it does mean that databases built from data
containing such characters will need to be rebuilt. (ticket#355)
* The details of how to subclass Xapian::Weight to implement your own
weighting scheme have changed incompatibly to allow user weighting schemes
to have access to the same statistics as built-in schemes (ticket#213)
If you have a existing subclass of Xapian::Weight you'll need to update it.
* New Database methods get_doclength_upper_bound(), get_doclength_lower_bound()
and get_wdf_upper_bound(), primarily intended for allowing weighting schemes
to calculate tighter upper bounds on weights (which BM25Weight and TradWeight
now do) which allows matcher weight-based optimisations to be more effective.
Chert actually tracks doclength bounds and a global (rather than per term)
upper bound on wdf; other backends return much less tight bounds, but these
still lead to better upper bounds on weights.
* Enquire::get_eset() now uses an unmodified of probabilistic formula, and
doesn't return terms which would get a negative weight from it (since that
means they are expected to be harmful not helpful).
* Add Database::close() method, which will release system resources (in
particular, close filehandles) held by a database. This is particularly
useful when wrapping the API for languages with garbage collection.
* Change Database::positionlist_begin() not to throw exceptions if the term or
document doesn't exist.
* Xapian databases now have a UUID, readable with Database::get_uuid().
* A new Database replication API has been added (currently experimental).
* MSet::get_termfreq() will now fall back to looking up the term frequency in
the database rather than raising an exception if a term wasn't present in
the query.
* Calling RSet:add_document() with argument 0 now throws InvalidArgumentError.
* QueryParser sped up (new version of lemon); queryparsertest runs 2.2% faster.
* Add ValueSetMatchDecider, which is a matchdecider which is intended to be
passed a set of values to look for in documents, and selects documents based
on the presence of those values.
* Add new Xapian::PostingSource class to allow passing custom sources of
postings and weights to the matcher. Built-in PostingSource subclasses:
FixedWeightPostingSource, ValueMapPostingSource, ValuePostingSource, and
ValueWeightPostingSource. (Currently experimental).
* Database: Add get_value_freq(), get_value_lower_bound() and
get_value_upper_bound() methods to get statistics about the values stored in
a slot. Add support for the value statistics methods to chert, inmemory,
multi and remote databases.
* Enquire::get_eset() now faster for large ESet size.
* Xapian::Document objects now have a reduced memory footprint.
* Enquire::set_collapse_key() now allows you to specify a maximum number of
matches with each collapse key to keep (which defaults to 1, giving the
previous behaviour). Enquire can now report bounds and an estimate of what
the total number of matches would have been if collapsing wasn't in use.
* WritableDatabase::commit() is a new, preferred alias for
WritableDatabase::flush(). (ticket#266)
* Add methods for serialising documents and queries to strings, and
unserialising back from strings. (ticket#206)
testsuite:
* stemtest: No longer checks environment variables OM_STEMTEST_SKIP_RANDOM,
OM_STEMTEST_LANGUAGES, and OM_STEMTEST_SEED.
* perftest: New performance testsuite. This is intended to contain intended to
contain potentially time-consuming performance tests, which log output to
an XML file for later analysis. It's not run by "make check" - use "make
check-perf" to run it.
* apitest: Now runs tests over both flint and chert for multi, remotetcp, and
remoteprog.
* Wait for subprocesses to finish at end of tests with remotetcp backend, to
avoid test failures when the same database is used for the next testcase.
matcher:
* Internally, pass around non-normalised document lengths as Xapian::termcount
(unsigned integer) not Xapian::doclength (double). This gives a 3% speedup
for 10 term OR queries!
chert backend:
* New development backend. Use Chert::open() to explicitly create a chert
format database, or set XAPIAN_PREFER_CHERT=1 in the environment to
prefer chert when creating a new database without an explicit type.
* Quartz and Flint stored the document length alongside every posting list
entry. Chert instead stores a chunked list of all the document lengths
which saves a lot of space, and is a big win for large queries or those
which don't need the document lengths. This structure is used to
implement much faster iteration (six times faster in a test) over all
document ids (which speeds up queries using unary NOT, e.g. `NOT apples'),
and to test for the existence of documents (instead of checking the record
table for an entry).
* Document values are now stored in a chunked stream for each slot for
efficient access to the same slot in lots of documents. This makes
operations like sort by value much more efficient.
* WritableDatabase::replace_document() now updates the database lazily in
simple cases - for example, if you just change a document's values and
replace it with the same docid, then the terms and document data aren't
needlessly rewritten. Caveats: currently we only check if you've looked at
the values/terms/data, not if they've actually been modified, and only keep
track of the last document read.
flint backend:
* If we can't obtain a write lock while trying to create a new database
we now report the lock failure with DatabaseLockError, not
DatabaseOpeningError - it's more useful to know that the lock attempt failed
in this situation.
* Improve reporting of failures to obtain lock due to unexpected errors.
* xapian-check: Don't stop checking a table after an error in certain cases -
instead increment the error counter and try to continue checking from the
next item.
remote backend:
* The remote database protocol major version has been increased, allowing
a significant amount of compatibility code to be removed. This change means
that new clients won't work with old servers, and old clients won't work
with new servers. If upgrading a live system, you will need to take this
into account.
* The remote servers now always default to opening a Database and the client
has to send a protocol message to explicitly request write access. This
allows a single server to support multiple readers and one writer
simultaneously. (ticket#145)
* Database::get_document() no longer does an unnecessary copy of the document's
values.
* Change serialisation of queries to be more compact and easier to parse.
stub databases:
* Stub databases used to assume that any relative paths were relative to the
current working directory. They now assume that relative paths are
relative to the directory holding the stub database file.
* Stub database lines which begin with a '#' character are now ignored,
allowing comments in stub database files.
* New "stub directory" database type - this is a directory containing a stub
database file named "XAPIANDB".
* Don't just ignore lines with no spaces in a stub database file.
* Bad lines in a stub file were being ignored after we'd seen a good entry.
* Add new Auto::open_stub() overload which opens a stub database file
containing a single entry as a WritableDatabase.
* Add support for "inmemory" to stub database (which is useful now that stub
databases can be opened for writing).
* A stub database file is now allowed to contain no database entries, which
results in an empty Database object (this avoids user code having to special
case to handle "0 or more" databases).
build system:
* To allow installations of Xapian 1.0 and 1.1 to easily coexist, the library
is now libxapian-1.1; xapian.m4 is now xapian-1.1.m4; headers are now
installed in $prefix/include/xapian-1.1. If you use XO_LIB_XAPIAN or
xapian-config as we recommend, this should all be transparent. Also
programs and scripts have a default program suffix to -1.1 unless overridden
using the --program-suffix argument to configure (if you really want no
suffix, "./configure --program-suffix=" will achieve this).
* On Linux and k*bsd-gnu, override libtool's link_all_deplibs_CXX to "no".
* On Linux, override libtool's sys_lib_dlsearch_path_spec to a list generated
in a more reliable way which includes all the default directories.
* configure: --enable-debug and --enable-debug-verbose have been deprecated
since 1.0.0, so remove specific errors pointing to the replacements.
documentation:
* Disable "JAVADOC_AUTOBRIEF" in doxygen configuration since we always try to
write a brief description explicitly, and JAVADOC_AUTOBRIEF causes problems
in some cases.
* docs/deprecation.html: Describe what "experimental" features are, and why
replication and posting sources are currently experimental.
* docs/deprecation.html: Deprecate Stem_get_available_languages() from the
python bindings.
examples:
* Use C++ forms of C headers in examples (ticket#330).
packaging:
* xapian-core.spec: We no longer need to run autoreconf to work around
libtool's incomplete sys_lib_dlsearch_path_spec or to pick up distro-specific
patches for link_all_deplibs.
debug code:
* Report get_description() rather than the pointer value for
Xapian::Query::Internal* parameters to internal functions.
* The debug logging framework has been overhauled. See HACKING for details
of how it now works.
* Faster integer to string functions inside the library (this is a general
improvement, but will particularly speed up debug logging as that converts a
lot of integers to strings).
Xapian-core 1.0.23 (2011-01-14):
API:
* QueryParser: Avoid a double free if Query construction throws an exception
in a particular case. Fixes ticket#515.
* QueryParser: Handle NEAR/<offset> and ADJ/<offset> where offset isn't an
integer the same way at the end of the query as in the middle.
* Enquire::get_mset(): Avoid pointlessly trying to allocate lots of memory
if the first document requested is larger than the size of the database.
* Enquire::get_mset(): An empty query now returns an MSet with firstitem set
correctly - previously firstitem was always 0 in this case.
matcher:
* The matcher wasn't recalculating the max possible weight after a subquery of
XOR reached its end. This caused an assertion failure in debug builds, and
is a missed optimisation opportunity.
tools:
* xapian-compact: Fix access to empty priority_queue while merging synonyms.
This could have caused problems, though we've had no reports of any (the
bug was found with _GLIBCXX_DEBUG).
Xapian-core 1.0.22 (2010-10-03):
API:
* Xapian::Document: Initialise docid to 0 when creating a document from
scratch, as documented.
* Xapian::QueryParser: Allow phrase generators between a probabilistic prefix
and the term itself (e.g. path:/usr/local).
matcher:
* Back out the OP_OR efficiency improvement made in 1.0.21 since this change
slows down some other common cases. We'll address this fully in 1.2.4, but
that fix is more invasive than we are comfortable with for 1.0.x at this
point.
build system:
* xapian-config: Add --static option which makes other options report values
for static linking.
documentation:
* deprecation.html: Add guidelines for supporting other software.
* Document cases where QueryParser's FLAG_WILDCARD and FLAG_PARTIAL aren't
currently supported.
* Fix documentation for Xapian::timeout type - it holds a time interval in
milliseconds not microseconds (the API docs for the methods which use it
explicitly correctly document that the timeouts are in milliseconds).
portability:
* configure: Don't pass -mtune=generic unless GCC >= 4.2 is in use
(ticket#492).
* configure: Add support for --enable-sse=sse and --enable-sse=sse2 to allow
control of which SSE instructions to use.
* configure: Enable use of SSE maths on x86 by default with Sun's compiler.
* configure: Beef up the test for whether -lm is required and add a special
case to force it to be for Sun's C++ compiler - there's some interaction with
libtool and/or shared objects which means that the previous configure test
didn't think -lm is needed here when it is.
* Fix test harness to build under Microsoft Windows (ticket#495).
* Fix to build on OpenBSD 4.5 with GCC 3.3.5.
* Need to avoid excess precision on m68k when targeting models 68010, 68020,
68030 as well as 68000.
packaging:
* xapian-core.spec: Add cmake related files to RPM packaging.
Xapian-core 1.0.21 (2010-06-18):
API:
* Xapian::Stem now recognises "nb" and "nn" as additional codes for the
Norwegian stemmer.
* Xapian::QueryParser now correctly parses a wildcarded term in between two
other terms (ticket#484).
testsuite:
* Improve test coverage of OP_VALUE_RANGE and MSet::get_percent().
matcher:
* OP_OR could skip a matching document if it decayed to OP_AND or OP_AND_MAYBE
during the match in some cases. Fixes ticket#476.
* OP_XOR with non-leaf subqueries could skip matching documents in some cases,
and OP_XOR of three or more sub-queries could return incorrect weights.
Fixes ticket#475.
* OP_OR is now more efficient if a subquery is potentially expensive (e.g.
ValueRangePostList, OP_NEAR, OP_PHRASE). A 10-fold speed-up with
ValueRangePostList has been observed.
flint backend:
* When iterating a table, if the table changes underneath we could end up
returning the same entry twice. (Debian#579951)
* A cancelled transaction (or a failing operation implicitly cancelling
pending changes) now marks the tables as unmodified, which fixes an exception
trying to read block 0 if one of the tables is empty on disk.
quartz backend:
* When iterating a table, if the table changes underneath we could end up
returning the same entry twice. (Debian#579951)
remote backend:
* When daemonising, read the max fd to close with sysconf() instead of using
a hardcoded value of 256, and work even if stdin and stdout have been closed.
build system:
* Install files to make Xapian easier to use with cmake.
documentation:
* Update the list of languages that the Xapian::Stem constructor recognises.
* Assorted minor improvements to the collated API documentation.
portability:
* On x86 processors, Xapian now defaults to using SSE2 FP instructions. This
avoids issues with excess precision and it a bit faster too. If you need
to support processors without SSE2 (this means pre-Pentium4 for Intel) then
configure with --disable-sse. (ticket#387)
* Fix warning when compiling for mingw with GCC 4.2.1.
* Remove mutable from a couple of reference class members - mutable doesn't
make sense for a reference and some compilers warn about it.
Xapian-core 1.0.20 (2010-04-27):
API:
* MSet: Fix incorrect values reported by get_matches_estimated(),
get_matches_lower_bound(), and get_matches_upper_bound() in certain cases
when sorting and collapsing (ticket#464).
documentation:
* deprecation.html: Note how to disable deprecation warnings. (ticket#393)
examples:
* delve: Add -a option to list all terms in a database.
* delve: -d and -V command line options now report out of range and invalid
numbers.
portability:
* The getopt warning fix for Cygwin in 1.0.19 caused build failures on Mac OS X
(and probably some other platforms with non-GNU getopt implementations), so
replace with a fix which is only enabled for Cygwin. (ticket#469)
Xapian-core 1.0.19 (2010-04-15):
API:
* QueryParser: Fix leak if Xapian::Database throws an exception during parsing
(ticket#462).
testsuite:
* Explicitly flush after indexing for quartz and flint, so we see any
exceptions from the flush (the implicit flush from the destructor swallows
any exceptions).
* apitest: Add databasemodified1 testcase to provide some test coverage for
DatabaseModifiedError.
flint backend:
* When updating a document, rather than decoding the old positions, comparing
with the new, and then encoding the new if different, we now just encode the
new and then compare the encoded forms. (ticket#428)
* Avoid trying to delete the document positions when we know there aren't any.
* Fix memory leak if Database::allterms_begin() throws an exception
(ticket#462).
* xapian-check: Report document id for document length mismatch.
* Fix potential issues with iterators over a WritableDatabase which is modified
during iteration. No problems have actually been observed with flint, only
in 1.1.4 with chert in cases which don't occur in flint, but it seems likely
the issue can manifest for flint in other situations. Fixes ticket#455.
* Initialise zlib z_stream structure members zalloc, zfree, and opaque with
Z_NULL rather than 0 cast to the appropriate type, as that's what the zlib
documentation says to do. Add missing initialisation of opaque for the
inflate z_stream which the zlib docs say is needed (reading the zlib code,
this isn't true for current versions, so this improves robustness rather
than fixing an observable bug).
* Don't memcpy() a block to itself - it's a waste of effort, and (probably)
undefined behaviour (as a block overlaps itself).
quartz backend:
* Fix potential issues with iterators over a WritableDatabase which is modified
during iteration. No problems have actually been observed with quartz, only
in 1.1.4 with chert in cases which don't occur in quartz, but it seems likely
the issue can manifest for quartz in other situations. Fixes ticket#455.
* Don't memcpy() a block to itself - it's a waste of effort, and (probably)
undefined behaviour (as a block overlaps itself).
build system:
* Force -fno-strict-aliasing for GCC 4.2 to avoid bad code being generated due
to a bug in that compiler version. Fixes ticket#449. This issue hasn't been
observed to affect Xapian 1.0.x, but it seems prudent to backport the fix.
documentation:
* INSTALL: Correct description of --enable-assertions. It does NOT enable
debugging symbols, and shouldn't control checks on bad data passed to API
calls (if it does anywhere, that's a bug). Note that Xapian will run more
slowly with assertions on.
* spelling.html:
+ Add section on indexing.
+ Add a note about removing automatically added spelling dictionary entries.
+ Move the "algorithm" section to the end, as it is really just background
information for the curious.
* include/xapian/queryparser.h: Document the possible exception messages from
QueryParser::parse_query().
* include/xapian/termgenerator.h: Note how TermGenerator handles stopwords.
examples:
* delve: Display the lastdocid value when displaying general database
statistics.
* simpleindex: Explicitly call flush() on the database, as that is good
practice (since you see any exceptions).
portability:
* Fix compilation failure in testsuite on OpenBSD, introduced by new regression
test in 1.0.18. Fixes ticket#458.
* Fix getopt-related warning on Cygwin.
Xapian-core 1.0.18 (2009-02-14):
API:
* Document: Add new add_boolean_term() method, which is an alias for add_term()
with wdfinc=0.
* QueryParser:
+ Add support for quoting boolean terms so they can contain arbitrary
characters (partly addresses ticket#128).
+ Add ENCLOSING_MARK and COMBINING_SPACING_MARK categories, plus several
zero-width space characters, as phrase generators. This mirrors a better
fix in 1.1.4, but without losing compatibility with existing databases.
+ Fix handling of an explicit AND before a hated term (foo AND -bar).
(ticket#447)
* TermIterator: Only include trailing '+' or '#' on a term if it isn't followed
by a word character (makes more sense and matches QueryParser's behaviour).
(ticket#446)
* Database: Fix many methods to behave better on a database with no
subdatabases, such as is constructed by Database(). Fixes ticket#415.
testsuite:
* Add test coverage for xapian-compact, and improve coverage for
WritableDatabase::replace_document().
* apitest: Rename matchfunctor<n> to matchdecider<n> to match current
terminology.
flint backend:
* When updating documents, don't update posting entries which haven't changed.
Largely fixes ticket #250.
* If the number of entries in the position table happened to be 4294967296 or
an exact multiple, Xapian would ignore positional data for that table when
running queries, and xapian-compact wouldn't copy its contents.
* Iterating all the terms in the database with a prefix is now slightly more
efficient.
* Fix locking code to work if stdin and/or stdout have been closed.
* If a document is replaced with itself unmodified, we no longer increase the
automatic flush counter.
* When iterating a posting list modified since the last flush(), the reported
wdf is now correct (previously it was too high by its old value).
* Replacing a document deleted since the last flush failed to update the
collection frequency and wdf, and caused an assertion failure when assertions
were enabled.
* WritableDatabase::replace_document() didn't always remove old positional
data (the only effect is that the position table was bloated by unwanted
entries).
* xapian-inspect:
+ New "until" command which shows entries until a specified key is reached.
+ New "open" command which allows easy switching between tables.
* xapian-compact: Fix typos in --help output.
quartz backend:
* Replacing a document deleted since the last flush failed to update the
collection frequency and wdf, and caused an assertion failure when assertions
were enabled.
* WritableDatabase::replace_document() didn't always remove old positional
data (the only effect is that the position table was bloated by unwanted
entries).
remote backend:
* Throw UnimplementedError if a MatchDecider is used with the remote backend.
Previously Xapian returned incorrect results in this case.
build system:
* configure: With --enable-maintainer-mode, enable -Werror for GCC >= 4.1
rather than >= 4.0 as Apple's GCC 4.0 gives bogus uninitialised variable
warnings.
documentation:
* The API documentation now includes Xapian::Error and subclasses, and doesn't
mention Xapian::Query::Internal.
* Make clear in the Xapian::Document API documentation that this class is a
lazy handle and discuss the issues this can cause.
* INSTALL: Improve text about zlib dependency.
* HACKING: Add details of our licensing policy for accepting patches.
examples:
* quest: If no database is specified, still parse the query and report
Query::get_description() to provide an easy way to check how a query parses.
portability:
* Fix GCC 4.2 warning.
xapian-core 1.0.17 (2009-11-18):
API:
* QueryParser:
+ Fix handling of a group of two or more terms which are all stopwords which
notably caused issues when default_op was OP_AND, but could probably
manifest in other cases too. Fixes ticket#406.
+ Fix interaction of FLAG_PARTIAL and FLAG_SYNONYM. (ticket#407)
* Database: A database created via the default constructor no longer causes a
segfault when the methods get_metadata() or metadata_keys_begin() are called.
flint backend:
* Don't try to close the fd one more than the maximum allowable when locking
the database. Harmless, except it causes a warning when running under
valgrind. (ticket#408)
remote backend:
* Xapian::Sorter isn't supported with the remote backend so throw
UnimplementedError rather than giving incorrect results. (ticket#384)
* Fix potential reading off the end of the MSet which is returned internally
by the remote server.
documentation:
* Various documentation comment improvements for the Database class.
examples:
* examples/quest.cc: Tighten up the type of the error we catch to detect an
unknown stemming language.
portability:
* xapian-config: Need to quote ^ for Solaris /bin/sh.
* configure: Actually use any flags we determine are needed to switch the
compiler to proper ANSI C++ mode, when building xapian-core - this stopped
working in 1.0.12, breaking support for HP's aCC, Compaq's cxx, Sun's CC, and
SGI's CC.
Xapian-core 1.0.16 (2009-09-10):
flint backend:
* Fix a typo which stopped this fix in 1.0.12 from working (ticket #398):
If we fail to get the lock after we spawn the child lock process (the common
case is because the database is already open for writing) then we now clean
up the child process properly.
documentation:
* Improve API documentation of QueryParser::set_default_op() and
QueryParser::get_default_op().
portability:
* Fix build failure on Mac OS X 10.6.
Xapian-core 1.0.15 (2009-08-26):
testsuite:
* Fix the test harness not to report heaps of bogus errors when using valgrind
3.5.0.
flint backend:
* Backport the lazy update changes from 1.1.2:
WritableDatabase::replace_document() now updates the database lazily in
simple cases - for example, if you just change a document's values and
replace it with the same docid, then the terms and document data aren't
needlessly rewritten. Caveats: currently we only check if you've looked at
the values/terms/data, not if they've actually been modified, and only keep
track of the last document read.
* Fix PostingIterator::skip_to() on an unflushed WritableDatabase to skip
documents which were added and deleted since the last flush. (ticket#392)
documentation:
* Overhaul the doxygen options we use and tweak various documentation comments
to improve the generated API documentation.
* Explicitly document that an empty prefix argument to
QueryParser::add_prefix() means "no prefix".
* Update the documentation comments for Enable::set_sort_by_value(),
set_sort_by_value_then_relevance(), and set_sort_by_relevance_then_value() to
mention sortable_serialise() as a good way to store numeric values for
sorting.
Xapian-core 1.0.14 (2009-07-21):
API:
* When using more than one ValueRangeProcessor, QueryParser didn't reset the
begin and end strings to ignore any changes made by a ValueRangeProcessor
which returned false, so further ValueRangeProcessors would see any changes
it had made. This is now fixed, and test coverage improved.
testsuite:
* The test harness code which launches xapian-tcpsrv child processes was
failing to close a file descriptor for each one launched due to a bug in
the code which is meant to track them. This was causing apitest to fail
on OpenBSD (ticket#382). Also wait between testcases for any spawned
xapian-tcpsrv processes to exit to avoid spurious failures when a database is
reused by the next testcase.
* tests/runtest.in: Use "ulimit -n" where available to limit the number of
available file descriptors to 64 so we catch file descriptor leaks sooner.
* When measuring CPU time used for scalability tests, we no longer try to
include the CPU time used by child processes, as we can only get that for
child processes which have exited and it's hard to ensure that they have
with the current framework. Although this means we only tests the
client-side scaling for remote tests, the local backend tests cover most of
the work done by the server part of the remote backend.
* apitest: In testcase topercent2, don't expect max_attained or max_possible to
be exact as rounding errors in different ways of calculating can cause small
variations. On trunk we already have similar code because the new weighting
scheme stuff gives different bounds in the different cases. This should fix
testsuite failures seen on some of the Debian and Ubuntu buildds.
* The test harness now always reports the full exception message (was
conditional on --verbose), and output for different exception types and
other causes of failure is now more consistent.
* For scalability tests, the test harness now increases the number of
repetitions until the first run takes more than 0.001 seconds, to avoid
trying to base calculations on a length of time we probably can't reliably
measure to start with.
* Add test coverage for Stem::get_description() for each supported language.
* queryparsertest: Reenable tests which require the inmemory backend to be
enabled by fixing typo XAPIAN_HAS_BACKEND_INMEMORY ->
XAPIAN_HAS_INMEMORY_BACKEND.
flint backend:
* Use F_FULLFSYNC where available (Mac OS X currently) to ensure that changes
have been committed to disk. (ticket#288)
remote backend:
* Fix handling of percentage weights in various cases when we're searching
multiple remote databases or a mix of local and remote databases.
build system:
* configure: -Wshadow produces false positives with GCC 4.0, so only enable it
for >= 4.1 since we enable -Werror for maintainer-mode builds for GCC >= 4.0.
* configure: Check that we can find the valgrind/memcheck.h header as well as
the valgrind binary.
* Change how snowball generates the data used by its among operation - instead
of using pointers to the strings in struct among, store an offset into a
constant pool, as this reduces the number of relocations by about 2300, which
should decrease the time taken by the dynamic linker when loading the
library. This also reduces the size of the shared library significantly
(on x86-64 Linux, the stripped shared library is 4% smaller).
Xapian-core 1.0.13 (2009-05-23):
API:
* Xapian::Document no longer ever stores empty values explicitly. This
wasn't intentional behaviour, and how this case was handled wasn't
documented. The amended behaviour is consistent with how user metadata
is handled. This change isn't observable using Document::get_value(),
but can be noticed when iterating with Document::values_begin(), using
Document::values_count(), or trying to delete the value with
Document::remove_value().
testsuite:
* Fix testcase scaleweight4 not to fail on x86 when compiled with -O0. The
problem was in the testcase code, and was caused by excess precision in
intermediate FP values.
* Testcases which check that operations have the expected O(...) behaviour now
check CPU time instead of wallclock time on most platforms, which should
eliminate occasional failures due to load spikes from other processes.
(ticket#308)
* Fix test failures due to SKIP_TEST_FOR_BACKEND("inmemory") not skipping when
it should due to comparing char * strings with == (on trunk the return value
being tested is std::string rather than const char *).
* Improve test coverage in several corner cases.
* Fix testcase consistency2 to actually be run (fortunately it passes).
* In the generated testcases, call get_description() on the default
constructed object of each class to make sure that works (and doesn't try to
dereference NULL, or fail some assertion, etc). All currently checked
classes are fine - this is to avoid future regressions or such problems with
new classes.
* In the test coverage build, use "--coverage" instead of "-fprofile-arcs
-ftest-coverage".
* The test harness now has the inmemory backend flagged as supporting
user-specified metadata (apart from iteration over metadata keys).
matcher:
* If a query contains a MatchAll subquery, check for it before checking the
other terms so that the loop which checks how many terms match can exit
early if they all match.
* When an OR or ANY_MAYBE decayed to an AND, we were carefully swapping the
children for maximum efficiency, but the condition was reversed so we were
in fact making things worse. This was noticed because it was resulting in
the same query running faster when more results were asked for!
* Only build the termname to termfreq and weight map for the first subdatabase
instead of rebuilding it for each one. Also don't copy this map to return
it. This should speed up searches a little, especially those over multiple
databases.
* If a submatcher fails but ErrorHandler tells us to continue without it, we
just use a NULL pointer to stand in rather than allocating a special dummy
place-holder object.
* Remove AndPostList, in favour of MultiAndPostList. AndPostList was only used
as a decay product (by AndMaybePostList and OrPostList), and doesn't appear
to be any faster. Removing it reduces CPU cache pressure, and is less code
to maintain.
* Call check() instead of skip_to() on the optional branch of AND_MAYBE.
flint backend:
* Fix a bug in TermIterator::skip_to() over metadata keys.
remote backend:
* Fix xapian-tcpsrv --interface option to work on MacOS X (ticket#373).
* Fix typo which caused us to return the docid instead of the maximum weight
a document from a remote match could return! This could have led to wrong
results when searching multiple databases with the remote backend, but
probably usually didn't matter as with BM25 the weights are generally small
(often all < 1) while docids are inevitably >= 1.
inmemory backend:
* The inmemory backend doesn't support iterating over metadata keys. Trying
to do so used to give an empty iteration, but has now been fixed to throw
UnimplementedError (and this limitation has now been documented).
build system:
* Remove a lot of unused header inclusions and some unused code which should
make the build faster and slightly smaller.
* Fix to compile under --disable-backend-flint, --disable-backend-remote, and
--disable-backend-inmemory.
* Don't remove any built sources in "make clean" even under
--make-maintainer-mode as that breaks switching a tree away from
maintainer-mode with: make distclean;./configure
* configure: Enable more GCC warnings - "-Woverloaded-virtual" for all
versions, "-Wstrict-null-sentinel" for 4.0+, "-Wlogical-op
-Wmissing-declarations" for 4.3+. Notably "-Wmissing-declarations" caught
that consistency2 wasn't being run.
* Internally, fix the few places where we pass std::string by value to pass
by const reference instead (except where we need a modifiable copy anyway) as
benchmarking shows that const reference is slightly faster and generates
less code with GCC's reference counted std::string implementation - with a
non-reference counted implementation, const reference should be much faster.
(ticket#140)
documentation:
* INSTALL: We no longer regularly test build with GCC 2.95.4 and we're raising
the minimum GCC version required to 3.1 for Xapian 1.1.x.
* Document what passing maxitems=0 to Enquire::get_mset() does.
* docs/queryparser.html: Add examples of using a prefix on a phrase or
subexpression.
* Correct doxygen comments for user metadata functions:
Database::get_metadata() can't throw UnimplementedError but
WritableDatabase::set_metadata() can.
* Document that Database::metadata_keys_begin() returns an end iterator if the
backend doesn't support metadata.
* HACKING: Update the list of Debian/Ubuntu packages needed for a development
environment.
debug code:
* Fix build with --enable-debug.
* Added some more assertions.
Xapian-core 1.0.12 (2009-04-19):
API:
* WritableDatabase::remove_spelling() now works properly.
* The QueryParser now treats NON_SPACING_MARK Unicode characters as phrase
generators, which improves handling of Arabic. This is a stop-gap solution
for 1.0.x which will work with existing databases without requiring
reindexing - in 1.1.0, NON_SPACING_MARK will be regarded as part of a word.
(ticket#355)
* Fix undefined behaviour in distribution of OP_NEAR and OP_PHRASE over a
non-leaf subquery (indentified by valgrind on testcase nearsubqueries1).
(ticket#349)
* Enhance distribution of OP_NEAR/OP_PHRASE over non-leaf subqueries to work
when there are multiple non-leaf subqueries (ticket#201).
* Enquire::get_mset() no longer needlessly checks if the documents exist.
* PostingIterator::get_description() output improved visually in some cases.
testsuite:
* Add make targets to assist generating a testsuite code coverage report with
lcov. See HACKING for details.
* Improved test coverage in a number of places and removed some used code as
shown by lcov's coverage report.
flint backend:
* xapian-compact:
+ Now handles databases which contains no documents but have user metadata
(ticket#356).
+ Fix test for the total document length overflowing.
* Release the database lock if the database is closed due to an unrecoverable
error during modifications. (ticket#354)
* If we fail to get the lock after we spawn the child lock process (the common
case is because the database is already open for writing) then we now clean
up the child process properly.
build system:
* Overriding CXXFLAGS at make-time (e.g. "make CXXFLAGS=-Os") no longer
overrides any flags configure detected to be required to make the compiler
accept ISO C++ (for GCC, no such flags are required, so this doesn't
change anything).
documentation:
* Update documentation and code comments to reflect that 1.1 will be a
development series, and 1.2 the next release series.
* docs/admin_notes.html: Document the child process used for locking which
exec-s "cat" (ticket #258).
* include/xapian/unicode.h: Fix documentation comment typos.
* include/xapian/matchspy.h: Removed currently unused header to stop doxygen
from generating documentation for it.
Xapian-core 1.0.11 (2009-03-15):
API:
* Enquire::get_mset():
+ Now throws UnimplementedError if there's a percentage cutoff and sorting is
primarily by value - this has never been correctly supported and it's
better to warn people than give incorrect results.
+ No longer needlessly copies the results internally.
+ When searching multiple databases, now recalculates the maximum attainable
weight after each database which may allow it to terminate earlier.
(ticket#336).
+ Fix inconsistent percentage scores when sorting primarily by value, except
when a MatchDecider is also being used; document this remaining problem
case. (ticket#216)
* Enquire::set_sort_by_value() (and similar methods): Rename the wrongly named
"ascending" parameter to "reverse", and note that its value should always be
explicitly given since defaulting to "reverse=true" is confusing and the
default will be deprecated in 1.1.0. (ticket#311)
* Database::allterms_begin(): Fix memory leak when iterating all terms from
more than one database.
* Query::get_terms_begin(): Don't return "" from the TermIterator (happened
when the query contained or was Query::MatchAll).
* Add QueryParser::FLAG_DEFAULT to make it easier to add flags to those set by
default.
testsuite:
* The testsuite now reports problems detected by valgrind with newer valgrind
versions. Drop support for running the testsuite under valgrind < 3.3.0
(well over a year old) as this greatly simplifies the configure tests.
* Fix usage message for options which take arguments in --help output from test
programs - "-x=foo" doesn't work, the correct syntax is "-x foo".
* If comparing MSet percentages fails, report the differing percentages if in
verbose mode.
* Add test that backends don't truncate total document length to 32 bits.
* Disable lockfileumask1 (regression testcase added in 1.0.10) on Cygwin and on
OS/2.
flint backend:
* The configure test for pread() and pwrite() got accidentally disabled in
0.8.4 and we've always been using llseek() followed by read() or write()
since then. The configure test is now fixed, and gives a slight speedup
(3% measured for searching).
* The child process used to implement WritableDatabase locking now changes
directory to / so that it doesn't block unmounting of any partitions and
closes any open file descriptors which aren't relating to locking so that
if those files are closed by our parent and deleted the disk space gets
released right away.
* We now reuse the same zlib zstream structures rather than using a fresh
one for each operation. This doesn't make a measurable difference in
our own tests on Linux but reportedly is measurably faster on some
systems. (ticket #325)
quartz backend:
* The pread()/pwrite() fix also speeds up quartz.
remote backend:
* Avoid copying Query::Internal objects needlessly when unserialising Query
objects.
inmemory backend:
* Store the (non-normalised) document lengths as Xapian::termcount (unsigned
int) rather than Xapian::doclength (double) which saves 4 bytes per document.
build system:
* configure: The output of g++ --version changed format (again) with GCC 4.3
which meant configure got "g++" for the version. Instead use the (hopefully)
more robust technique of using g++ -E to pull out __GNUC__ and
__GNUC_MINOR__.
documentation:
* API documentation:
+ WritableDatabase::flush() can't throw DatabaseLockError.
+ WritableDatabase's constructor can throw at least DatabaseCorruptError or
DatabaseLockError.
+ Document how to get all matches from Enquire::get_mset().
+ Other minor improvements.
* docs/sorting.html: Clarify meaning.
portability:
* Fix "#line" directives in generated file queryparser/queryparser_internal.cc
to give a relative path - previously they had a full path when generated by a
VPATH build (as release tarballs are), and this confused GCC 2.95 and
depcomp.
* Fix for compiling with Sun's compiler (untested as we no longer have access
to it).
Xapian-core 1.0.10 (2008-12-23):
API:
* Composing an OP_NEAR query with two non-term subqueries now throws
UnimplementedError instead of AssertionError (in a --enable-assertions build)
or leading to unexpected results (otherwise). This partly addresses bug#201.
* Using a MultiValueSorter with no values set no longer causes a hang or
segmentation fault (but it is still rather pointless!)
matcher:
* If we're using values for sorting and for another purpose, cache the
Document::Internal object created to get the value for sorting, like we do
between other uses.
flint backend:
* If the disk became full while flushing database changes to disk, the
WritableDatabase object would throw a DatabaseError exception but be left in
an inconsistent state such that further use could lead to the database on
disk ending up in a "corrupt" state (theoretically fixable, but no tool
to fix such a database exists). Now we try to ensure that the object is
left in a consistent state, but if doing so throws a further exception, we
put the WritableDatabase object in a "closed" state such that further
attempts to use it throw an exception.
* Create the lockfile "flintlock" with permissions 0666 so that the umask is
honoured just like we do for the other files (previously we used 0600).
Previously it wasn't possible to lock a database for update if it was
owned by another user, even if you otherwise had sufficient permissions via
"group" or "other".
* Fix garbled exception message when a base file can't be reread.
quartz backend:
* Fix garbled exception message when a base file can't be reread.
remote backend:
* xapian-tcpsrv and xapian-progsrv now accept -w as a short form of --writable,
as was always intended.
build system:
* This release now uses newer versions of the autotools (autoconf 2.62 ->
2.63; automake 1.10.1 -> 1.10.2).
documentation:
* INSTALL: Add new paragraphs about HP's aCC and IRIX (adapted from footnotes
in PLATFORMS).
* PLATFORMS: HP testdrive has been shut down, so all mark all those machines as
"no longer available". Update atreus' build report to 1.0.10.
* docs/queryparser.html: Add link to valueranges.html.
examples:
* delve: Add missing "and" to --help output. Report termfreq and collection
freq for each term we're asked about.
portability:
* Fix to build with GCC 4.4 snapshot.
Xapian-core 1.0.9 (2008-10-31):
API:
* Database::get_spelling_suggestion() is now faster (15% speed up for parsing
queries with FLAG_SPELLING_CORRECTION set in a test on real world data).
* Fix OP_ELITE_SET segmentation fault due to excess floating point precision
on x86 Linux (and possibly other platforms).
* Database::allterms_begin() over multiple databases now gives a TermIterator
with operations O(log(n)) rather than potentially O(n) in the number of
databases.
* Add new Database methods metadata_keys_begin() and metadata_keys_end() to
allow the complete list of metadata in a database to be retrieved (this
API addition is needed so that copydatabase can copy database metadata).
testsuite:
* Remove the cached test databases before running the testsuite.
* apitest: Fix cursordelbug1 to work on Microsoft Windows (bug#301).
* apitest,queryparsertest: Skip tests which fail because the timer granularity
is too coarse to measure how long the test took. In practice, this is only
an issue on Microsoft Windows (bug#300 and bug#308).
matcher:
* Adjust percent cutoff calculations in the matcher in a way which corresponds
to the change to percentage calculations made in 1.0.7 to allow for excess
precision.
* Query::MatchAll no longer gives match results ranked by increasing document
length.
flint backend:
* xapian-compact: Fix crash while compacting spelling table for a single
database when built with MSVC, and probably other platforms, though Linux
got lucky and happened to work (bug#305).
build system:
* configure: Disable -Wconversion for now - it's not useful for older GCC and
is buggy in GCC 4.3.
* configure: Set -Wstrict-overflow to 1 instead of 5, to avoid unreasonable
warnings under GCC 4.3.
documentation:
* Minor improvements to API documentation, including documenting the
XAPIAN_FLUSH_THRESHOLD environmental variable in WriteableDatabase::flush()
(bug#306).
* valueranges.html: Fix typos in example code, and drop superfluous empty
destructor from ValueRangeProcessor subclass.
* HACKING: Several improvements.
examples:
* copydatabase: Also copy user metadata.
Xapian-core 1.0.8 (2008-09-04):
API:
* Fix output of RSet::get_description
testsuite:
* Report subtotals per backend, rather than per testgroup per backend to make
the output easier to read.
flint backend:
* Fix WritableDatabase::add_document() and replace_document() not to be O(n*n)
in the number of values in the new document.
* Fix handling of a table created lazily after the database has had commits,
and which is then cursored while still in sequential mode.
* Fix failure to remove all the Btree entries in some cases when all the
postings for a term are removed. (bug#287)
* xapian-inspect: Show the help message on start-up. Correct the documented
alias for next from ' ' to ''. Avoid reading outside of input string when it
is empty. (bug#286)
quartz backend:
* Backport fix from flint for WritableDatabase::add_document() and
replace_document() not to be O(n*n) in the number of values in the new
document.
build system:
* configure: Report bug report URL in --help output.
* xapian-config: Report bug report URL in --help output.
* configure: Fix deprecation error for --enable-debug=full to say to instead
use '--enable-assertions --enable-log' not '--enable-debug --enable-log'.
documentation:
* valueranges.html: Expand on some sections.
examples:
* quest: Fix to catch QueryParserError instead of const char * which
QueryParser threw in Xapian < 1.0.0.
* copydatabase: Use C++ forms of C headers. Only treat '\' as a directory
separator on platforms where it is. Update counter every 13 counting up to
the end so that the digits all "rotate" and the counter ends up on the exact
total.
portability:
* Eliminate literal top-bit-set characters in testsuite source code.
Xapian-core 1.0.7 (2008-07-15):
API:
* OP_VALUE_RANGE, OP_VALUE_GE, and OP_VALUE_LE:
+ If there were gaps in the document id numbering, these operators could
return document ids which weren't present in the database. This has been
fixed.
+ These operators are now more efficient when there are a lot of "missing"
document ids (bug#270).
+ Optimise Query(OP_VALUE_GE, <n>, "") to Query::MatchAll.
* Xapian::QueryParser:
+ QueryParser now stops parsing immediately when it hits a syntax error.
This doesn't change behaviour, but does mean failing to parse queries is
now more efficient.
+ Cases of O(N*N) behaviour have been fixed.
* Xapian::Stem now recognises "nl" as an alias for "dutch" (debian bug 484458).
* Setting sort by value was being ignored by a Xapian::Enquire object which had
previously had a Xapian::Sorter set (bug#256).
testsuite:
* Improved test coverage in a few places.
matcher:
* When using a MatchDecider, we weren't reducing matches_lower_bound unless
all the potential results were retrieved, which led to the lower bound
being too high in some such cases.
* We now track how many documents were tested by a MatchDecider and how many
of those it rejected, and set matches_estimated based on this rate. Also,
matches_upper_bound is reduced by the number of rejected documents.
* Fixed matches_upper_bound in some cases when collapsing and using a
MatchDecider.
* Fixed matches_lower_bound when collapsing and using a percentage cutoff.
* When using two or more of a MatchDecider, collapsing, or a percentage
cutoff, we now only round the scaled estimate once, and we also round it to
the nearest rather than always rounding down. Hopefully this should
improve the estimate a little in such cases.
* Fix problem on x86 with the top match getting 99% rather than 100% (caused
by excess precision in an intermediate value).
flint backend:
* If Database::reopen() is called and the database revision on disk hasn't
changed, then do as little work as possible. Even if it has changed, don't
bother to recheck the version file (bug#261).
* xapian-compact:
+ Fix check for user metadata key to not match other key types we may add in
the future. When compacting, we can't assume how we should handle them.
+ If the same user metadata key is present in more than one source database
with different tag values, issue a warning and copy an arbitrary tag value.
+ Fix potential SEGV when compacting database(s) with user metadata but no
postings.
+ In error message, refer to "iamflint" as the "version file", not the
"meta file".
* xapian-inspect:
+ Print top-bit-set characters as escaped hex forms as they often won't be
valid UTF-8 sequences.
+ If we're passed a database directory rather than a single table, issue a
special error message since this is an obvious mistake for users to make.
* Fix cursor handling for a modified table which has previously only had
sequential updates which usually manifested as zlib errors (bug#259).
quartz backend:
* Fix cursor handling for a modified table which has previously only had
sequential updates which usually manifested as incorrect data being returned
(bug#259).
* Calling skip_to() as the first operation on an all-documents PostingIterator
now works correctly.
remote backend:
* Improve performance of matches with multiple databases at least one of which
is remote, and when the top hit is from a remote database (bug#279).
* When remote protocol version doesn't match, the error message displayed
now shows the minor version number supplied by the server correctly.
* We now wait for the connection to close after sending MSG_SHUTDOWN for a
WritableDatabase, which ensures that changes have been written to disk
and the lock released before the WritableDatabase destructor returns
(as is the case with a local database).
* We no longer ever send MSG_SHUTDOWN for a read-only Database - just closing
the connection is enough (and is protocol compatible).
inmemory backend:
* Fix bug which resulted in the values not being stored correctly when
replacing an existing document, or if there are gaps in the document id
numbering.
build system:
* This release now uses newer versions of the autotools (autoconf 2.61 ->
2.62; automake 1.10 -> 1.10.1; libtool 1.5.24 -> 1.5.26). The newer
autoconf reportedly results in a faster configure script, and warns about
use of unrecognised configure options.
* Fix configure to recognise --enable-log=profile and fix build problems when
this is enabled.
* "make up" in the "tests" subdirectory now does "make" in the top-level.
* Fix "make distcheck" by using dist-hook to install generated files from
either srcdir or builddir, with the appropriate dependency to generate them
automatically in maintainer mode builds.
documentation:
* intro_ir.html: Improve wording a bit.
* The documentation now links to trac instead of bugzilla. For links to the
main website, we now prefer xapian.org to www.xapian.org.
* Doxygen-generated API documentation:
+ Improved documentation in several places.
+ The helper macro XAPIAN_VISIBILITY_DEFAULT no longer appears in the output.
+ Header and directory relationship graphs are no longer generated as they
aren't actually informative here.
* HACKING: Numerous updates and improvements.
examples:
* quest: Output get_description() of the parsed query.
portability:
* Fix build with GCC 2.95.3.
* Fix build with GCC 4.3.
* Newer libtool features improved support for Mac OS X Leopard and added
support for AIX 6.1.
debug code:
* Database::get_spelling_suggestion() now debug logs with category APICALL
rather than SPELLING, for consistency with all other API methods.
* Added APICALL logging to a few Database methods which didn't have it.
* Remove debug log tracing from get_description() methods since logging for
other methods calls get_description() methods on parameters, so logging these
calls just makes for more confusing debug logs. A get_description() method
should have no side-effects so it's not very interesting even when explicitly
called by the user.
Xapian-core 1.0.6 (2008-03-17):
API:
* Add new query operators OP_VALUE_LE and OP_VALUE_GE which perform "single
ended" range checks, and a corresponding new Query constructor.
* Add Unicode::toupper() to complement Unicode::tolower().
* Xapian::Stem has been further optimised - stemtest now runs ~2.5% faster.
testsuite:
* tests/runtest: Fixed to handle test programs with a ".exe" extension.
* tests/queryparsertest: Add a couple more testcases which already work to
improve test coverage.
* tests/apitest: Add caseconvert1 testcase to test Unicode::tolower() and
Unicode::toupper().
flint backend:
* xapian-check: Fix not to report an error for a database containing no
postings but some user metadata.
* Update the base files atomically to avoid problems with reading processes
finding partially written ones.
* Create lazy tables with the correct revision to avoid producing a database
which we later report as "corrupt" (bug#232).
* xapian-compact: Fix compaction for databases which contain user metadata
keys.
quartz backend:
* Update the base files atomically to avoid problems with reading processes
finding partially written ones.
remote backend:
* The addition of OP_VALUE_LE and OP_VALUE_GE required an update to the Query
serialisation, which required a minor remote protocol version bump.
* Fix to actually set the writing half as the connection as non-blocking when
a timeout is specified. This would have prevented timeouts from operating
correctly in some situations.
build system:
* configure: GCC warning flag overhaul: Stop passing "-Wno-multichar" since
any multi-character character literal is bound to be a typo (I believe we
were only passing it after misinterpreting its sense!) Pass
"-Wformat-security", and "-Wconversion" for all GCC versions. Add
"-Winit-self" and "-Wstrict-overflow=5" for GCC >= 4.2. The latter might
prove too aggressive, but seems reasonable so far. Fix some minor niggles
revealed by "-Wconversion" and "-Wstrict-overflow=5".
* Add XAPIAN_NORETURN() annotations to functions and non-virtual methods which
don't return.
documentation:
* docs/intro_ir.html: Briefly mention how pure boolean retrieval is supported.
* docs/valueranges.html: Fix example of using multiple VRPs to come out as a
"program listing".
* include/xapian/queryparser.h: Fix incorrect example in doccomment.
* docs/quickstart.html: Remove information covered by INSTALL since
there's no good reason to repeat it and two copies just risks one
getting out of date (as has happened here!)
* docs/quickstart.html: Fix very out of date reference to MSet::items
(bug#237).
* PLATFORMS: Remove reports for 0.8.x as they're too old to be interesting.
Separate out 0.9.x reports. Add Solaris 9 and 10 success reports from James
Aylett. Update from Debian buildd logs.
portability:
* Now builds on OS/2, thanks to a patch by Yuri Dario.
* Fix testsuite to build on mingw (broken by changes in 1.0.5).
debug code:
* Fix --enable-assertions build, broken by changes in 1.0.5.
Xapian-core 1.0.5 (2007-12-21):
API:
* More sophisticated sorting of results is now possible by defining a
functor subclassing Xapian::Sorter (bug#100).
* Xapian::Enquire now provides a public copy constructor and assignment
operator (bug#219).
* Xapian::Document::values_begin() didn't ensure that values had been read
when working on a Document read from a database. However, values_end() did
(and so did values_count()) so this wasn't generally a problem in practice.
* Xapian::PostingIterator::skip_to() now works correctly when running over
multiple databases.
* Xapian::Database::postlist_begin() no longer adds a "MultiPostList" wrapper
for the common case when there's only one subdatabase.
* Xapian::TradWeight now avoids division by zero in the (rare) situation of the
average document length being zero (which can only happen if all documents
are empty or only have terms with wdf 0).
* Calling Xapian::WritableDatabase methods when we don't have exactly one
subdatabase now throws InvalidOperationError.
testsuite:
* apitest:
+ Testcases now describe the conditions they need to run, and are
automatically collated by a Perl script. This makes it significantly
easier to add a new testcase.
+ The test harness's "BackendManager" has been overhauled to allow
cleaner implementations of testcases which are currently hard to
write cleanly, and to make it easier to add new backend settings.
+ Add a "multi" backend setting which runs suitable tests over two
subdatabases combined. There's a corresponding new make target
"check-multi".
+ Add more feature tests of document values.
+ sortrel1 now runs for inmemory too.
+ Add simple feature test for TradWeight being used to run a query.
+ Fix spell3 to work on Microsoft Windows (bug#177).
+ API classes are now tested to check they have copy constructors and
assignment operators, and also that most have a default constructor.
+ quartztest testcases adddoc2 and adddoc3 have been reworked as apitest
testcases adddoc5 and adddoc6, which run for other backends.
+ stubdb1 now explicitly creates the database it needs - generally this
bug didn't manifest because an earlier test has already created it.
* queryparsertest: Add feature tests to check that ':' is being inserted
between prefix and term when it should be.
* Fix extracting of valgrind error messages in the test harness.
* tests/valgrind.supp: Add more variants of the zlib suppressions.
matcher:
* Xapian::Enquire: When the "first" parameter to get_mset() is non-zero, avoid
copying all the wanted items after performing the match.
* Fix bug in handling a pure boolean match over more than one database under
set_docid_order(ASCENDING) - we used to exit early which isn't correct.
* When collapsing on a value, give a better lower bound on the number of
matches by keeping track of the number of empty collapse values seen.
* Xapian::BM25Weight: Fix bug when k2 is non-zero: a non-initialised value
influenced the weight calculations. By default k2 is zero, so this bug
probably won't have affected most users.
* The mechanism used to collate term statistics across multiple databases has
been greatly simplified (bug#45).
flint backend:
* xapian-check:
+ Update to handle flint databases produced by Xapian 1.0.3 and later.
+ Fix not to go into an infinite loop if certain checks fail.
quartz backend:
* quartzcompact: Fix equality testing of C strings to use strcmp() rather than
'=='! In practice, using '==' often gives the desired effect due to pooling
of constant strings, but this may have resulted in a bug on some platforms.
remote backend:
* If we're doing a match with only one database which is remote then just
return the unserialised MSet from the remote match. This requires an
update to the MSet serialisation, which requires a minor remote protocol
version bump.
build system:
* XO_LIB_XAPIAN now hooks LT_INIT as well as AC_PROG_LIBTOOL and
AM_PROG_LIBTOOL.
* Distribute preautoreconf, dir_contents, docs/dir_contents and
tests/dir_contents.
* Fix preautoreconf to correctly handle all the sources passed to doxygen to
create the collated internal source documentation, and to work in a VPATH
build.
documentation:
* sorting.html: New document on the topic of sorting match results.
* HACKING,admin_notes.html,bm25.html,glossary.html,intro_ir.html,overview.html,
quickstart.html,scalability.html,termgenerator,html,synonyms.html: Assorted
minor improvements.
* valueranges.html: State explicitly that Xapian::sortable_serialise() is used
to encode values at index time, and give an example of how it is called.
* API documentation:
+ Clarify get_wdf() versus get_termfreq().
+ We now use pngcrush to reduce the size of PNG files in the HTML version.
+ The HTML version no longer includes various intermediate files which doxygen
generates.
+ Hide the v102 namespace from Doxygen as it isn't user visible.
+ Stop describing get_description() as an "Introspection method", as this
doesn't help to explain what it does, and get_description() doesn't really
fall under common formal definitions of "introspection".
* index.html: Add a list of documents on particular topics and include links to
previously unlinked-to documents. Weed down the top navigation bar which had
grown to unwieldy length.
* PLATFORMS: Update for Debian buildds.
* Improve documentation comment for Document::termlist_count().
* admin_notes.html: Note that this document is up-to-date for 1.0.5.
* INSTALL: zlib 1.2.0 apparently fixes a memory leak in deflateInit2(), which
we use, so that's another reason to prefer 1.2.x.
portability:
* Add explicit includes of C headers needed to build with the latest snapshots
of GCC 4.3. Fix new warnings.
* xapian-config: On platforms which we know don't need explicit dependencies,
--ltlibs now gives the same output as --libs.
* The minimum supported GCC version is now 2.95.3 (rather than 2.95) as 2.95.3
added support for '#include <sstream>' which means we no longer need to
maintain our own version.
* Fix build with SGI's compiler on IRIX.
* Fix or suppress some MSVC warnings.
debug code:
* Remove incorrect assertion in MultiAndPostList (bug#209).
* Fix build when configured with "--enable-log --disable-assertions".
Xapian-core 1.0.4 (2007-10-30):
API:
* Query:
+ Add OP_SCALE_WEIGHT operator (and a corresponding constructor which
takes a single subquery and a parameter of type "double"). This
multiplies the weights from the subquery by the parameter, allowing
adjustment of the importance of parts of the query tree.
+ Deprecate the essentially useless constructor Query(Query::op, Query).
* QueryParser:
+ A field prefix can now be set to expand to more than one term prefix.
Similarly, multiple term prefixes can now be applied by default. This is
done by calling QueryParser::add_boolean_prefix() or
QueryParser::add_prefix() more than once with the same field name but a
different term prefix (previously subsequent calls with the same field name
had no effect).
+ Trying to set the same field as probabilistic and boolean now throws
InvalidOperationError.
+ Fix parsing of `term1 site:example.org term2', broken by changes in 1.0.2.
+ Drop special treatment for unmatched ')' at the start of the query, as it
seems rather arbitrary and not particularly useful and was causing us to
parse `(site:example.org) -term' incorrectly.
+ The QueryParser now generates pure boolean Query objects for strings such
as `site:example.org' by applying OP_SCALE_WEIGHT with a factor of 0.0.
+ Fix handling of `"quoted phrase" +term' and `"quoted phrase" -term'.
+ Fix handling of `site:example.org -term'.
+ Fix problem with spelling correction of hyphenated terms (or other terms
joined with phrase generators): the position of the start of the term
wasn't being reset for the second term in the generated phrase, resulting
in out of bounds errors when substituting the new value in the corrected
query string.
+ The parser stack is now a std::vector<> rather than a fixed size, so it
will typically use less memory, and can't hit the fixed limit.
+ Fix handling of STEM_ALL and update the documentation comment for
QueryParser::set_stemming_strategy() to explain how it works clearly.
* PostingIterator: positionlist_begin() and get_wdf() should now always
throw InvalidOperationError where they aren't meaningful (before in some
cases UnimplementedError was thrown).
testsuite:
* Add tests for new features.
* Add another valgrind suppression for a slightly different error from zlib
in Ubuntu gutsy.
* Remove quartztest's test_postlist1 and test_postlist2, replacing the coverage
lost by extending and adding tests which work with other backends as well.
* If a test throws a subclass of std::exception, the test harness now
reports the class name and the extra information returned by std::exception's
what() method.
matcher:
* Several performance improvements have been made, mainly to the handling
of OP_AND and related operations (OP_FILTER, OP_NEAR, and OP_PHRASE).
In combination, these are likely to speed up searching significantly
for most users - in tests on real world data we've seen savings of 15-55%
in search times). These improvements are:
+ OP_AND of 3 or more sub-queries is now processed more efficiently.
+ Sub-queries from adjacent OP_AND, OP_FILTER, OP_NEAR, and OP_PHRASE are now
combined into a single multi-way OP_AND operation, and the filters which
implement the near/phrase restrictions are hoisted above this so they need
to check fewer documents (bug#23).
+ If an OP_OR or OP_AND_MAYBE decays to OP_AND, we now ensure that the less
frequent sub-query is on the left, which OP_AND is optimised to expect.
* When the Enquire::get_mset() parameter checkatleast is set, and we're sorting
by relevance with forward ordering by docid, and the query is pure boolean,
the matcher was deciding it was done before the checkatleast requirement was
satisfied. Then the adjustments made to the estimated and max statistics
based on checkatleast meant the results claimed there were exactly msize
results. This bug has now been fixed.
* Queries involving an OP_VALUE_RANGE filter now run around 3.5 times faster
(bug#164).
* The calculations behind MSet::get_matches_estimated() were always rounding
down fractions, but now round to the nearest integer. Due to cumulative
rounding, this could mean that the estimate is now a few documents higher in
some cases (and hopefully a better estimate).
* Implement explicit swap() methods for internal classes MSetItem and ESetItem
which should make the final sort of the MSet and ESet a little more
efficient.
flint backend:
* Fixed a bug introduced in 1.0.3 - trying to open a flint database for reading
no longer fails if it isn't writable.
* We no longer use member function pointers in the Btree implementation which
seems to speed up searching a little.
remote backend:
* The remote protocol minor version has been increased (to accommodate
OP_SCALE_WEIGHT). If you are upgrading a live system which uses the
remote backend, upgrade the servers before the clients.
build system:
* Added macro machinery to allow branch prediction hints to be specified and
used by compilers which support this (current GCC and Intel C++).
* In a developer build, look for rst2html.py if rst2html isn't found as some
Linux distros have it installed under with an extension.
documentation:
* In the API documentation, explicitly note that Database::get_metadata()
returns an empty string when the backend doesn't support user-specified
metadata, and that WritableDatabase::set_metadata() throws UnimplementedError
in this case. Also describe the current behaviour with multidatabases.
* README: Remove the ancient history lesson - this material is better left to
the history page on the website.
* deprecation.html:
+ Deprecate the non-pythonic iterators in favour of the pythonic ones.
+ Move "Stem::stem_word(word)" in the bindings to the right section (it was
done in 1.0.0, as already indicated).
+ Improve formatting.
* When running rst2html, using "--verbose" was causing "info" messages to be
included in the HTML output, so drop this option and really fix this issue
(which was thought to have been fixed by changes in 1.0.3).
* install.html: Reworked - this document now concentrates on giving
a brief overview of building which should be suitable for most common cases,
and defers to the INSTALL document in each tarball for more details.
* PLATFORMS: Update from tinderbox and buildbot.
* remote.html: xapian-tcpsrv has been able to handle concurrent read
access since 0.3.1 (7 years ago) so update the very out-of-date information
here. Also, note that some newer features aren't supported by the remote
backend yet.
* HACKING: Note specifically that std::list::size() is O(n) for GCC.
* intro_ir.html: Add link to the forthcoming book "Introduction to
Information Retrieval", which can be read online.
* scalability.html: Update size of gmane.
* quartzdesign.html: Note that Quartz is now deprecated.
debug code:
* The debug assertion code has been rewritten from scratch to be cleaner and
pull in fewer other headers.
Xapian-core 1.0.3 (2007-09-28):
API:
* Add support for user specified metadata (bug#143). Currently supported by
the flint and inmemory backends.
* Deprecate Enquire::register_match_decider() which has always been a no-op.
* Improve the lower bound on the number of matching documents for an AND query
- if the sum of the lower bounds for the two sides is greater than the
number of documents in the database, then some of them must have both terms.
* Spelling correction: Fix off-by-one error in loop bounds when initialising
(bug#194).
* If the check_at_least parameter to Enquire::get_mset() is used, but there
aren't that many results, then MSet::get_matches_lower_bound() and
MSet::get_matches_upper_bound() weren't always reported as equal - this
bug is now fixed.
* When sorting by value, and using the check_at_least parameter to
Enquire::get_mset(), some potential matches weren't being counted.
* Failing to create a flint or quartz database because we couldn't create the
directory for it now throws DatabaseCreateError not DatabaseOpeningError.
testsuite:
* Fix display of valgrind output when a test fails because valgrind detected
a problem.
* Add another version of valgrind suppression for the zlib end condition check
as this gives a different backtrace for zlib in Ubuntu gutsy.
flint backend:
* The Flint database format has been extended to support user metadata, and
each termlist entry is now a byte shorter (before compression). As a
result, Xapian 1.0.2 and earlier won't be able to read Xapian 1.0.3
databases. However, Xapian 1.0.3 can read older databases. If you open an
older flint database for writing with Xapian 1.0.3, it will be upgraded
such that it cannot then be read by Xapian 1.0.2 and earlier.
* Zlib compression wasn't being used for the spelling or synonym tables (due
to a typo - Z_DEFAULT_COMPRESSION where it should be Z_DEFAULT_STRATEGY).
* xapian-check: Allow "db/record." and "db/record.DB" as arguments.
* Fix "key too long" exception message by substituting FLINT_BTREE_MAX_KEY_LEN
with its numeric value.
* Assorted minor efficiency improvements.
* If we reach the flush threshold during a transaction, we now write out the
postlist changes, but don't actually commit them.
* Check length of new terms is at most 245 bytes for flint in add_document()
and replace_document() so that the API user gets an error there rather
than when flush() is called (explicitly or implicitly). Fixes bug#44.
* Flint used to read the value of the environmental variable
XAPIAN_FLUSH_THRESHOLD when the first WritableDatabase was opened and would
then cache this value. However the program using Xapian may have changed
it, so we now reread it each time a WritableDatabase is opened.
* Implement TermIterator::positionlist_count() for the flint backend.
remote backend:
* Fix the result of MSet::get_matches_lower_bound() when using the
check_at_least parameter to get_mset().
inmemory backend:
* Implement TermIterator::positionlist_count() for the inmemory backend.
build system:
* xapian-config: We always need to include dependency_libs in the output of
`xapian-config --libs` if shared libraries are disabled.
* Distribution tarballs are now in the POSIX "ustar" format. This supports
pathnames longer than 99 characters (which we now have a few instances of
in the doxygen generated documentation) and also results in a distribution
tarball that is about half the size! This format should be readable by any
tar program in current use - if your tar program doesn't support it, we'd
like to know (but note that the GNU tar tarball is smaller than the size
reduction in the xapian-core tarball...)
* configure no longer generates msvc/version.h - this is now entirely handled
by the MSVC-specific makefiles.
documentation:
* Add a glossary.
* docs/stemming.html: Reorder the initial paragraphs so we actually answer the
question "What is a stemming algorithm?" up front.
* When running rst2html, use "--exit-status=warning" rather than "--strict".
The former actually gives a non-zero exit status for a warning or worse,
while the former doesn't, but does include any "info" messages in the output
HTML.
* docs/deprecation.rst: Add "Database::positionlist_begin() throwing
RangeError and DocNotFoundError".
* valueranges.rst: Correct out-of-date reference to float_to_string.
* HACKING: Document a few more "coding standards".
* PLATFORMS: Updated.
* docs/overview.html: Restore HTML header accidentally deleted in November
2006.
* Fix several typos.
portability:
* Add missing instances of "#include <string.h>" to fix compilation with recent
GCC 4.3 snapshots.
* Fix some warnings for various compilers and platforms.
Xapian-core 1.0.2 (2007-07-05):
API:
* Xapian now offers spelling correction, based on a dynamically maintained
list of spelling "target" words. This is currently supported by the
flint backend, and works when searching multiple databases.
* Xapian now offers search-time synonym expansion, based on an externally
provided synonym dictionary. This is currently supported by the flint
backend, and works when searching multiple databases.
* TermGenerator: now offers support for generating spelling correction
data.
* QueryParser:
+ New flag FLAG_SPELLING_CORRECTION to enable spelling correction, and a new
method, "get_corrected_query_string()" to get the spelling corrected
query string.
+ New flags have been added to allow the new synonym expansion feature to be
enabled and controlled. Synonym expansion can either be automatic, or only
for terms explicitly indicated in the query string by the new "~" operator.
+ The precedence of the boolean operators has been adjusted to match their
usual precedence in mathematics and programming languages. "NOT" now binds
as tightly as "AND" (previously "AND NOT" would bind like "AND", but just
"NOT" would bind like "OR"!) Also "XOR" now binds more tightly than "OR",
but less tightly than "AND" (previously it bound just like "OR").
+ '+' and '-' have been fixed to work on bracketed subexpressions as
documented.
+ If the stemmer is "none", no longer put a Z prefix on terms; this now
matches the output of TermGenerator.
* Add new Xapian::sortable_serialise() and Xapian::sortable_unserialise()
functions which serialise and unserialise numbers (currently only
doubles) to a string representation which sorts in numeric order. Small
integers have a short representation.
* NumberValueRangeProcessor has been changed to work usefully. Previously
the numbers had to be the same length; now numbers are serialised to
strings such that a string sort on the string orders the numbers correctly.
Negative and floating point numbers are also supported now. The old
NumberValueRangeProcessor is still present in the library to preserve
ABI compatibility, but code linking against 1.0.2 or later will pick
up the new implementation, which really lives in a sub-namespace.
* Documents now have a get_docid() method, to get the document ID from the
database they came from.
* Add support for a new type of match decider, called a "matchspy". Unlike
the old deciders, this will reliably be tested on every candidate
document, so can be used to tally statistics on them.
* Fixed a segfault when getting a description for a MatchNothing query
joined with AND_NOT (bug #176).
* Header files have been tidied up to remove some unnecessary includes.
Applications using "#include <xapian.h>" will not be affected. We don't
intend to support direct inclusion of individual header files from the xapian
directory, but if you do that, you may have to update you code.
testsuite:
* Feature tests added for all new features.
* Improved test coverage in queryparsertest. Some tests in queryparsertest
now use flint databases, so the test now ensures that the .flint
subdirectory exists.
* The test harness no longer creates <dbdir>/log for flint (flint doesn't
create a log like quartz does).
* apitest: "-bremote" must now be "-bremoteprog" (to better match
"-bremotetcp"); "-bvoid" must now be "-bnone" (to better describe not
using a database backend).
* To complement "make check-flint", "make check-quartz", and "make
check-remote", you can now run tests for the remotetcp backend with
"make check-remotetcp", for the remoteprog backend with "make
check-remoteprog", for the inmemory backend with "make check-inmemory", and
tests not requiring a backend with "make check-none".
* Several extra tests of the check_at_least parameter supplied to
get_mset() were added.
* Fix memory leak and fd leak in remotetcp handling, so apitest now passes
under valgrind.
* quartztest: no longer test QuartzPostList::get_collection_freq(), which
has been removed.
* Add regression test emptyquery2 for bug #176.
* Add regression test matchall1 for bug with MatchAll queries.
* Enhanced test coverage of match functor, to check that it returns all
matching documents.
matcher:
* Fix bug when check_at_least was supplied - the matches after the
requested MSet size were being returned to the user. The parameter is
also now handled in a more efficient way - no extra memory is required
(previously, extra memory proportional to the value of check_at_least was
required).
* Fix bug which used incorrect statistics, and caused assertion failures,
when performing a search using a MatchAll query.
* Optimisation for single term queries: we don't need to look at the top
document's termlist to determine that it matches all the query terms.
flint backend:
* The value and position tables are now only created if there is anything to
add to them. So if you never use document values, there's no value.DB,
value.baseA, or value.baseB. This means the table doesn't need to be opened
for searching (saving a file handle and a number of syscalls) and when
flushing changes, we don't need to update baseA/baseB just to keep the
revisions in step. The flint database version has been increased, but the
new code will happily open and read/update flint databases from Xapian 1.0.0
and 1.0.1. Xapian 1.0.2 flint databases can't be read by Xapian 1.0.1 or
earlier though.
* Two new optional tables are now supported: "spelling", which is used to
store information for spelling correction, and "synonym", which is used
to store synonym information.
* xapian-compact: Now compacts and merges spelling and synonym tables.
Also has a new option "--no-renumber" to preserve document ids from
source databases.
* xapian-check: Now checks the spelling and synonym tables (only the Btree
structure is currently checked, not the information inside).
* Database::term_exists(), Database::get_termfreq(), and
Database::get_collection_freq() are now slightly more efficient for flint
databases.
* New utility 'xapian-inspect' which allowing interactive inspection of key/tag
pairs in a flint Btree. Useful for development and debugging, and an
approximate equivalent to quartzdump.
* WritableDatabase::delete_document() no longer cancels pending changes if the
document doesn't exist.
* Fix handling of exceptions during commit - previously, this could result
in tables getting out-of-sync, perhaps even resulting in a corrupt database.
* Optimise iteration of all documents in the case where all the document
IDs up to lastdocid are used; in this case, we no longer need to access disk
to get the document IDs.
quartz backend:
* WritableDatabase::delete_document() no longer cancels pending changes if the
document doesn't exist.
* We no longer create a postlist just to find the termfreq or collection
frequency.
remote backend:
* Calling WritableDatabase::delete_document() on a non-existent document now
correctly propagates DocNotFoundError.
* The minor remote protocol version has increased (to fix the previous issue).
You should be able to cleanly upgrade a live system by upgrading servers
first and then clients.
* progclient: Reopen stderr on the child process to /dev/null rather than
closing it. This fixes apitest with the remoteprog backend to pass when run
under valgrind (it failed in this case in 1.0.0 and 1.0.1). It probably
has no effect otherwise.
* check_at_least is now passed to the remote server to reduce the work
needed to produce the match, and the serialised size of the returned MSet.
inmemory backend:
* Bug fix: using replace_document() to add a document with a specific
document id above the highest currently used would create empty documents
for all document ids in between.
build system:
* Work around an apparent bug in automake which causes the entries in .libs
subdirectories generated for targets of bin_PROGRAMS not to be removed on
make clean. This was causing make distcheck to fail.
* Snapshots and releases are now bootstrapped with automake 1.10, and
libtool 1.5.24.
* HTML documentation generated from RST files is now installed.
documentation:
* The API documentation is now generated with Doxygen 1.5.2, which fixes the
missing docs for Xapian::Query.
* Ship and install internals.html.
* Generating the doxygen-collated documentation of the library internals (with
"make doxygen_source_docs") now only tries to generate an HTML version. The
PDF version kept exceeding TeX limits, and HTML is a more useful format for
this anyway.
* API docs for Xapian::QueryParser now make it clear that the default value for
the stemming strategy is STEM_NONE.
* API docs now describe the NumberValueRangeProcessor more clearly.
* Several typo fixes and assorted wording improvements.
* queryparser.html: Mention "AND NOT" as an alternative way to write "NOT",
and document synonym expansion.
* admin_notes.html: Updated for changes in this release, and corrected a
few minor errors.
* spelling.rst: New file, documenting the spelling correction feature.
* synonyms.rst: New file, documenting the synonyms expansion feature.
* valueranges.rst: The NumberValueRangeProcessor is now documented.
* HACKING: Mention new libtool, and more details about preferring
pre-increment. Also add a note about 2 space indentation of protection
level declarations in classes.
* INSTALL: note that zlib must be installed before you can build.
examples:
* copydatabase: Now copies synonym and spelling data. Also, fix a cosmetic
bug with progress output when a specified database directory has a trailing
slash.
portability:
* Fix to build on with OpenBSD's zlib (xapian-core 1.0.0 and 1.0.1 didn't).
* Fixed to build with older zlib such as zlib 1.1.5 which Solaris apparently
uses (xapian-core 1.0.0 and 1.0.1 didn't). However, we recommend using zlib
1.2.x as decompressing is apparently about 20% faster.
* msvc/version.h.in: Generated version.h for MSVC build no longer has the
remote backend marked as disabled.
* Fix warnings from Intel's C++ compiler.
* Fixes for compilation with gcc-2.95 and GCC 4.3 snapshots.
packaging:
* RPMs:
+ Rename xapian.spec to xapian-core.spec to match tarball name.
+ Append the user name to BuildRoot.
debug code:
* Better debug logging from the queryparser internals.
Xapian-core 1.0.1 (2007-06-11):
API:
* Xapian::Error:
+ Make Error::error_string member std::string rather than char * to avoid
problems with double free() with copied Error objects. Unfortunately
this mean an incompatible ABI change which we had hoped to avoid until
1.1.0, but in this case there didn't seem to be a sane way to fix the
problem without an ABI change.
+ Error::get_description() now converts my_errno to error_string if it hasn't
been already rather than not including any error description in this case.
+ Add new method "get_description()" to get a string describing the error
object. This is used in various examples and scripts, improving their
error reporting.
* Xapian::Database: Add new form of allterms_begin() and allterms_end()
which allow iterating of all terms with a particular prefix. This
is easier to use than checking the end condition yourself, and is
more efficiently implemented for the remote backend (fixes bug#153).
* Xapian::Enquire: Passing an uninitialised Database object to Enquire will
now cause InvalidArgumentError to be thrown, rather than causing a segfault
when you call Enquire::get_mset(). If you really want an empty database,
you can use Xapian::InMemory::open() to create one.
* Xapian::QueryParser: Multiple boolean prefixed terms with the same term
prefix are now combined with OR before such groups are combined with AND
(bug#157). Multiple value ranges on the same value are handled similarly.
* Xapian::Query OP_VALUE_RANGE: Avoid calling db->get_lastdocid() repeatedly
as we know the answer won't change - this reduces the run time of a
particular test case by 25%.
testsuite:
* Add test for serialisation of error strings.
* Improved output in various situations:
+ Quote strings in TEST_STRINGS_EQUAL().
+ queryparsertest: Use TEST_STRINGS_EQUAL when comparing query descriptions
against their expected output, since this makes it much easier to see the
differences.
+ Report whole message for exceptions, rather than a truncated version, in
verbose mode.
+ Make use of Xapian::Error::get_description(), giving better error
reports.
* queryparsertest: New test of custom ValueRangeProcessor subclass
(qp_value_customrange1).
* apitest: flintdatabaseformaterror1 and flintdatabaseformaterror2 now use a
genuine Xapian 0.9.9 flint database for their tests, and more cases are
tested. The two tests have also been split into 3 now.
* Fix test harness not to invoke undefined behaviour in cases where a paragraph
of test data contains two or fewer characters.
* Implement a better fix for the MSVC ifstream issue which was fixed in 1.0.0.
This fixes an unintentional side-effect of the previous fix which meant that
apitest's consistency1 wasn't working as intended (it now has a regression
test to make sure it is testing what we intend).
flint backend:
* xapian-compact: Don't uncompress and recompress tags when compacting a
database. This speeds up xapian-compact rather a lot (by more than 50% in a
quick test).
* If the docid counter wraps, Flint now throws DatabaseError (fixes bug#152).
* Remove the special case error message for pre-0.6 databases since they'll
be quartz format (the check is only in flint because this code was taken from
quartz).
quartz backend:
* If the docid counter wraps, Quartz now throws DatabaseError (fixes bug#152).
remote backend:
* The remote protocol now has a minor version number. If the major
version number is the same, a client can work with any server with
the same or higher minor version number, which makes upgrading live
systems easier for most remote protocol changes - just upgrade the servers
first.
* When a read-only remote database is closed, the client no longer sends a
(totally bogus) MSG_FLUSH to the server, and the reply is also eliminated.
This reduces the time taken to close a remote database a little (fixes
bug#149).
inmemory backend:
* skip_to() on an allterms TermIterator from an InMemory Database can no longer
move backwards.
* An allterms TermIterator now initialises lazily, which can save some work if
the first operation is a skip_to() (as it often will be).
build system:
* Fix VPATH compilation in maintainer mode with gcc-2.95.
* Fix multiple target rule for generating the queryparser source files in
parallel builds.
* Distribute missing stub Makefiles for "bin", "examples", and
"include/xapian".
documentation:
* Document the design flaw with NumberValueRangeProcessor and why it shouldn't
be used.
* ValueRangeProcessor and subclasses now have API documentation and an overview
document.
* Expand documentation of value range Query constructor.
* Improved API documentation for the TermGenerator class.
* docs/deprecation.rst:
+ Fix copy and paste error - set_sort_forward() should be changed to
set_docid_order().
+ Improve entry for QueryParserError.
* PLATFORMS: Updated from tinderbox.
examples:
* copydatabase: Rewritten to use the ability to iterate over all the documents
in a database. Should be much more efficient for databases with sparsely
distributed document IDs.
* simpleindex: Rewritten to use the TermGenerator class, which eliminates a
lot of non-Xapian related code and is more typical of what a user is likely
to want to do.
* simplesearch,simpleexpand: Rewritten to use the QueryParser class, which
is more typical of what a user is likely to want to do.
portability:
* xapian-config: Add special case check for host_os matching linux* or
k*bsd-gnu since vanilla libtool doesn't correctly probe link_all_deplibs=no
for them.
packaging:
* RPMs: Add "# norootforbuild" comment which SuSE's build scripts look for.
Rename "Source0:" to "Source:" as there's only one tarball now. Add gcc-c++
and zlib-devel to "Build-Requires:".
* The required automake version has been lowered to 1.8.3, so RPMs can now be
built on RHEL 4 and SLES 9.
Xapian-core 1.0.0 (2007-05-17):
API:
* Xapian::Database:
+ The Database(const std::string &) constructor has been marked as "explicit".
Hopefully this won't affect real code, but it's possible. Instead of
passing a std::string where a Xapian::Database is expected, you'll now
have to explicitly write `Xapian::Database(path)' instead of `path'.
+ Fixed problem when calling skip_to() on an allterms iterator over multiple
databases which could cause a debug assertion in debug builds, and possible
misbehaviour in normal builds.
* Xapian::Error:
+ The constructors of Error subclasses which take a `const std::string &'
parameter are now explicit. This is very unlikely to affect any real code
but if it does, just write `Xapian::Error(msg)' instead of `msg'.
+ Xapian::Error::get_type() now returns const char* rather than std::string.
Generally existing code will just work (only one change was required in
Xapian itself) - the simplest change is to write `std::string(e.get_type())'
instead of `e.get_type()'.
+ Previously, the errno value was lost when an error was propagated from
a remote server to the client, because errno values aren't portable
between platforms. To fix this, Error::get_errno() is now deprecated and
you should use Error::get_error_string() instead, which returns a string
expanded from the errno value (or other system error code).
* Xapian::QueryParser:
+ Now assumes input text is encoded as UTF-8.
+ We've made several changes to term generation strategy. Most notably:
Unicode support has been added; '_' now counts as a word character; numbers
and version numbers are now parsed as a single term; single apostrophes are
now included in a term; we now store unstemmed forms of all terms; and we
no longer try to "normalise" accents.
+ parse_query() now throws the new Xapian::Error subclass QueryParserError
instead of throwing const char * (bug#101).
+ Pure NOT queries are now supported (for example, `NOT apples' will match
all documents not indexed by the stemmed form of `apples'). You need
to enable this feature by passing QueryParser::FLAG_PURE_NOT in flags
to QueryParser::parse_query().
+ We now clear the stoplist when we parse a new query.
+ Queries such as `+foo* bar', where no terms in the database match the
wildcard `foo*', now match no documents, even if `bar' exists. Handling
of `-foo*' has also been fixed.
+ Now supports wildcarding the last term of a query to provide better support
for incremental searching. Enabled by QueryParser::FLAG_PARTIAL.
+ The default prefix can now be specified to parse_query() to allow parsing
of text entry boxes for particular fields.
+ QueryParser::set_stemming_options() has been deprecated since 0.9.0 and
has now been removed.
* Xapian::Stem:
+ Now assumes input text is encoded as UTF-8.
+ We've updated to the latest version of the Snowball stemmers. This means
that a small number of words produce different (and generally better)
stems and that some new stemmers are supported: german2 (like german but
normalises umlauts), hungarian, kraaij_pohlmann (a different Dutch
stemmer), romanian, and turkish.
* Xapian::TermGenerator:
+ New class which generates terms from a piece of text.
* Xapian::Enquire:
+ The Enquire(const Database &) constructor has been marked as "explicit".
This probably won't affect real code - certainly no Xapian API methods
or functions take an Enquire object as a parameter - but calls to user
methods or functions taking an Enquire object could be affected. In
such cases, you'll now have to explicitly write `Xapian::Enquire(db)'
instead of `db'.
+ Enquire::get_eset() now produces better results when used with multiple
databases - without USE_EXACT_TERMFREQ they should be much more similar to
results from an equivalent single database; with USE_EXACT_TERMFREQ they
should be identical.
+ Track the minimum weight required to be considered for the MSet separately
from the minimum item which could be considered. Trying to combine the two
caused several subtle bugs (bug#86).
+ Enquire::get_query() is now `const'. Should have no effect on user code.
+ Enquire::get_mset() now handles the common case of an "exact" phrase search
(where the window size is equal to the number of terms) specially.
+ Enquire::include_query_terms and Enquire::use_exact_termfreq are now
deprecated in favour of capitalised versions Enquire::INCLUDE_QUERY_TERMS
and Enquire::USE_EXACT_TERMFREQ (for consistency with our other manifest
constants, and general C/C++ conventions).
* Xapian::RSet:
+ RSet::contains(MSetIterator) is now `const'. Should have no effect on user
code.
* Xapian::SimpleStopper::add() now takes `const std::string &' not `const
std::string'. Should have no effect on user code.
* Xapian::Query:
+ We now only perform internal validation on a Query object when it's either
constructed or changed, to avoid O(n^2) behaviour in some cases.
+ Xapian::Query::MatchAll (an alias for Query("")) matches all terms in the
document (useful for "pure NOT" queries) and Xapian::Query:MatchNothing
is now a more memorable alias for Query().
* Instead of explicitly checking that a term exists before opening its
postlist, we now do both in one operation, which is more efficient.
* MatchDecider::operator() now returns `bool' not `int'.
* ExpandDecider::operator() now returns `bool' not `int'.
* Xapian::TermIterator::get_termfreq() now throws InvalidOperationError
if called on a TermIterator from a freshly created Document (since
there's no meaningful term frequency as there's no Database for
context).
* <xapian/output.h> is no longer available as an externally visible header.
It's not been included by <xapian.h> since 0.7.0. Instead of using
`cout << obj;' use `cout << obj.get_description();'.
* New constant Xapian::BAD_VALUENO which is -1 cast to Xapian::valueno.
* New Xapian::ValueRangeProcessor hierarchy: DateValueRangeProcessor,
NumberValueRangeProcessor, and StringValueRangeProcessor. In
conjunction with the new QueryParser::add_valuerangeprocessor()
method and the new Query::OP_VALUE_RANGE op these allow you to
implement ranges in the query parser, such as `$50..100',
`10..20kg', `01/02/2007..03/04/2007'.
testsuite:
* Many new and improved testcases in various areas.
* If a test throws an unknown exception, say so in the test failure message.
If it throws std::string, report the first 40 characters (or first line if
less than 40 characters) of the string even in non-verbose mode.
* Use of valgrind improved:
+ The test harness now only hooks into valgrind if environment variable
XAPIAN_TESTSUITE_VALGRIND is set, which makes it easy to run test programs
under valgrind in the normal way. The runtest script sets this
automatically.
+ runtest now passes "--leak-resolution=high" to valgrind to prevent
unrelated leak reports related to STL classes from being combined.
+ configure tests for valgrind improved and streamlined.
+ New runsrv script to run xapian-tcpsrv and xapian-progsrv. We need to
run these under valgrind to avoid issues with excess numerical precision
in valgrind's FP handling, but we can use "--tool=none" which is a lot
faster than running them under valgrind's default memcheck tool.
* The test harness now starts xapian-tcpsrv in a more reliable way - it will
try sequentially higher port numbers, rather than failing because a
xapian-tcpsrv (or something else) is already using the default port.
It also no longer leaks file descriptors (which was causing later tests
to fail on some platforms), and if xapian-tcpsrv fails to start, the error
message is now reported.
* remotetest has been removed and its testcases have either been added to
apitest or just removed if redundant with tests already in apitest.
* termgentest is a new test program which tests the Xapian::TermGenerator
class.
* TEST_EQUAL_DOUBLE() now uses a slightly less stringent threshold -
DBL_EPSILON is too strict for calculations which include multiple
steps. Also, we now use it instead of doubles_are_equal_enough() and
weights_are_equal_enough() which try to perform the same job.
* New macro TEST_STRINGS_EQUAL() which displays the strings on separate lines
so the differences can be clearly seen.
* Test programs are now linked with '-no-install' which means that libtool
doesn't need to generate shell script wrappers for them on most platforms.
* runtest: Now turns on MALLOC_CHECK_ and MALLOC_PERTURB_ for glibc if
valgrind isn't being used.
* Better support for Microsoft Windows:
+ test_emptyterm2 no longer tries to delete a database from disk while a
WritableDatabase object still exists for it, since this isn't supported
under Microsoft Windows.
+ Fallback handling when srcdir isn't specified how takes into account .exe
extensions and different path separators.
flint backend:
* Flint is now the default backend.
* xapian-check: New program which performs consistency checks on a flint
database or table.
* xapian-compact: Now prunes unused docids off the start of each source
database's range of docids.
* Positional information is now encoded using a highly optimised fls()
implementation, which is much faster than the FP code 0.9.x used.
Unfortunately the old encoding could occasionally add extra bits
on some architectures, which was harmless except the databases
wouldn't be portable. Because of this, the flint format has had to
be changed incompatibly.
* The lock file is now called "flintlock" rather than "flicklock" (which
was a typo!)
* Flint now releases its lock correctly if there's an error in
WritableDatabase's constructor. Previously the lock would remain until
the process exited.
* Flint now throws new Xapian::Error subclass DatabaseVersionError instead of
DatabaseOpeningError when it fails to open a database because it has an
unsupported version. DatabaseVersionError is a subclass of
DatabaseOpeningError so existing code should continue to work, but it's
now much easier to determine if the problem is that a database needs
rebuilding.
* If you try to open a flint database with an older or newer version than
flint understands, the exception message now gives the version understood,
rather than "I only understand FLINT_VERSION" (literally).
* If we fail to obtain the lock, report why in the exception message.
* Flint now compresses tags in the record and termlist tables using zlib.
* More robust code to handle the flint locking child process, in case of
unexpected errors.
* If a document was replaced more than once between flushes, the document
length wouldn't be updated after the first change.
quartz backend:
* Quartz is still supported, but use in new projects is deprecated (use Flint
instead). Quartz will be removed eventually.
* quartzcheck: Test if this is a quartz database by looking at "meta" not
"record_DB". If "record_DB" is >= 2GB and we don't have a LFS aware stat
function then stat can fail even though the file is there. Also open the
database explicitly as a Quartz database for extra robustness.
* If a document was replaced more than once between flushes, the document
length wouldn't be updated after the first change.
remote backend:
* The remote backend is now supported under Microsoft Windows.
* Open a fresh copy of the database(s) on each connection to a xapian-tcpsrv
rather than relying on being able to share a database across fork() or
between threads (which we don't promise will work).
* xapian-tcpsrv: New "--interface" option allows the hostname or address of the
interface to listen on to be specified (the default is the previous behaviour
of listening on all interfaces).
* If name lookup fails, report the h_errno code from gethostbyname() rather
than whatever value errno happens to currently have!
* Fix bugs in query unserialisation.
* The remote backend now supports all operations (get_lastdocid(), and
postlist_begin() have now been implemented).
* Currently a read-only server can be opened as a WritableDatabase (which is
a minor bug we plan to fix). In this case, operations which write will fail
and the exception is now InvalidOperationError not NetworkError.
* If a remote server catches NetworkTimeoutError then it will now only
propagate it if we can send it right away (since the connection is
probably unhappy). After that (and for any other NetworkError) we now
just rethrow it locally to close the connection and let it be logged if
required.
* The timeout parameter to RemoteDatabase wasn't being used, instead the
client would wait indefinitely for the server to respond.
* A timeout of zero to the remote backend now means "never timeout". This
is now the default idle timeout for WritableDatabase (the connection
timeout default is now 10 seconds, rather than defaulting to the idle
timeout).
* Fix handling of the document length in remote termlists.
* The remote backend now checks when decoding serialised string that the
length isn't more than the amount of data available (bug#117).
* The remote backend now handles the unique term variants of delete_document
and replace_document on the server side.
* The RSet serialisation now encodes deltas between docids (rather than the
docids themselves) which greatly reduces the size of the encoding of a
sparse RSet for a large database.
* We now encode deltas between term positions when sending data after calling
positionlist_begin() on a remote database.
* When using a MatchDecider with remote database(s), don't rerun the
MatchDecider on documents which a remote server has already checked.
* Apply the "decreasing weights with remote database" optimisation which we use
in the sort_by_relevance case in the sort_by_relevance_then_value case too.
* We now throw NetworkError rather than InternalError for invalid data received
over the remote protocol.
* We now close stderr of the spawned backend program when using the "prog" form
of the remote backend. Previously stderr output would go to the client
application's stderr.
muscat36 backend:
* Support for the old Muscat 3.6 backends has been completely removed. It's
still possible to convert Muscat 3.6 databases to Xapian databases by
building 0.9.10 and using copydatabase to create a quartz database, which can
then be read by 1.0.0 (and converted to a flint database using copydatabase
again).
build system:
* We've added GCC visibility annotations to the library, which when using GCC
version 4.0 or later reduce the size and load time of the library and
increase the runtime speed a little. Under x86_64, the stripped library is
6.4% smaller (1.5% smaller with debug information).
* configure: If using GCC, use -Bsymbolic-functions if it is supported
(it requires a very recent version of ld currently). This option reduces the
size and load time of the shared library by resolving references within the
library when it's created.
* We automatically define _FORTIFY_SOURCE in config.h if GCC is in use
and it's not already set (you can override this as documented in INSTALL).
This adds some checking (mostly at compile time) that important return
values aren't ignored and that array bounds aren't exceeded.
* `./configure --enable-quiet' already allows you to specify at configure time
to pass `--quiet' to libtool. Now you can override this at make-time by
using `make QUIET=' (to turn off `--quiet') or `make QUIET=y' (to turn on
`--quiet').
* In non-maintainer mode, we don't need the tools required to rebuild some of
the documentation, so speed up configure by not even probing for them in
this common case.
* The makefiles now use non-recursive make in all directories except "docs" and
"tests". For users, this means that the build is faster and requires less
disk space (bug#97).
* configure: Add proper detection for SGI's C++ (check stderr output of
"CC -v") and automatically pass -ptused in CXXFLAGS for xapian-core and any
applications using xapian-config --cxxflags since it seems to be required to
avoid template linking errors.
* XO_LIB_XAPIAN now checks for the case where XAPIAN_CONFIG wasn't specified
and xapian-config wasn't found, but the library appears to be installed -
this almost certainly means that the user has installed xapian-core from
a package, but hasn't installed the -dev or -devel package, so include
that advice in the error message.
* `./configure --with-stlport-compiler' now requires a compiler name as an
argument.
* configure: Disable probes for f77, gcj, and rc completely by preventing
the probe code from even appearing in configure - this reduces the size of
configure by 209KB (~25%) and should speed it up significantly.
* configure: Suppress more unhelpful warnings and "remarks" for HP's aCC, and
turn on "+wlint", which seems useful.
* A number of cases of unnecessary header inclusions have been addressed,
which should speed up compilation (fewer headers to parse when compiling
many source files). This also reduces dependencies within the source code,
and thus the number of files which need to be rebuilt when a header is
changed.
* configure: Cache the results of some of our custom tests.
documentation:
* The documentation has all been updated for changes in Xapian 1.0.0.
* Many of the documentation comments in the API headers (which are collated
using doxygen to generated the API reference) have been improved, and some
missing ones added. Also, internal classes, members, and methods are now all
marked as such so that none should appear in the generated documentation. In
particular, the class inheritance graphs should be a lot clearer. A few other
problems have also been addressed.
* docs/internals.html: New separate index page for the "internal"
documentation.
* docs/deprecated.html: New document describing deprecation policy. This
includes lists of features which have been removed, or which are deprecated
and scheduled for removal, along with suggested replacements.
* docs/admin_notes.html: New document introducing Xapian for sysadmins.
* docs/termgenerator.html: New document describing the new term generation
strategy implemented by the Term::Generator class.
* docs/bm25.html,docs/intro_ir.html: These have been overhauled to make them
fit better with the rest of the documentation, and with Xapian itself.
* docs/overview.html: Fixed links to error classes in generated API
documentation.
* HACKING,INSTALL: Many updates and improvements.
* xapian-config: Improve --version output so that help2man produces a better
man page.
* PLATFORMS: Remove reports for 0.7.* and demote reports for 0.8.* to "older
reports" status. All SF compilefarm machines are now "no longer available",
so update the symbols and key to reflect this. Update with recent success
reports from the tinderbox and other sources.
* AUTHORS: Thanks several bug reporters I missed before, as well as recent
contributors.
* docs/code_structure.html now looks nicer and includes links to
svn.xapian.org.
* docs/remote_protocol.html: Fixed several typos and other errors, and document
all the new messages.
* We no longer include docs/apidoc/latex/* in the xapian-core tarballs since
it's just useless bloat.
examples:
* delve:
+ Report the exception error string if open a database fails.
+ Rename "-k" to "-V" since "keys" were renamed to "values" long ago. Keep
"-k" as an alias for now, but don't advertise it. Add handling so "-V3"
shows value #3 for every document in the database.
+ No longer stems terms by default. Add "-s/--stemmer" option to allow a
stemmer to be specified.
* quest: Add "--stemmer" option to allow stemming language to be set, or
stemming to be disabled.
portability:
* Fix compilation with GCC 4.3 snapshot.
* Always use pid_t not int for holding a process id, and use AC_TYPE_PID_T to
`#define pid_t int' if <sys/types.h> doesn't provide pid_t.
* Pass the 4th parameter of setsockopt() as char* which works whether the
function actually takes char* or void* (since C++ allows implicit conversion
from char* to void*).
* Most warnings in the MSVC build have been fixed.
* Refactored most portability workarounds into safeXXXX.h headers.
* Building for mingw in a cygwin environment should work better now.
packaging:
* RPM spec file:
+ Updated for the changes in this release.
+ ChangeLog.examples is now packaged.
debug code:
* Rename --enable-debug* configure options - conflating the options to "turn on
assertions" and "turn on logging" is confusing. `--enable-debug[=partial]'
becomes `--enable-assertions'; `--enable-debug-verbose' becomes
`--enable-log' and `--enable-debug=full' becomes `--enable-assertions
--enable-log'. For now the old options give an error telling you the new
equivalent.
* Debug logging from expand is now all of type EXPAND (some was of types
MATCHER and WTCALC before).
* Hook the debug tracing in the lemon generated parser into Xapian's debug
logging framework.
* New assertion types: AssertEqParanoid() and AssertNeParanoid().
* Retry write() if it fails when writing a debug log entry to ensure to avoid
the risk of a partial write.
Xapian-core 0.9.10 (2007-03-04):
API:
* Fix WritableDatabase::replace_document() not to lose positional information
for a document if it is replaced with itself with unmodified postings.
* QueryParser: Add entries to the "unstem" map for prefixed boolean filters
(e.g. type:html).
* Fix inconsistent ordering of documents between pages with
Enquire::set_sort_by_value_then_relevance (fixes bug#110).
testsuite:
* Workaround apparent bug in MSVC's ifstream class.
flint and quartz backends:
* Fix possible double-free after a transaction fails.
* Fix code for recovering from failing to open a table for reading
mid-modification. If modifications are so frequent that opening for reading
fails 100 times in a row, throw DatabaseModifiedError not
DatabaseOpeningError.
* Don't call std::string::append(ptr, 0) when ptr may be uninitialised
or NULL (rather suspect, and reported to cause SEGV-like behaviour with
MSVC).
* Ensure both_bases is set to false if we don't have both bases when
opening a table using an existing object.
* Use MS Windows API calls to delete files and open files we might want to
delete while they are still open (i.e. the flint and quartz btree base
files). This fixes a problem when a writer can't discard an old revision at
the exact moment a reader is opening it (bug #108).
remote backend:
* Fix WritableDatabase::has_positions() to refetch the cached value if it
might be out of date.
* Fix incorrect serialisation of a query with non-default termpositions.
inmemory backend:
* If replace_document is used to set the docid of a newly added document which
has previously existed, ensure we mark that document as valid.
documentation:
* Assorted improvements to API documentation.
* docs/Makefile.am: The larger pool_size we set in 0.9.9 for building
sourcedoc.pdf was a bit marginal, so increase it further.
* docs/stemming.html,docs/install.html: Correct 2 references to "CVS" to say
"SVN" instead.
* HACKING: Update the release checklist.
portability:
* Fix flint and quartz to allow 2GB+ B-tree tables when compiling with MSVC.
packaging:
* RPMs: Remove "." from end of "Summary:". Package the new man page for
xapian-progsrv.
Xapian-core 0.9.9 (2006-11-09):
testsuite:
* Use popen() to run xapian-tcpsrv and wait for "Listening..." before returning
rather than just sleeping for 1 second and hoping that's enough.
* If we can't start xapian-tcpsrv because the port is in use, try higher
numbered ports.
remote backend:
* xapian-tcpsrv: If the port requested is in use, exit with code 69
(EX_UNAVAILABLE) which is useful if you're trying to automate launching of
xapian-tcpsrv instances.
* xapian-tcpsrv: Output "Listening..." once the socket is open and read for
connections (this allows the testsuite to wait until xapian-tcpsrv is ready
before connecting to it).
* xapian-progsrv: Now supports --help, --version, and has a man page. Fixes
Bug #98.
* Turn on TCP_NODELAY for the TCP variant of the remote backend which
dramatically improves the latency of operations on the database.
build system:
* internaltest: Disable serialiselength1 and serialisedoc1 when the remote
backend is disabled to fix build error in this case.
* Move libbtreecheck.la from testsuite/ to backends/quartz/.
* Move the testsuite harness from testsuite/ to tests/harness/.
documentation:
* Ship our custom INSTALL file rather than the generic one from autoconf which
we've accidentally been shipping instead since 0.9.5.
* docs/Makefile.am: Building sourcedoc.pdf needs a larger pool_size now we're
using pdflatex.
* HACKING: Update debian packaging checklist.
* PLATFORMS: Updated with results from tinderbox.
portability:
* Create "safefcntl.h" as a replacement for <fcntl.h> instead of using
"utils.h" for this purpose, since "utils.h" pulls in many other things we
often don't need.
packaging:
* RPMs: Prevent binaries getting an rpath for /usr/lib64 on FC6.
Xapian-core 0.9.8 (2006-11-02):
API:
* QueryParser: Don't require a prefixed boolean term to start with an
alphanumeric - allow the same set of characters as we do for the second
and subsequent characters.
flint backend:
* Only force a flush on WritableDatabase::allterms_begin() if there are
actually pending changes.
quartz backend:
* Only force a flush on WritableDatabase::allterms_begin() if there are
actually pending changes.
* quartzcheck: Avoid dying because of an unhandled exception if the Btree
checking code finds an error in the low-level Btree structure. Add a
catch for any other unknown exceptions.
build system:
* When building with GCC, turn on warning flag -Wshadow even when not in
maintainer mode (provided it is supported by the GCC version being used).
* testsuite/backendmanager.cc: Fix compilation when valgrind is detected by
configure.
* If generating apidoc.pdf fails, display the logfile pdflatex generates since
that is likely to show what failed.
documentation:
* Produce a PDF for apidoc rather than PostScript, since the PDF is smaller,
plus at least as easy to print and easier to view for most users. Use
pdflatex to generate the PDF directly rather than going via a DVI file which
apparently produces a better result and also avoids problems on some Linux
distros where latex is a symlink to pdfelatex (bug#81, bug#95).
* HACKING: Mention automake 1.10 is out but we've not tested it yet.
* HACKING: Add entries to release checklist: make sure new API methods
are wrapped by the bindings, and that bug submitters are thanked.
* HACKING: Note that on Debian, tetex-extra is needed for
fancyhdr.sty.
* HACKING: Note that dch can be used to update debian/changelog.
* docs/code_structure.html: Document backends/remote.
* PLATFORMS: Update from tinderbox.
portability:
* configure: When checking if we need -lm, don't use a constant argument to
log() as the compiler might simply evaluate the whole expression at compile
time.
* configure: Redhat's GCC 2.96 doesn't support -Wundef even though real GCC
version before and after it do!
* configure: Avoid use of double quotes in double-quoted backticks since
it causes problems on some platforms.
* backends/flint/flint_io.cc: Fix compilation on windows (needs to
#include "safewindows.h" to get definition of SSIZE_T).
* Fix our implementation of om_ostringstream to compile so that the build
works once more on older compilers without <sstream> (regression probably
introduced in 0.9.7).
packaging:
* xapian.spec: Package xapian-progsrv.
Xapian-core 0.9.7 (2006-10-10):
API:
* QueryParser:
+ Allow a distance to be optionally specified for NEAR - e.g.
"cats NEAR/3 dogs" (bug#92).
+ Implement "ADJ" operator - like "NEAR" except the terms must
appear in matching documents in the same order as in the query.
+ Fix bug in how we handle prefixed quoted phrases and prefixed brackets.
+ Fix parsing of loved and hated prefixed phrases and bracketted expressions.
+ Fix handling of stopwords in boolean expressions.
+ Don't ignore a stopword if it's the only query term.
* Document::add_value() failed to replace an existing value with the same
number, contrary to what the documentation says (bug #82).
* Enquire::set_sort_by_value(): Don't fetch the document data when fetching
the value to sort on. Simple benchmarking showed this to speed up sort by
value by a factor of between 3 and 9!
* Implement transactions for flint and quartz. Also supported are "unflushed"
transactions, which provided an efficient way to atomically group a number
of database modifications.
* The Xapian::Error and Xapian::ErrorHandler classes have been reimplemented.
The new versions have better, clearer documentation comments and are cleaner
internally.
* Change how doubles are serialised by TradWeight, BM25Weight, and in the
remote backend protocol. The new encoding allows us to transfer any double
value which can be represented by both machines precisely and compactly.
testsuite:
* Add targets "check-flint", "check-quartz", and "check-remote" in tests and at
the top level which run the subset of tests which test the respective backend.
* apitest: Run tests on flint if flint is enabled, rather than if quartz is
enabled!
* apitest: Speed up deldoc4 when run in verbose mode - some stringstream
implementations are very inefficient when the string grows long.
* Turn on GLIBCXX_FORCE_NEW when running tests under valgrind to stop the GNU
C++ STL from using a pooling allocator. This helps make velgrind's leak
tracking more reliable.
* Probe for required valgrind logging options at configure time rather than
when running the test program. This saves about 2 seconds per test program
invocation.
* Fix testsuite harness to show valgrind output when a test fails (when running
under valgrind in verbose mode). This had stopped working, probably due to
changes in valgrind 3.
* internaltest: Check that the destructor on a temporary object gets called
at the correct time (Sun C++ deliberately gets this wrong by default, and it
would be good to catch any other compilers which do the same).
* apitest: When running tests on the remote backend and running under valgrind,
run xapian-tcpsrv and xapian-progsrv under valgrind too to avoid issues
with the precision of doubles (bug#94).
flint backend:
* Retry on EINTR from fcntl or waitpid when creating or releasing the flint
lock file.
* xapian-compact: Add --blocksize option to allow the blocksize to be set
(default is 8K as before.)
* WritableDatabase::replace_document(did, doc) was double-incrementing the
"changes" counter when document did didn't exist so it would flush twice
as often - fixed.
* WritableDatabase::postlist_begin(): Remove forced flush when iterating the
posting list of a term which has modified postings pending.
quartz backend:
* quartzcompact: Add --blocksize option to allow the blocksize to be set
(default is 8K as before.)
* WritableDatabase::replace_document(did, doc) was double-incrementing the
"changes" counter when document did didn't exist so it would flush twice
as often - fixed.
remote backend:
* Most of the remote backend has been rewritten. It now supports most
operations which a local database does (including writing!), the protocol
used is more compact, and a number of layers of classes have been eliminated
and the sequences of method calls simplified, so the code should be easier to
understand and maintain despite doing more. A number of bugs have been fixed
in the process.
* xapian-tcpsrv: Report errno if we catch a Xapian::Error which has it set.
* xapian-tcpsrv: Fix memory leak in query unserialisation.
build system:
* Now using autoconf 2.60 for snapshots and releases. Also now using a
libtool patch which improves support for Sun C++'s -library=stlport4 option.
* configure: Fix generation of version.h to work with Solaris sed.
* automake adds suitable rules for rebuilding doxygen_api_conf and
doxygen_source_conf, so remove our less accurate versions. Also fix
dependencies for regenerating the doxygen documentation, and make the
documentation build work with parallel make.
* Make use of the dist_ prefix to avoid having to list files in EXTRA_DIST as
well as in *_DATA and man_MANS.
* Removed a few unused #include-s.
* include/xapian/error.h: Add hook to allow SWIG bindings to be built using
GCC's visibility support.
* configure: Turn on automake's -Wportability to help ensure our Makefile.am's
are written in a portable way.
* configure: Disable probing and short-cut tests for a FORTRAN compiler. We
don't use one, but current libtool versions always check for it regardless.
* xapian-config: Prune -L/usr/lib from output of `xapian-config --libs'.
documentation:
* docs/scalability.html: quartzcompact and xapian-compact now allow you to set
the blocksize, so there's no need to use copydatabase if you want to migrate
a database to a larger blocksize. Mention gmane. Other minor tweaks.
* Eliminate "XAPIAN_DEPRECATED" from generated documentation.
* PLATFORMS: Added success report for Nexenta (alpha 5), MSVC, and sparc linux.
Updated other results from tinderbox.
* Add links to the wiki from README and the documentation index.
* docs/overview.html: Add discussion of uses of terms vs values.
* docs/overview.html: Rewrite the section on Xapian::Document to remove some
very out-of-date information and make it clearer.
* include/xapian/database.h: Note that automatically allocated document IDs
don't reuse IDs from deleted documents.
* include/xapian/enquire.h: Note that "set_sort_by_relevance" is the default
setting.
* docs/queryparser.html,include/xapian/queryparser.h: Add note that
FLAG_WILDCARD requires you to call set_database.
* HACKING: Add some advice regarding debugging using -D_GLIBCXX_DEBUG,
valgrind, and gdb.
* HACKING: Give URL to Alexandre Duret-Lutz's autotools tutorial, which is much
more up-to-date than the "goat book".
* HACKING: Update and expand the information about the debian packaging.
* Add missing dir_contents files.
portability:
* xapian/version.h: Add a check that _GLIBCXX_DEBUG is set compatibly if we're
compiling with GNU C++ 3.4 or newer.
* Add configure check to see if "-lm" is needed to get maths functions since
newer versions of Sun's C++ compiler seem to require this.
* Automatically put Sun's C++ compiler into "ANSI C++ compliant library" mode
(using -library=stlport4). This allows us to remove most of the special
case bits of code we've accumulated for just this compiler, which improves
maintainability.
* Sun's C++ compiler implements non-standards-conforming lifetimes for
temporary objects by default. This means database locks don't get released
when they should, so we now always pass "-features=tmplife" for Sun C++
which selects the behaviour specified by the C++ standard.
Xapian-core 0.9.6 (2006-05-15):
API:
* Rename Xapian::xapian_version_string() and companions to
Xapian::version_string(), etc. Keep the old functions as aliases which are
marked as deprecated.
* QueryParser: Add rules to handle a boolean filter with a "+" in front (such
as +site:xapian.org).
testsuite:
* queryparsertest: Add another prefix testcase to improve coverage.
build system:
* configure: Simpler check for VALGRIND being set to empty value.
* include/Makefile.am: Add xapian/version.h.timestamp as a dependency on
all-local so that xapian/version.h actually gets regenerated when required.
* Eliminate XAPIAN_BUILD_BACKEND_* from config.h and just use
XAPIAN_HAS_*_BACKEND from xapian/version.h instead.
documentation:
* remote_protocol.html: Document keep-alive messages.
* xapian/enquire.h: Remove bogus documentation for a parameter which doesn't
exist.
* PLATFORMS: Added a summary. Updated and pruned old entries for which we
have a newer close match.
* HACKING: Expand on details of what's required when changing Xapian (discuss
documentation requirements, and more on why feature tests are vital).
* HACKING: Update section on building debian packages.
portability:
* The tarball is generated with a patched version of libtool 1.5.22 which
fixes libtool bugs on HP-UX and some BSD platforms.
* configure: Fix problems with test for snprintf which affected cygwin, and
possibly some other platforms.
* configure: Tweak version.h generation to cope with CXXCPP putting carriage
returns into its output as can happen on cygwin.
* Fix renaming of "iamflint.tmp" for MS Windows where you can't rename an open
file.
* Fixed MSVC7 warnings.
* Added workaround for newlib header bug.
Xapian-core 0.9.5 (2006-04-08):
API:
* QueryParser:
+ Fix FLAG_BOOLEAN_ANY_CASE to really allow any case combination - previously
it only allowed all uppercase or all lowercase.
+ Fix QueryParser's handling of terms with trailing "#", "+", or "-" when
set_database has been called and the term doesn't exist in the database
with the suffix.
* Add mechanism to allow xapian-bindings to override deprecation warnings so
we can continue to wrap deprecated methods without lots of warnings.
* Move Enquire::get_matching_terms_end() and Document::termlist_end() inline in
header.
* Database::termlist_begin(): Eliminate the MultiTermList wrapper in the common
case where we're only dealing with a single database.
* Fix TermIterator::positionlist_begin() to work on TermIterator from
Database::termlist_begin(). Make TermList::positionlist_begin() pure
virtual and put dummy implementations in BranchTermList and other
subclasses which can't (or don't) implement it. This makes it hard to
accidentally fail to implement it in a backend's TermList subclass.
* TermIterator::positionlist_begin() with the remote backend now throws
UnimplementedError instead of InvalidOperationError.
* Implement Enquire::set_sort_by_relevance_then_value().
testsuite:
* Added missing feature test for QueryParser::FLAG_BOOLEAN_ANY_CASE.
* remotetest: Check mset size in tcpmatch1.
flint backend:
* xapian-compact: Fixed segfault from passing an unknown option (e.g.
"xapian-compact --foo").
quartz backend:
* quartzdump,quartzcompact: Fixed segfault from passing an unknown option
(e.g. "quartzdump --foo").
remote backend:
* xapian-tcpsrv: Don't perform a name lookup on the IP address which an
incoming connection is from as that could easily slow down the search
response - instead just print the IP address itself if output is verbose.
* xapian-tcpsrv: Allow up to 5 connections in the listen queue instead of just
one.
build system:
* Removed unused code from the matcher and the remote, quartz, and flint
backends.
documentation:
* All installed binaries now support --help and --version and have a man page
(which is generated using help2man).
* docs/overview.html: Bring up to date.
* docs/remote_protocol.html: Document messages for requesting and sending a
termlist and a document.
* PLATFORMS, AUTHORS: Updated.
* INSTALL: Improve wording.
* HACKING: Note that we now use a lightly patched version of libtool 1.5.22.
* HACKING: aclocal is part of automake, not autoconf.
portability:
* Added some tweaks to help support compilation with MSVC.
packaging:
* RPMs: package the new man pages.
debug code:
* Add missing spaces in some debug output.
Xapian-core 0.9.4 (2006-02-21):
API:
* Flag deprecated methods such that the compiler gives a warning, for compilers
which support such a feature (most notably GCC >= 3.1).
* Correct typo in name of definition of function xapian_revision().
testsuite:
* Updated uses of deprecated methods in the testsuite.
build system:
* xapian-config: Set exec_prefix and prefix at top of script so that
xapian-config works after xapian-core is installed.
documentation:
* Add documentation comment for Enquire::set_sort_by_value_then_relevance().
* README: Add pointer to HACKING. Change "CVS access" to "SVN access".
* PLATFORMS: Updated from tinderbox.
* COPYING: Update second occurrence of old FSF address.
Xapian-core 0.9.3 (2006-02-16):
API:
* Added 4 functions to report version information for the library version being
used (which may not be the same as that compiled against if shared libraries
are in use): xapian_version_string(), xapian_major_version(),
xapian_minor_version(), xapian_revision().
* Xapian::QueryParser:
+ Fix handling of "+" terms in a query when the default query operator is
AND. Added regression test for this.
+ Added "AND NOT" as a synonym for "NOT". Added feature tests for this.
* Fix prototype for ESet::operator[] to take parameter of type termcount
instead of doccount (doccount and termcount are both typedefs to the same
type so this really just makes the prototype more consistent).
* Xapian::Stem: Check for malloc and calloc failing to allocate memory and
throw an exception. Richard has fixed this upstream in snowball, so this is
a temporary fix until we import a new version of snowball.
* Xapian::Database: Trying to open a database for reading which doesn't exist
now fails with DatabaseOpeningError instead of FeatureUnavailableError.
Added regression test for this.
* Add Stopper::get_description() and SimpleStopper::get_description().
testsuite:
* Fixed testsuite harness to work with valgrind on 64 bit platforms.
* Merged the "running tests" section of docs/tests.html into the similar
section in HACKING, and make docs/tests.html refer the reader to HACKING for
more information.
* Tidied and enhanced environmental variables which the test suite harness
recongnises:
+ OM_TEST_BACKEND: Removed support since the "-b" switch to apitest allows
you control which backend is used, making OM_TEST_BACKEND pretty much
redundant.
+ XAPIAN_SIG_DFL: Renamed to XAPIAN_TESTSUITE_SIG_DFL.
+ XAPIAN_TESTSUITE_OUTPUT: New environmental variable to control use of
ANSI colour escape sequences in test output (set to "plain" to disable
them, unset, empty, or "auto" to check if stdout is a tty, or anything
else to force colour).
flint backend:
* xapian-compact: Added "--multipass" option to merge postlists in pairs or
triples until all are merged. Generally this is faster than an N-way merge,
but it does require more disk space for temporary files so it's not the
default.
quartz backend:
* quartzcheck: If the database is too broken to open, emit a warning message
and bump the error count.
build system:
* Now generate snapshots and releases with automake 1.9.6 (was 1.9.5) and
libtool 1.5.22 (was 1.5.18).
* configure: If not cross-compiling, try to actually run a test program built
with the C++ compiler, not just link one.
* configure: Fix to actually skip the check for valgrind if VALGRIND is set to
an empty value.
* configure: Add sanity check for MS Windows that "find" is Unix-like find, not
MSDOS-like.
* Fix conditional compilation of flint backend - it was being disabled when
quartz was, not when flint was supposed to be.
documentation:
* INSTALL,README: Updated.
* Give pointer to replacements for the deprecated Enquire sorting methods
in the doxygen collated documentation.
* PLATFORMS: Added success reports for ppc64 linux and Fedora Core 4. Updated
from the tinderbox.
* HACKING: Note platforms valgrind now has solid support for; Improve
phrasing in a few places.
* Upgrade to using doxygen 1.4.6 for generating API documentation.
* Change title of the "full source" documentation to "Internal Source
Documentation" rather than "Full source documentation" to make it
clearer it's only useful if you want to modify Xapian itself.
* Fix documentation comments for the values of QueryParser::feature_flag so
doxygen actually pulls out the documentation for them. Add documentation for
the parameters of QueryParser::parse_query().
* queryparser.html: Document wildcards.
portability:
* Fix compilation with GCC 4.0.1 and later (need to forward declare class
InMemoryDatabase) (bug #69).
* Fix compilation under cygwin (broken in 0.9.2).
* Don't pass NULL for the second parameter of execl() - the Linux man page
says execl takes "one or more pointers to null-terminated strings". Also
cast the NULL to (void*) to avoid "missing sentinel" warning from GCC4.
* Use snprintf instead of sprintf where available (we were attempting to
do this in some places before, but the configure test was broken so
sprintf was always being used).
* Enable more warnings under aCC and fix minor issues highlighted. Suppress
"Entire translation unit was empty" warning which isn't useful to us.
* Write top-bit set characters in the source using \xXX notation to avoid
warnings from Intel's C++ compiler.
* configure: TYPE_SOCKLEN_T fails hard, so only run it if we've successfully
run other socket tests.
* queryparser/accentnormalisingitor.h: #include <limits.h> for CHAR_BIT.
* bin/xapian-compact.cc: Fix printf type mismatch on 64 bit platforms.
* Replace pair<bool, string> with a simple class BoolAndString - the pair
results in a 4328 byte symbol on HP-UX which gets truncated (to 4000 bytes).
Most likely this is harmless, but it causes a warning.
* configure: Disable flint backend by default if building for djgpp or msdos.
* xapian-config: Previously when linking without libtool we've always thrown
in dependency_libs, even though only some platforms need it (because it's
generally pretty harmless). However some Linux distros have an unhelpful
policy of not packaging .la files, so libxapian.la isn't available to
extract dependency_libs from. Linux is a platform which doesn't require
dependency_libs to be explicitly linked, so extend xapian-config to not
pull in dependency_libs if libtool's link_all_deplibs_CXX=no.
* xapian-config: If the current platform needs dependency_libs and
libxapian.la's dependency_libs contains another .la file, transform it into a
pair of -L and -l options, and recursively expand its dependency_libs (if
any).
* Don't pass functions with C++ linkage to places wanting pointers to functions
with C linkage. So far this has worked for us, but it causes warnings with
some compilers, and may not be portable.
* Compaq C++ 7.1 doesn't suffer from the problem which previously prevented
it from building Xapian. This release includes workarounds for some
oddities with errno.h support in this compiler, but currently the build
fails when trying to link a binary with the library.
packaging:
* RPM: Invoke %setup correctly in xapian.spec.
debug code:
* Add missing '#include <iostream>' when TIMING_PATCH is defined.
Xapian-core 0.9.2 (2005-07-15):
API:
* QueryParser:
+ Added optional "flags" argument to parse_query method.
+ Add flag FLAG_BOOLEAN_ANY_CASE which tells the QueryParser that boolean
operators such as "AND", "OR", and "NEAR" should be recognised even if
they aren't fully capitalised (so "and", "And", "aNd", etc will work too).
+ Add flag FLAG_WILDCARD which tells the QueryParser to allow right
truncation e.g. "xap*".
+ Fixed to handle "-site:microsoft.com" where site is a boolean prefix.
Added testcases for this.
testsuite:
* The test harness was incorrectly creating a quartz database when a flint one
was requested, which meant tests weren't being run against flint and so it
had bugs rendering it pretty much unusable.
* Added regression test longpositionlist1 (to check encoding/decoding a long
position list, which flint had problems with).
flint backend:
* Bumped format version number.
* Added new "xapian-compact" program which can compact and merge flint
databases in a similar way to how quartzcompact does for quartz databases.
* Fixed to auto-detect database type when opening an existing Flint database
as a WritableDatabase.
* The code to encode the position list size, first entry, and last entry
didn't match the code to decode them! Reworked both to match, using a
slightly more compact encoding.
* We were failing to append "DB" to the path when opening a table for reading.
* Rewrite of FlintAllTermsList with several fewer member variables. The
rewrite fixes a bug too - the old version wasn't ignoring the metainfo
entry which is now in the postlist table.
* It seems we need to explicitly kill the child process used for locking.
Otherwise when we have two databases locked just closing the connection
doesn't cause the child to die. I don't understand why it's needed, but this
fix is at least clean.
quartz backend:
* quartzcompact: Fix mis-repacking of keys in positionlist table when merging
several databases.
* Disable assertion in allterms iteration which is incorrect in a corner case.
This is only a problem if a termname contains zero bytes and you're using a
debug build. Add regression test test_specialterms2.
remote backend:
* Implement sorting on a value with the remote backend.
build system:
* Pass automake options to AM_INIT_AUTOMAKE rather than specifying them in
Makefile.am. This way, the version requirements for autoconf and automake
are stated close together.
* configure: -Wshadow causes false positives with GCC 3.0.4, so only enable it
for 3.1 and up.
* configure: Eliminate use of "ln -s" when generating include/xapian/version.h
since it seems to cause problems on Solaris in some setups and isn't really
necessary.
* Add dependency mechanism so version.h gets regenerated when the template is
changed.
* configure: Check for spaces in build directory, source directory, or install
prefix and die with a helpful message.
* Add dependency to generate queryparser_token.h.
* Eliminated TOP_SRCDIR and TOP_BUILDDIR - it's better to just use top_srcdir
and top_builddir directly.
* configure: Generate the list of source files to feed to doxygen by inspecting
all the Makefile.am files prior to running autoreconf rather than by using
"find" when the user runs ./configure. This speeds up configure, avoids
generating docs for random .cc and .h files which aren't part of xapian-core,
and avoids problems with picking up FIND.EXE on MS Windows.
documentation:
* Expanded explanation of the "descending docid with boolean weighting" trick
for fast date ordered searching in Enquire::set_docid_order() API docs.
* docs/intro_ir.html: Citeseer has moved, so update link.
* testsuite/testsuite.cc: Update URL for valgrind FAQ in comment.
* COPYING: Update FSF address.
* HACKING: Minor updates to release checklist.
portability:
* Assorted tweaks towards allowing compilation with MSVC.
packaging:
* xapian.spec.in: Package xapian-compact.
Xapian-core 0.9.1 (2005-06-06):
API:
* Fix SEGV on get_terms_begin() on an empty Query object. This was causing
a SEGV in Omega with an empty query.
* Put Query::get_terms_end() inline in header.
flint backend:
* Added the new "flint" backend, which starts out as a copy of the quartz
backend plus some modifications and replacements. When creating a database
without a specified backend, quartz is still used unless the environmental
variable XAPIAN_PREFER_FLINT is set to a non-empty value.
* apitest now runs tests on flint as well as the other backends.
* Removed undocumented (and hence the little used) quartz "log" feature.
* Implement new fork+fcntl+exec based locking (for Unix) and CreateFile based
locking (for Windows - currently untested).
* Move the special key/tag pair holding the total document length and doc id
high water mark from the record table to the postlist table. This means that
when appending documents, the insertion point will now always be at the end
of the record table which is more efficient. We need to jump around the
postlist table to merge postings in anyway.
* Changed metafile magic to be different from quartz, and make the metafile
version a datestamp which we'll change each time the format changes.
* Check the return value of close() when writing the metafile.
* Flint position list table now stores entries using interpolative coding
(which is significantly more compact).
quartz backend:
* quartzcheck: Fixed corner case where you couldn't check a single Btree table
which was just the DB and baseA/baseB files in a directory (Xapian doesn't
produce anything like this, but btreetest does while unit testing the
Btree code).
build system:
* Releases are now created using libtool 1.5.18 and automake 1.9.5.
* configure: Pass more -W flags to g++ (including -Wundef which caught the
getopt problem fixed in this release). Fixed new GCC warnings from these new
flags.
* Fixed a lingering DOXYGEN_HAVE_DOT reference.
* Fixed accidentally pruned #define which meant that getopt code was being
included even on systems which use glibc (on such systems, we should use
the glibc copy of the code instead).
* queryparser/queryparser.lemony: Add missing '#include <config.h>'.
documentation:
* Added missing documentation comments for a QueryParser methods added in
0.9.0.
* docs/quartzdesign.html: Removed warning that quartz is still in development.
* PLATFORMS: Updated from tinderbox.
* configure: Describe CC_FOR_BUILD in configure --help output.
* HACKING: Updated release instructions to refer to SVN, and note that release
tarballs are now built specially rather than being copies of snapshots.
Update information about the SVN tag name to use for debian files.
* HACKING: Add "email Fabrice" to the release checklist so that RPM
spec files don't lag behind.
* Fixed a few spelling mistakes.
packaging:
* xapian.spec: Remove bogus %setup line left over from when we packaged
xapian-core and xapian-examples together from separate tarballs.
debug code:
* api/omqueryinternal.cc: Fixed compilation with --enable-debug.
* common/omdebug.h: Replace C style cast with static_cast<> which reveals that
we were discarding const (harmlessly though).
Xapian-core 0.9.0 (2005-05-13):
API:
* Query objects really need to be immutable after construction (otherwise we
need a copy-on-write mechanism). To achieve this the following API changes
were required:
+ Remove Query::set_length() in favour of an optional length
parameter to Enquire::set_query().
+ Eliminated Query::set_elite_set_size() in favour of optional parameter
to constructor.
+ Eliminated Query::set_window() in favour of an optional parameter to the
constructor.
* Removed OP_WEIGHT_CUTOFF, since it doesn't actually seem to add useful
functionality over using Enquire::set_cutoff().
* MSet::max_size() (which only exists so that MSet is an STL container) now
returns MSet::size() and is inlined from the header.
* Added ESet::max_size() (for STL compatibility).
* Fixed Xapian::RSet to have the same "it's a handle" copy semantics as most of
the other classes.
* Rewritten QueryParser class:
+ Uses Lemon instead of Bison to generate the parser, which enables us to
stop using static data, so this class is at last reentrant.
+ QueryParser now uses a PIMPL style with reference counted internals like
most of the other Xapian classes.
+ Direct access to member variables has gone, which unfortunately forces an
API change (but this fixes bug #39). Instead of accessing
QueryParser::termlist member variable, iterate over terms using
Query::get_terms_begin() and get_terms_end() on the returned Query object.
Direct access to stoplist is replaced by QueryParser::get_stoplist_begin()
and get_stoplist_end(); and to unstem by get_unstem_begin() and
get_unstem_end().
+ The rewrite parses many real world examples better than the old version.
+ Now allow searches for C#, etc. If a database has been set, for this and +
and - suffixes, check if the term actually exists, and if not, ignore the
suffix if the unsuffixed term exists.
+ Added QueryParser::get_description() method (not very descriptive yet!)
+ Added backward compatibility wrapper for old version of
QueryParser::set_stemming_options().
+ xapian.h now automatically includes xapian/queryparser.h. Directly
including xapian/queryparser.h will continue to work for now, but is
deprecated.
+ QueryParser::parse_query() was failing to clear termlist and unstem
- the rewrite fixes this.
+ New QueryParser parses "term prefix:(term2 term3)" correctly.
* Added Xapian::SimpleStopper which just stops terms specified by a pair of
iterators. This should be sufficient for the majority of uses.
* Tidied up the Enquire sorting API and added ability to reverse sort on a
value. Removed sort_bands support.
* Enquire::get_description() improved.
* Methods which return an end iterator where the internals are just NULL are
now inline in the header for efficiency. Should we ever need to change an
implementation, we can easily move methods back into the library and bump the
library version suitably.
* Added Stem::operator() as preferred alternative to Stem::stem_word().
* Simplified Stem internal design by restructuring to eliminate a few internal
methods.
* BM25Weight: Avoid fetching document length if we're simply going to multiply
it by zero!
testsuite:
* Fixed TEST_EQUAL_DOUBLE to use DBL_EPSILON correctly.
* Rewrite of index_utils test harness code, removing unused and unusual
features. Data files for tests are now easier to write. These changes
also fix the bug that ^x didn't actually decode hex values correctly.
* tests/testdata/etext.txt: Stripped carriage returns.
* apitest: Extended stemlang1 to check that trying to create
a stemmer for a non-existent language throws InvalidArgumentError.
* queryparsertest:
+ Moved into tests/ subdirectory.
+ Reworked to use the standard testsuite harness.
+ Added tests for new features in the rewritten QueryParser.
quartz backend:
* quartzcheck: Now checks the structure of all the tables, not
just the postlist table, and cross-checks doclen values between
termlist and postlist tables. Recognises "--help" option. Should
now continue after an error (typically it would crash before), and
counts the number of errors found. Now exits with non-zero status
if any errors were found. More readable output.
* quartzcompact: Extended to allow merging several quartz
databases to produce a single compact quartz database. This
allows for faster building - simple index in chunks, then merge
the chunks.
* quartzcompact: Made full compaction a tiny bit more compact.
* quartzcompact: Added "fuller compaction" mode, which ignores the usual "at
least 4 items per block" rule. This achieves slightly tighter compaction,
though it's probably not advisable to use this option if you plan to update
the compacted database.
* Improved compaction by a few % in non-full case. Tighter bound on amount of
memory to reserve to read the tag into.
* Fix skip_to on an allterms TermIterator to set the current term when the
skip_to-ed term is in the database. Add regression test for this
(allterms5).
* Values are stored in sorted order so we can stop unpacking the list once we
get to one after the one we're looking for (in the case where the one we're
looking for doesn't exist).
build system:
* configure: Check that the C++ compiler can actually link a program.
AC_LANG_CXX doesn't, and if it can't find a C++ compiler it'll just return
"g++" which just leads to a later configure test failing in a confusing way.
* configure: corrected configure output of "none known for yes" or "none known
for no" to "none known for g++-3.2" or similar.
* include/xapian/version.h: Define XAPIAN_HAS_xxx_BACKEND for each backend
which is enabled. The bindings need this, and user code might find it useful
too.
* include/xapian/database.h: Don't declare the backend factory functions if the
corresponding backend has been disabled. This means that trying to use a
disabled backend will be caught at compile time rather than link time.
* configure: Enhanced valgrind test to (a) see if --tool=memcheck
is needed and (b) see if valgrind actually works (we don't want to
try to use an x86 valgrind on an x86_64 box).
* configure: Suppress 2 Intel C++ warnings which we can't easily code around,
and enable -Werror automatically with --enable-maintainer-mode.
* Clearer make rules for building Postscript doxygen docs.
* Removed some no longer used code.
* Moved a number of method definitions out of headers because they are virtual,
or too large to be sensible candidates for inlining.
* Eliminated the extra library for the queryparser - it's tiny compared to the
main library and having it around just complicates things.
* configure: We no longer need Bison, but we do need CC_FOR_BUILD to compile
Lemon with.
* Snapshot generator now appends _svn6789 or similar to the version string.
Adjusted configure and XO_LIB_XAPIAN macro to take this into account.
* configure: If any tools needed for documentation are missing
and we're in maintainer mode, die with a suitable error in
configure rather than with strange errors when building the
documentation.
* docs/Makefile.am: Explicitly set the pool_size for latex, because we
now seem to overflow the default setting on some systems.
* docs/Makefile.am: Use $(MAKE) instead of make.
documentation:
* Numerous improvements to documentation comments. Added documentation
comments for QueryParser class.
* HACKING: Added better description of how reference-counted API
classes are structured.
* HACKING: Note that '#include <limits>' isn't supported by GCC 2.95,
and other assorted minor tweaks.
* HACKING: Note how to disable use of VALGRIND on the make check
command line, or when using runtest directly.
* Updated all documentation mentions of CVS to talk about Subversion
instead.
* PLATFORMS: Updated from tinderbox and other sources.
* PLATFORMS: Added minimal testcase which fails to compile with
Compaq's C++ compiler (cxx).
* INSTALL,README: Updated.
* docs/queryparser.html: Note that + and - work on phrases and
bracketed expressions.
* docs/intro_ir.html: Corrected two errors.
* docs/stemming.html: Stemming appears to be applicable to Japanese
so don't say it isn't!
examples:
* Moved xapian-examples module to examples subdirectory of xapian-core.
* quest: Added stopword handling.
portability:
* configure: autoconf identifies Intel's C++ compiler as GCC, so probe for
which we actually have.
* Xapian will now compile cleanly with Intel C++ 8.1 on ia64 Linux and
on x86 Linux.
* backends/quartz/btree.cc: Fixed GCC compilation warning.
* tests/api_db.cc: Fixed warning from Sun's C++ compiler.
* configure: Automatically enable ANSI C++ mode for SGI's compiler
with '-LANG:std'; check that any automatically determined flags
for ANSI C++ mode actually allow us to compile a trivial program
- if they don't it probably means the compiler isn't the one we
were expecting, but one installed with the same name, so we now
drop the flags in this case.
* The compile on IRIX with SGI compiler is now warning free, apart from two
"unused variable" warnings in Snowball generated code.
* On WIN32, don't define NOMINMAX if it is already defined.
packaging:
* xapian.spec: Don't say "%makeinstall" in a comment since rpm
tries to expand it and explodes.
* xapian.spec: '/usr/share' -> '%{_datadir}'.
* xapian.spec: Put the .so in the -devel package (it's only useful
for linking to - the .so.* files are all that's needed at runtime).
debug code:
* net/socketserver.cc: Fixed typo in debug code.
Xapian-core 0.8.5 (2004-12-23):
quartz backend:
* quartzcompact: When full_compaction is enabled, don't fill the last few bytes
of a block if that would mean we needed an extra item and the overhead for
that item would use up more of the next block than we save. This reduces the
table size after full compaction by up to 0.2% in my tests!
* quartzcompact: Tables sizes will always be a whole number of Kbytes, since
the blocksize is, so report the size in K. Also report the change in size as
well as the before and after sizes.
* quartzcompact: Added missing '#include <config.h>' so that largefile support
is enabled when we call stat() and we report compression statistics for
tables > 2G.
* quartzcompact: Added --no-full / -n option to disable full compaction. This
may be useful if you want to update the database after compacting it (need to
test to see if this option is actually useful).
* Renamed Btree::compress() to Btree::compact() for consistency with
"full_compaction" and "quartzcompact". Also, "compress" is confusing since
we use that term in the zlib patch.
build system:
* xapian-config: Fixed --libs output to not include libxapian.la.
* Added missing '#include <config.h>' to various .cc files (the omissions were
probably harmless, but config.h should be included as the first thing any
source file does).
documentation:
* Minor updates.
packaging:
* RPM spec file: %makeinstall puts the wrong paths in the .la files so use
"make DESTDIR=... install" instead.
debug code:
* Fixed to build with AssertParanoid enabled.
Xapian-core 0.8.4 (2004-12-08):
API:
* Added constructors to Database and WritableDatabase which fulfil the role
that the Auto::open() factory functions currently do. Auto::open() is
now deprecated.
* Removed the ability to write a Xapian object to an ostream directly, as
it's little used and potentially dangerous ('cout << mset[i];' will
compile, but you almost certainly meant 'cout << *mset[i];'). You can
get the old effect by writing 'cout << obj->get_description();' instead
of 'cout << obj;'. Note that including xapian.h no longer pulls in
fstream, which code may have been implicitly relying on - if this is
a problem add '#include <fstream>' after '#include <xapian.h>'.
* QueryParser: Be smarter about when to add a ':' when adding a term prefix.
* BoolWeight::unserialise() now returns BoolWeight*, and similarly for
TradWeight and BM25Weight. BoolWeight::clone() now returns BoolWeight *.
* If a database contains no positional information, change NEAR and PHRASE
queries into AND queries (as otherwise they'd return no matches at all)
(bug #56). Added feature test phraseorneartoand1.
* Renamed BM25 parameters to match standard naming in papers and elsewhere
(A->k3, B->k1, C->k2, D->b), eliminated the extra factor of 2 which our C
had, and reordered the parameters to k1, k2, k3. This is an incompatible API
change for BM25Weight(), so if you are using custom parameters for BM25
you'll need to update your code.
* During query expansion, if we estimate the term frequency, ensure it has a
sane value (>= r and <= N - R + r) rather than bodging around the problem
later on.
* TradWeight, BM25Weight: termfreq is always exact for matching (we only
approximate it for query expansion) so replace code to work around bad
approximations with Assert() to make sure this never happens.
testsuite:
* runtest: Enhanced to allow it to run test programs under valgrind and other
tools (gdb was already supported).
* runtest: now works with valgrind 2.1.2 and later (valgrind's --logfile-fd
option was renamed to --log-fd).
* runtest: Allow VALGRIND environmental variable to override the value we got
from configure.
* Added a dependency so "make check" regenerates runtest if necessary.
* The test programs now point the user to the runtest script if srcdir can't
be guessed. And they no longer look for the test program in the tests
subdirectory of the current directory.
* btreetest: Fixed memory leaks in test_cursor1 (the testcase itself was
causing the leak, not the library).
* apitest: Fixed mset_range_is_same() and mset_range_is_same_weights() helper
functions which were only comparing the first item in the range. Thankfully
the tests still all pass so this wasn't hiding any bugs.
* apitest: A modified version of changequery1 fails - the bug is obscure and
subtle, and the fix is tricky so set the modified test to SKIP for now.
* apitest: Added test_weight1 which tests the built-in Xapian::Weight
subclasses and test_userweight1 which tests user defined weighting schemes
(bug#8).
* quartztest: Test with DB_CREATE_OR_OPEN in writelock1.
quartz backend:
* An interrupted update could cause any further updates to fail with "New
revision too low" because the new revision was being calculated incorrectly -
fixed (bug#55).
* Fixed Bcursor::del() which didn't always leave the cursor on the next item
like it should. This may have been causing problems when trying to remove
the last references to a particular term.
* Fixed ultra-obscure bug in the code which finds a key suitable to
discriminating between two blocks in a B-tree branch (discovered by reading
the code). Comparing the keys didn't consider the length of the second, so
it is possible the code would miscompare. But in reality this is extremely
unlikely to happen, and even then would probably just mean that the
discriminating key wouldn't be as short as it could be (wasting a few bytes
but otherwise harmless).
* If we're removing a posting list entirely, often there will only be one
chunk, so avoid creating a Bcursor in this case.
* Simplified Btree::compare_keys() by removing the last case which was dead
code as it was covered by an earlier case.
* Check that any user specified block size is a power of 2. If the block
size passed is invalid, use the default of 8192 rather than throwing an
exception.
* Started to refactor the Btree manager by introducing Item and Key classes
which take care of handling the on-disk format, and eliminated duplicated
tag reading code in Btree and Bcursor. These changes will pave the way for
improvements to the on disk format.
* Applied the Quartz "DANGEROUS" patch, but disabled for now. This way it
won't keep being broken by changes to the code.
* quartzcompact: Added --help and --version; Check that the source path and
desitination path aren't the same; Report each table name when we start
compacting it, and some simple stats on the compaction achieved when we
finish.
muscat36 backend:
* Removed a default parameter value from one variant of
Xapian::Muscat36::open_db() so that there's only one candidate for
open_db(string).
build system:
* xapian-config: If flags are needed to select ANSI mode with the current
compiler, then make xapian-config --cxxflags include them so that Xapian
users don't have to jump through the same hoops we do.
* xapian-config: Added --swigflags option for use with SWIG.
* XO_LIB_XAPIAN now passes ac_top_srcdir to xapian-config which uses it
(if provided) to say "configure.ac" or "configure.in" rather than
"configure.in (or configure.ac)" in the "Add AC_PROG_LIBTOOL"
error message.
* Cleaned up the build system in a few places.
* Removed a few totally unneeded header includes.
* Moved a number of functions and methods out of headers because they're not
good inlining candidates (too big or virtual methods).
* Changed C style casts to C++ style. The syntax is ugly, but they do make the
intent clearer which is a good thing. Note this as a coding style guideline
in HACKING.
* configure.ac: Automatically add -Werror to CFLAGS and CXXFLAGS if
maintainer mode is enabled and we're using GCC3 or newer. Don't do
this for older GCCs as GCC 2.95 issues spurious warnings.
* Reworked how include/xapian/version.h is generated so that it works
better with compilers other than GCC, and with HP-UX sed.
* XAPIAN_VERSION is now a string (e.g. "0.8.4").
* Added new #define XAPIAN_REVISION (which is 4 for version 0.8.4).
documentation:
* docs/bm25.html,docs/intro_ir.html: Reworked to talk about Xapian
rather than Muscat. Also improved the appearance of the formulae.
* HACKING: Valgrind now supports x86 FreeBSD and PowerPC Linux.
* Documented parameters of Enquire::register_match_decider().
* We now use doxygen 1.3.8 to build documentation for snapshots and releases.
* PLATFORMS: Updated from the tinderbox (which now runs builds on machines
available in HP's testdrive scheme) and other assorted reports.
* PLATFORMS: Removed reports from versions prior to 0.7.0. So much
has changed that these are of little value.
* docs/scalability.html: Added note warning about benchmarking from cold.
* Assorted other minor documentation improvements.
portability:
* configure.ac: Improved snprintf configure test to actually
check that it works (older implementations may have different
semantics for the return value, and at least one ignores the length
restriction entirely!)
* Reworked the GNU getopt source we use so that the header is clean and
suitable for use from a reasonably ISO-conforming C++ compiler instead of
being full of cruft for working around quirky C compilers which C++ compilers
tend to stumble over.
* Use SOCKLEN_T for the type we need to pass to various socket calls, since
HPUX defines socklen_t yet wants int in those calls. Reworked the
TYPE_SOCKLEN_T test we use.
* On Windows, we want winsock2.h instead of sys/socket.h. Mingw doesn't seem
to even have the latter, so I think previously we've been compiling by
picking one up from somewhere random!
* Change the small number of C sources we have to be C++ so we can compile
everything with the C++ compiler. This way we don't need to worry about
configure choosing a mismatching pair of compilers, or about whether
configure tests with the C compiler don't apply to the C++ compiler, or vice
versa.
* Compiles and passes testsuite with HP's aCC (we have to compile in
ANSI mode, so we automatically add -AA to CXXFLAGS).
* If the link test detects pread and pwrite are present, get configure to try
out prototypes for pread and pwrite. This is much cleaner than trying to
find the right combination of preprocessor defines to get each platform's
system headers to provide prototypes.
* configure: Disable probing for pread/pwrite on HP-UX as they're present but
don't work when LFS (Large File Support) is enabled, and we definitely want
LFS.
* Fixed some warnings from Sun's C++ compiler.
* Provide our own C_isalpha(), etc replacements for isalpha(), etc
which always work in the C locale and avoid signed char problems.
* For mingw/cygwin, pass -no-undefined when linking libxapianqueryparser.la
so libtool builds a shared library. Also pass the magic linker flag
-Wl,--enable-runtime-pseudo-reloc if configure has determined it is needed.
* For cygwin, use the underlying MoveFile API call for locking, as link()
doesn't work on FAT partitions. And don't rely on HAVE_LINK to control
whether we use link() otherwise - if the configure test somehow misfires, a
compilation error is better than using rename() on Unix as that would cause a
second writer to smash the lock of the first.
* Closer to building with Compaq C++ - add "-std strict_ansi" to CXXFLAGS, and
tweaked the code in several places. It currently dies trying to compile
the PIMPL smart pointer template code which looks hard to fix.
debug code:
* HACKING: Document that %% in XAPIAN_DEBUG_LOG is substituted with
the process-id, and that setting XAPIAN_DEBUG_FLAGS to -1 enables
all debug messages.
* Removed compatibility code for checking environment variables OM_DEBUG_FILE
and OM_DEBUG_TYPES.
Xapian-core 0.8.3 (2004-09-20):
API:
* Fixed bug which caused a segmentation fault or odd "Document not found"
exceptions when new check_at_least parameter to Enquire::get_mset() was used
and there weren't many matches (regression test checkatleast1).
remote backend:
* Renamed omtcpsrv to xapian-tcpsrv and omprogsrv to xapian-progsrv.
packaging:
* RPM packaging now has a separate package for the runtime libraries to
allow 32 and 64 bit versions to be installed concurrently.
* RPM for xapian-core now includes binaries from xapian-examples.
debug code:
* Fixed to compile with debug tracing enabled.
Xapian-core 0.8.2 (2004-09-13):
API:
* Removed the compatibility layer which allowed programs written against the
pre-0.7.0 API to be compiled.
* Added new ESet methods swap(), back() and operator[].
* Xapian::WritableDatabase::replace_document can now be used
to add a document with a specific docid (to allow keeping docids
in sync with numeric UIDs from another system).
* Added Xapian::WritableDatabase::replace_document and
delete_document variants which take a unique id term name rather
than a document id.
* Enquire::get_mset(): If a matchdecider is specified and no matches
are requested, the lower bound on the number of matches must be 0
(since the matchdecider could reject all the matches).
* Renamed Query::is_empty() to Query::empty() for consistency. Keep
Query::is_empty() for now as a deprecated alias.
* Enquire::set_sorting() now takes an optional third parameter which allows
you to specify a sort by value, then relevance, then docid instead of
by value then docid.
* Enquire::get_mset() now takes an optional "check_at_least" parameter
which allows Omega's MIN_HITS functionality to be implemented in the matcher
(where it can be done a bit more efficiently).
testsuite:
* Reworked quartztest's positionlist1 into a generic api test as apitest's
poslist3.
* apitest: Reenabled allterms2, but with the iterator copying parts removed -
TermIterator is an input_iterator so that part was invalid.
* Overhauled btreetest and quartztest - tests at the Btree level are now all
in btreetest. Those at the QuartzDatabase level are in quartztest.
* Split api_db.cc into 3 files as it has grown rather large.
* tests/runtest: Added support for easily running gdb on a test program,
automatically sorting out srcdir and libtool.
quartz backend:
* Refactored the quartz backend code to reduce the number of layered classes
and eliminate unnecessary buffering, reducing memory usage so that more
posting list changes can be batched together (see next change) and database
building can be done several times faster.
* Added tunable flush threshold - set XAPIAN_FLUSH_THRESHOLD=50000 to flush
every 50000 documents. The default is now every 10000 documents (was
every 1000 documents previously). The optimum value will most likely
depend on your data and hardware.
* WritableDatabase::get_document() no longer forces pending changes to be
flushed. The document will read things lazily from the database, and that
reading may trigger a forced flush).
* WritableDatabase::get_avlength() no longer forces pending changes to be
flushed. This means you can now search a modified WritableDatabase without
causing a flush unless the search includes a term whose postlist has pending
modifications.
* Reduced quartz postlist chunk threshold from "2048 or a few bytes more" to
"2000 or a few bytes more" so that full size chunks won't get split by the
Btree.
* Improved the "Db block overwritten" message. The DatabaseCorruptError
version now suggests multiple writers may be the cause, while the
DatabaseModifiedError version uses less alarming wording and says to call
Database::reopen().
* QuartzWritableDatabase now stores the total document length and the last
docid itself rather than tallying added and removed document length and
writing the last docid back every time a document is added. This gives
cleaner code and a small performance win.
* Make the first key null for blocks more than 1 away from the leaves.
It saves disk space for a tiny CPU and RAM cost so is bound to be
a win overall.
* matcher/localmatch.cc: Fixed problems handling termweights in queries with
the same term repeated (bug #37) and added regression test (qterminfo2).
* Sped up iteration over all the terms in a database (QuartzCursor now only
reads the tag from the Btree if asked to).
* Cancelling an operation is now implemented more efficiently.
inmemory backend:
* Fixed bugs with deleting a document while a PostingIterator over it is
active.
muscat36 backend:
* Fixed to compile now that internal_end_session() has gone (broken in 0.8.1).
build system:
* Fixed to compile when configured with --disable-inmemory (bug #33).
* XO_LIB_XAPIAN now AC_SUBSTs XAPIAN_VERSION so your application's build
system can easily check for a particular version of Xapian.
* When compiling with GCC, we check that the compiler used to compile the
library and the compiler used to compile the application have compatible
C++ ABI versions. Unfortunately GCC 3.1 incorrectly reports the same
ABI version as GCC 3.0, so we now special case that test.
* Bumped the versions of the autotools we require for bootstrapping, and
updated the documentation of these in the HACKING document.
* Quote macro names to fix warnings from newer aclocal.
documentation:
* Improved API documentation for Xapian::WritableDatabase::replace_document and
delete_document.
* Added documentation comments for MSet methods size(), empty(), swap(),
begin(), end(), back().
* Removed bogus documentation comments saying that some Enquire methods can
throw DatabaseOpeningError.
* Updated quartz design docs to reflect recent changes. Also pulled
out the Btree and Bcursor API docs and slotted them in as doxygen
documentation comments - this way they're much more likely to
be kept up-to-date.
* Corrected multiple occurrences of "an Xapian::XXX" to "a Xapian::XXX"
(presumably these all resulted from replacing "Om" with "Xapian::").
* Various minor updates and improvements.
portability:
* Reworked how we cope with fcntl.h #define-ing open on Solaris. This change
finally allows Sun's C++ compiler to produce a working Xapian build on
sparc Solaris!
* configure.ac: Don't define DATADIR - we no longer use it and clashes
with more recent mingw headers.
* matcher/andpostlist.cc: Initialise lmax and rmax to 0. This cures
the SIGFPE on apitest's qterminfo2 on alpha linux.
Xapian-core 0.8.1 (2004-06-30):
API:
* New method Xapian::Database::get_lastdocid which returns the highest used
document id for a database (useful for re-synchronizing an indexer which
was interrupted). Implemented for quartz and inmemory.
* Xapian::MSet::get_matches_*() methods now take collapsing into account, and
the documentation has been clarified to state explicitly that collapsing and
cutoffs are taken into account (bug#31).
* Xapian::MSet: Need to adjust index by firstitem when indexing into items
(bug#28).
* MSetIterator and ESetIterator are now bidirectional iterators (rather than
just input iterators)
* Fixed post-increment forms of PostingIterator, TermIterator,
PositionIterator, and ValueIterator so that *i++ works (as it must for them
to be true input iterators).
* Xapian::QueryParser: If we fail to parse a query, try stripping out
non-alphanumerics (except '.') and reparsing.
* Fixed memory leaked upon Xapian::QueryParser destruction.
* Removed several unused Xapian::Error subclasses (these were used by the
indexer framework which we decided was a failed experiment).
testsuite:
* queryparsertest: Pruned near-duplicate queryparsertest testcases.
* queryparsertest: Added test case for `term NOT "a phrase'.
* remotetest: Use 127.0.0.1 instead of localhost so that tcpmatch1 doesn't fail
just because the network setup is broken.
* apitest: Make emptyquery1 check that Query("") causes an InvalidArgumentError
exception.
quartz backend:
* Fixed bug which meant we sometimes failed to remove a posting when deleting
or replacing a document.
* Fixed PostlistChunkReader to take a copy of the postlist data being read to
avoid problems with reading data from a string that's been deleted.
* Fixed bug in postlist merging which could occasionally extend a postlist
chunk to overlap the docid range of the next chunk.
* Eliminated the split cursor in each Btree object - we only actually need a
single block buffer to handle splitting blocks. This reduces the memory
overhead of each Bcursor (and hence each QuartzPostList).
* Changed 2 calls to abort() to throw Xapian::DatabaseCorruptError instead,
* If Btree is writable, throw DatabaseCorruptError if we detect overwritten.
* Check the return value of fdatasync()/fsync()/_commit() and raise an error.
If they fail, we really want to know as it could cause data corruption.
* Assorted clean ups, improved comments, debug tracing, assertions.
* When merging in postlist changes, removed an unneeded call to
QuartzBufferedTable::get_or_make_tag() in a case when we're using a cursor
which has already fetched the tag.
* Added SON_OF_QUARTZ define to disable incompatible changes to database
formats by default, and use it to control the docid encoding for keys such
that we're always inserting at the end of the table when added new documents.
* Reopening the readonly version of a writable Btree is now more efficient
(we used to close and reopen all the files and destroy and recreate a lot
of objects and buffers).
* Share file descriptors between the read and write Btree objects so that a
quartz WritableDatabase now uses 5 fds rather than 10.
* Added configure test for glibc, because otherwise we need to include a header
before we can check for glibc in order to define something we should be
defining before we include any headers! Defining _XOPEN_SOURCE on OpenBSD
seems to do the opposite to Linux and *disable* pread and pwrite!
backends:
* Stripped out the session machinery - all that is actually required is to
ensure that any unflushed changes are flushed when the destructor runs.
* A few other backend interface cleanups.
build system:
* Unified the shlib version numbers (the small benefit of tracking them
individually makes it hard to justify the extra work required, and having one
version simplifies debian packaging too).
* configure.in: Fix typo (STLPORT_CXXLAGS -> STLPORT_CXXFLAGS)
* Removed trivial m4/Makefile.am and autoconf/Makefile.am and do the work
from the top level Makefile.am instead. It's easier to see the structure
this way, and it also removes a couple of recursive make invocations which
will speed up builds a little.
documentation:
* HACKING: Added a list of subtasks when doing a release.
Currently it's always me that does this, but it may not always be
and anyhow it'll help me to have a list to run through.
* include/xapian/database.h: Remove references to sessions in doxygen
comments.
* docs/quickstart.html: Corrected lingering reference to "om.h" and
note that we need <iostream>.
* docs/quickstartindex.cc.html,docs/quickstartexpand.cc.html,
docs/quickstartsearch.cc.html: Add <iostream>.
* PLATFORMS,AUTHORS: Updated.
* docs/quartzdesign.html: Corrected various pieces of out of date
information, and improved wording in a couple of places.
* docs/scalability.html: Removed the reference to the Quartz update bottleneck
"currently being addressed for Xapian 0.8" as it's now been addressed! Also
reworded to remove use of first person (it was originally a message sent to
the mailing list).
Xapian-core 0.8.0 (2004-04-19):
* Omega, xapian-examples and xapian-bindings now have their own NEWS files.
API:
* Throw an exception when an empty query is used to build in the binary
operator Query constructor (previously this caused a segfault. Added
regression test.
* Made the TradWeight constructor explicit. This is technically an API change
as before you could pass a double where a Xapian::Weight was required - now
you must pass Xapian::TradWeight(2.0) instead of 2.0. That seems desirable,
and it's unlikely any existing code will be affected.
* Added "explicit" qualifier to constructors for internal use which take a
single parameter.
* Renamed Xapian::Document::add_term_nopos to Xapian::Document::add_term
(with forwarding wrapper method for compatibility with existing code).
* The reference counting mechanism used by most API classes now handles
creating a new object slightly more efficiently.
* Xapian::QueryParser: Don't use a raw term for a term which starts with a
digit.
testsuite:
* apitest, quartztest: Added a couple of tests, and commented out some test
lines which fail in debug builds.
* quartztest: cause a test to fail if there's still a directory after a call
to rmdir(), or if there isn't a directory after calling mkdir().
* apitest: Check returned docids are the expected values in a couple more
cases. Improved wording of a comment.
quartz backend:
* We now merge a batch of changes into a posting list in a single pass which
relieves an update bottleneck in previous versions.
* When storing the termlist, pack the wdf into the same byte as the reuse
length when possible - doing so typically makes the termlist 14% smaller!
This change is backward compatible (0.7 database will work with 0.8, but
databases built or updated with 0.8 won't work with 0.7).
* quartzcheck: Check the structure within the postlist Btree as well as
the Btree structures themselves.
* Reduced code duplication in the btree manager and btreechecking code.
* quartzdump: Backslash escape space and backslash in output rather than hex
encoding them; renamed start-term and end-term to start-key and end-key;
removed rather pointless "Calling next" message; if there's an error, write
it to stderr not stdout, and exit with return code 1.
* Corrected a number of comments in the source.
* Removed several needless inclusions of quartz_table_entries.h.
* Removed OLD_TERMLIST_FORMAT code - it has been disabled for since 0.6.0.
* Removed all the quartz lexicon code and docs. It's been disabled for ages,
and we've not missed it.
build system:
* XO_LIB_XAPIAN autoconf macro can now be called without arguments in the
common case where you want the test to fail if Xapian isn't found.
* Fixed the configure test for valgrind - it wasn't working correctly when
valgrind was installed but was too a version to support VALGRIND_COUNT_ERRORS
and VALGRIND_COUNT_LEAKS.
* GCC 2.95 supported -Wno-long-long and is our minimum recommended version, so
unconditionally use -Wno-long-long with GCC, and don't test for it on other
compilers (the old test incorrectly decided to use it with SGI's compiler
resulting in a warning for every file compiled).
documentation:
* Updated the quickstart tutorial and removed the warning that "this
document isn't up to date".
* docs/intro_ir.html: Added a link to "Information Retrieval" by Keith van
Rijsbergen which can be downloaded from his website!
* docs/quartzdesign.html: Some minor improvements.
* docs/matcherdesign.html: Merged in more details from a message sent to the
mailing list.
* docs/queryparser.html: Grammar fixes.
* Doxygen wasn't picking up the documentation for PostingIterator and
PositionListIterator - fixed. Added doxygen comments for Xapian::Stopper
and Xapian::QueryParser.
* PLATFORMS: Updated with many results from tinderbox and from users.
* AUTHORS: Updated the list of contributors.
* HACKING: XAPIAN_DEBUG_TYPES should be XAPIAN_DEBUG_FLAGS.
* HACKING: Updated to mention that building from CVS requires
`./configure --enable-maintainer-mode' (or use bootstrap).
* HACKING: Added notes about using "using", and pointers to a couple of useful
C++ web resources.
portability:
* Solaris: Code tweaks for compiling with Sun's C++ compiler.
* IRIX: Code tweaks for compiling with SGI's C++ compiler.
* NetBSD mkdir() doesn't cope with a trailing / on the path - fixed our code to
cope with this.
* mingw/cygwin: Only use O_SYNC (on the debug log) if the headers define it.
* backends/quartz/quartz_table_manager.cc: Fix for building on mingw.
* mingw: Added configure test for link() to avoid infinite loop in our C++
wrapper for link.
* mingw and cygwin both need -Wl,--enable-runtime-pseudo-reloc passing when
linking. Arrange for xapian-config to include this, and check that the ld
installed is a new enough version (or at least that it was at configure
time). Also pass to programs linked as part of the xapian-core build.
* cygwin: Close a QuartzDatabase or QuartzWritableDatabase before trying to
overwrite it - cygwin doesn't allow use to delete open/locked files...
* backends/quartz/quartz_termlist.cc: Use Xapian::doccount instead of
unsigned int in set_entries().
* Database::Internal::Internal::keep_alive() should be
Database::Internal::keep_alive().
* Make Xapian::Weight::Weight() protected rather than private as we want to be
able to call it from derived classes (GCC 3.4 flags this, other compilers
seem to miss it).
debug code:
* Open debug log with flag O_WRONLY so that we can actually write to it!
* backends/quartz/quartz_values.cc: Fixed problem with dereferencing
a pointer to the end of a string in debug output.
Xapian 0.7.5 (2003-11-26):
API:
* Xapian::QueryParser now supports prefixes on phrases and expressions (e.g.
author:(twain OR poe) subject:"space flight").
* Added missing default constructors for TermIterator, PostingIterator, and
PositionIterator classes.
* Fixed PositionIterator assignment operator.
testsuite:
* queryparsertest: Added testcase for new phrase and expression prefix support.
* apitest: Added regression tests for API fixes.
backends:
* quartzcompact: Fix the name that the meta file gets copied to (was
/path/to/dbdirmeta rather than /path/to/dbdir/meta).
build system:
* Changed to using AM_MAINTAINER_MODE. If you're doing development work on
Xapian itself, you should configure with "--enable-maintainer-mode" and
ideally use GNU make.
* Fixed configure test for fdatasync to work (I suspect a change in a recent
autoconf broke it as it relied on autoconf internal naming).
* Fully updated to reflect move of libbtreecheck.la from backends/quartz
to testsuite. btreetest and quartzcheck should build correctly now.
documentation:
* Added first cut of documentation for Xapian::QueryParser query syntax.
* Fixed incorrectly formatted doxygen documentation comments which resulted in
some missing text in the collated API and internal classes documentation.
* Documented --enable-maintainer-mode and problems with BSD make in HACKING.
* Fixed typo in docs/scalability.html.
* PLATFORMS: Updated from the tinderbox.
omega:
* omega: Parsing of the probabilistic query is now delayed until we need some
information from it. This means that we can now use options set by the
omegascript template to control the behaviour of the query parser.
$set{stemmer,...} now controls the stemming language (e.g. $set{stemmer,fr})
and $setmap{prefix,...} now sets the QueryParser prefix map (e.g.
$setmap{prefix,subject,XT,abstract,XA}).
* omega: Fixed $setmap not to add bogus entries.
* docs/omegascript.txt: Expanded documentation of $set and $setmap to list
values which Omega itself makes use of.
* omega: Cleaned up the start up code quite a bit.
* omega: Removed the unfinished code for caching omegascript command
expansions. Added code to cache $dbsize. The only other value correctly
marked for caching is already being cached!
Xapian 0.7.4 (2003-10-02):
API:
* Fixed small memory leak if Xapian::Enquire::set_query() is called more than
once.
* Xapian::ESet now has reference counted internals (library interface version
bumped because of this).
* Removed unused OmDocumentTerm::termfreq member variable.
* OmDocumentTerm ctor now takes wdf, and replaced set_wdf() with inc_wdf() and
dec_wdf().
* Removed unused open_document() method from SubMatch and derived classes.
* Calls made by the matcher to Document::Internal::open_document() now use the
lazy flag provided for precisely this purpose, but apparently never used -
this should give quite a speed boost to any matcher options which use values
(e.g. sort, collapse).
testsuite:
* Finished off support for running tests under valgrind to check for memory
leaks and access to uninitialised variables.
* apitest: Sped up deldoc4.
* btreetest: Removed superfluous `/'s from constructed paths.
* quartztest: adddoc2 now checks that there weren't any extra values created.
backends:
* quartz: don't start the document's TermIterator from scratch on every
iteration in replace_document(). Should be a small performance win.
* quartz: Pass 0 for the lexicon/postlist table when creating a termlist just
to find the doc length.
* quartz: quartz_table_entries.cc: Removed rather unnecessary use of
const_cast.
* quartz: quartz_table.cc: Removed unused variable.
* quartz: Improved encapsulation of class Btree.
build system:
* libbtreecheck.la now has an explicit dependency on libxapian.la.
* We now set the dependencies for libxapian correctly so that linking
applications will pull in other required libraries.
* matcher/Makefile.am: Ship networkmatch.cc even if "make dist" is run from a
tree with the remote backend disabled.
* configure.in: Sorted out tests for gethostbyname and gethostbyaddr using
standard autoconf macros.
* configure.in: If fork is found, but socketpair isn't, automatically disable
the remote backend rather than configure dying with an error.
* autoconf/: Removed various unused autoconf macros.
portability:
* xapian-config.in: Link with libxapianqueryparser before libxapian, since
that's the dependency order.
* Removed or replaced uses of <iostream> and <iosfwd> in the library sources
- we don't need or want the library to pull in cin and friends.
* extra/queryparser.yy: Fixed to build with Sun's C++ compiler.
* Make the dummy source file C++ rather than C so that automake tells libtool
that this is a C++ library - vital for correct linking on some platforms.
* Makefile.am: Pass -no-undefined to libtool so that we can build build a DLL
on MS Windows.
* configure.in: Fixed check for socketpair - we were automatically disabling
the remote backend on platforms where socketpair is in libsocket
(such as Solaris).
* Use O_BINARY for binary I/O if it exists.
* common/utils.h: mkdir() only takes one argument on mingw.
* common/utils.h,testsuite/backendmanager.cc: Touch file using open() rather
than system().
* common/utils.cc: Fixed to compile if snprintf isn't available.
documentation:
* docs/scalability.html: Fixed slip (32GB should be 32TB); Added note about
Linux 2.4 and ext2 filesize limits.
* PLATFORMS: Updated.
* NEWS: Fixed a few typos.
bindings:
* xapian.i: using namespace std in SWIG parsed segment to sort out typemaps.
packaging:
* Updated RPM packaging.
omega:
* omega: $topdoc now ensures the match has been run; $date no longer ensures
the match has been run.
* omega: Fixed to build with Sun's C++ compiler.
Xapian 0.7.3 (2003-08-08):
API:
* MSetIterator: Fixed MSetIterator::get_document() to work when get_mset() was
called with first != 0 (regression test msetiterator3).
testsuite:
* internaltest: Changed test exception1 to actually test something (hopefully
what was originally intended!)
* Added long option support to the testsuite programs (and quartzdump).
* Testsuite now builds on platforms for which we use our own stringstream
implementation.
* Only use \r in test output if the output is a tty.
* Increased default timeout used by tests running on the remote backend from 10
seconds to 5 minutes to avoid tests failing just because the machine running
them is slow and/or busy.
* Fixed check for broken exception handling - we were getting "Xapian::"
prefixed to one version and not on the other.
* tests/runtest: Set srcdir if it isn't already to make it easy to manually run
test programs from a VPATH build.
* apitest: Check termfreq in allterms4.
backends:
* quartz: Fixed allterms TermIterator to not give duplicate terms when a
posting list is chunked; added regression test (allterms4).
* quartz: Check for EINTR when reading or writing blocks and retry the
operation. This should mean quartz won't fail falsely if a signal is
received (e.g. if alarm() is used).
build system:
* Renamed libomqueryparser to libxapianqueryparser - for backward compatibility
we still provide a library with the old name for now.
* xapian.m4: Added XO_LIB_XAPIAN to replace OM_PATH_XAPIAN. XO_LIB_XAPIAN will
automagically enable use of "xapian-config --ltlibs" if A[CM]_PROG_LIBTOOL is
used in configure.in.
* xapian-config: Now supports linking with libtool - using libtool means that
the run-time library path is set and that you can now link with an
uninstalled libxapian. Also xapian-config will now work once xapian-core's
configure has been run, rather than only after "make all".
* xapian-config: Now automatically tries to link libxapianqueryparser too.
* bootstrap: Removed bootstrap scripts in favour of top-level bootstrap which
creates a top-level configure you can optionally use to configure all checked
out Xapian modules with one command, and which creates a top level Makefile
to build all checked out Xapian modules with one command.
* Added versioning information to libxapian and libxapianqueryparser.
* xapian-example/omega: Use libtool and XO_LIB_XAPIAN so we can link with an
uninstalled Xapian, and so the run time load path gets built into the
binaries (no need to set LD_LIBRARY_PATH just because you install Xapian with
a non-standard prefix).
* configure: Stop the API documentation from being regenerated when
include/xapian/version.h changes (since it's generated by configure).
* Fixed "make dist" in VPATH builds.
portability:
* common/getopt.h: #include <stdlib.h>, <stdio.h>, and <unistd.h> before
defining getopt as a macro - this avoids problems with clobbering prototypes
of getopt() in system headers.
* bin/quartzcompact.cc: Need stdio.h for rename().
* languages/Makefile.am: Fixed compilation for compilers other than GCC.
* Moved rset serialisation into a method of RSet::Internal, so
omrset_to_string() is now just glue code. This eliminates the need for it to
be a friend of RSet::Internal which Sun's C++ compiler didn't seem to be able
to cope with.
documentation:
* Fix incorrect documentation comment for Enquire::set_set_forward(). (Looked
like a cut&paste error)
* COPYING: Updated FSF address, and reinstated missing section: "How to Apply
These Terms to Your New Programs"
* PLATFORMS: Updated some linux results: RH7.3 on x86, and Debian on alpha and
arm; Updated FreeBSD success report; Updated with results from the tinderbox.
* docs/mkdoc.pl: Don't choke on a comment at the end of the DIST_SUBDIRS line
in a Makefile.am.
* HACKING: Improved note about why libtool 1.5 is needed.
* HACKING: Added note about additional tools needed for building a
distribution.
bindings:
* Fixed VPATH builds.
* python: Fixed to link with libomqueryparser.
* guile,tcl8: Updated typemaps to SWIG 1.3 style.
omega:
* omindex.cc: Added missing `#include <errno.h>'.
* omindex/scriptindex: Fixed signed character issue in accent normalisation.
* omindex: fixed memory and file descriptor leak on indexing a zero-sized file.
* omindex: Fixed sense of test for unreadable files.
* omindex: Improved log messages to distinguish re-indexed/added.
* omindex,omega,scriptindex: Fixed to compile with mingw.
* omindex: Fixed to compile with GNU getopt so we can build on non-glibc
platforms.
examples:
* msearch: Quick fix to get mingw building going.
* getopt: Copied over our fixes for better C++ compatibility.
* simplesearch: Stem search terms.
* simpleindex: Fixed not to run words together between lines.
* simpleindex: Create database if it doesn't exist.
Xapian 0.7.2 (2003-07-11):
testsuite:
* Fixed NULL pointer dereference when a test threw an unexpected exception.
backends:
* Quartz: When asked to create a quartz database, try to create the directory
if it doesn't already exist. Then we don't have to do it in every single
Xapian program which wants to create a database...
portability:
* common/getopt.h: Fixed to work better with C++ compilers on non-glibc
platforms.
* common/utils.h: missing #include <ctype.h>
* Quartz: Defined _XOPEN_SOURCE=500 for GLIBC so we get pread() and pwrite().
* common/utils.h: Improved mingw implementation of rmdir().
documentation:
* PLATFORMS: Added MacOS X 10.2 success report.
* Improvements to doxygen-generated documentation.
bindings:
* Moved to separate xapian-bindings module.
* Added configure check for SWIG version (require at least 1.3.14).
* bindings/swig/xapian.i: Fixed over-enthusiastic automatic conversion of
termname to std::string.
* PHP4 bindings much closer to working once again; updated guile and tcl8
somewhat.
omega:
* omega: If the same database is listed more than once, only search the first
occurrence.
* omega: use snprintf to help guard against buffer overflows.
Xapian 0.7.1 (2003-07-08):
testsuite:
* Fixed testsuite programs to not try to use "rm -rf" under mingw.
backends:
* Quartz: Use pread() and pwrite() on platforms which support them. Doing so
avoids one syscall per block read/write.
* Quartz block count is now unsigned, which should nearly double the size of
database for a given block size. Not tested this yet.
omega:
* omindex: Fixed compilation problem in 0.7.0.
documentation:
* Added new document discussing scalability issues.
* PLATFORMS: Updated.
Xapian 0.7.0 (2003-07-03):
API:
* Moved everything into a Xapian namespace, which the main header now being
xapian.h (rather than om/om.h).
* Three classes have been renamed for better naming consistency:
OmOpeningError is now Xapian::DatabaseOpeningError, OmPostListIterator is
now Xapian::PostingIterator, and OmPositionListIterator is now
Xapian::PositionIterator.
* xapian.h includes <iosfwd> rather than <iostream> - if you were relying on
the implicit inclusion, you'll need to add an explicit "#include <iostream>".
* Replaced om_termname with explicit use of std::string - om_termname was just
a typedef for std::string and the typedef doesn't really buy us anything.
* Older code can be compiled by continuing to use om/om.h which uses #define
and other tricks to map the old names onto the new ones.
* Define XAPIAN_VERSION (e.g. 0.7.0), XAPIAN_MAJOR_VERSION (e.g. 0), and
XAPIAN_MINOR_VERSION (e.g. 7).
* Updated omega and xapian-examples to use Xapian namespace.
queryparser:
* Xapian::QueryParser: Accent normalisation added; Improved error reporting;
Fixed to handle the most common examples found in the wild which used to give
"parse error".
bindings:
* Python bindings brought up to date - use ./configure --enable-bindings to
build them. Requires Python >= 2.0 - may require Python >= 2.1.
* Enabled optional building of bindings as part of normal build process. Old
Perl and Java bindings dropped; for Perl, use Search::Xapian from CPAN; Java
JNI bindings will be replaced with a SWIG-based implmentation.
internal implementation changes:
* Removed one wrapper layer from the internal implementation of most API
classes.
* Xapian::Stem now uses reference counted internals.
* Internally a lot of cases of unnecessary header inclusion have been removed
or replaced with forward declarations of classes. This should speed up
compilation and recompilation of the Xapian library.
* Suppress warnings in Snowball generated C code.
* Reworked query serialisation in the remote backend so that the code is now
all in one place. The serialisation is now rather more compact and no longer
relies on flex for parsing.
testsuite:
* Moved all the core library tests to tests subdirectory.
* apitest now allows backend to be specified with "-b" rather than having to
mess with environmental variables.
* Testsuite programs can now hook into valgrind for leak checking, undefined
variable checking, etc.
backends:
* Fixed parsing of port number in remote stub databases.
* Quartz: Improved error message when asked to open a pre-0.6 Quartz database.
* Quartz backend: Workaround for shared_level problem turns out to
be arguably the better approach, so made it permanent and tidied up
code.
build system:
* Build system fixed to never leave partial files in place of the expected
output if a build is interrupted.
* quartzcheck, quartzdump, and quartzcompact are now built by "make" rather
than only by "make check".
* xapian-config: Removed --prefix and --exec-prefix - you can't reliably
install Xapian with a different prefix to the one it was configured with,
yet these options give the impression you can.
miscellaneous:
* Fixed sending debug output to a file with XAPIAN_DEBUG_LOG with a value which
didn't contain "%%" (%% expands to the current PID).
* Fixed Xapian::MSetIterator::get_collapse_count() to work as intended.
omega:
* omindex,scriptindex: Normalise accents in probabilistic terms.
* omindex: Read output from pstotext and pdftotext via pipes rather
than temporary files to side-step the whole problem of secure temporary file
creation; Use pdfinfo to get the title and keywords from when indexing a PDF;
Safe filename escaping tweaked to not escape common safe punctuation.
* omindex: Implement an upper limit on the length of URL terms - this is a
slightly conservative 240 characters. If the URL term would be longer than
this, its last few bytes are replaced by a hash of the tail of the URL. This
means that (apart from hopefully very rare collisions) urlterms should still
be unique ids for documents. This is forward and backward compatible for
URLs less than 240 characters.
* omindex: Clean up processing of HTML documents:
- Ignore the contents of <script> and <style> tags in HTML.
- Strip initial whitespace in each tag in an HTML document.
- Try not to split words in half when truncating title and summary.
* query.cc: Set STEM_LANGUAGE near the start of the file so it's easy
for users to change until we get better configurability.
* omega: Replaced half-hearted logging support with flexible OmegaScript-based
approach with new $log command. Also added $now to allow the current
date/time to be logged.
* templates/xml: added collapse info to xml template.
documentation:
* Assorted minor documentation improvements.
* PLATFORMS: Updated.
rpms:
* Improved RPM packaging of xapian-core and omega.
Xapian 0.6.5 (2003-04-10):
* OmEnquire: optimised the handling when sort_bands == 1 and fixed incorrect
results in this and some other sorting cases; added some sorting testcases.
* OmMSetIterator: added get_collapse_count() which returns a lower bound on
the number of items which were removed by collapsing onto the current item.
* OmStem: added default OmStem constructor and "none" language. Both of these
give a stemmer object which leaves terms unchanged which should allow for
simpler logic in programs using Xapian. The default constructor also removes
the need to mess with pointers in some cases.
* Automatically disable the remote backend if we don't have fork() since the
remote backend requires it in several places.
* Fixed to build with debug enabled.
* testsuite: fixed to still build when some backends are disabled.
* extra/parsequerytest.cc: Fixed to build with GCC 2.95.
* Testsuite: Added regression test for Quartz bug which caused problems with
long terms on machines with signed chars.
* testsuite/index_utils.cc: Handling of ^x was just downright wrong due to a
typo.
* Improved portability: Fix for 64 bit machines. Fixed btreetest to build with
older compilers lacking <sstream>. Xapian is now much closer to building
with Sun's CFront-based Sun Pro C++ compiler, and with a Linux to mingw
cross-compiler.
* PLATFORMS: Updated with the results of many test builds.
* Improved RPM packaging of xapian-core and omega.
* Documentation: Use http://www.doxygen.org/ as URL for doxygen; Fixed bad link
to our own website in overview.html; code_structure.html now only includes
directories in the build system.
* HACKING: updated.
* Removed bugs/todo.xml, TODO, TODO.release, docs/todo.html, and
docs/todo-release.html from the distribution. Bugs and todo items will be
tracked in Bugzilla instead.
* Install docs in /usr/share/doc/xapian-core instead of /usr/share/xapian-core.
* omega: If xP and P are both empty, there may be a boolean query, so don't
force first page of hits.
* omega: Fixed off-by-one error in rounding down topdoc - it was possible to
get to an empty page of hits if there were exactly a multiple of HITSPERPAGE
matches and the matcher over-estimated the number of matches and Omega
displayed page links.
* omega: Fixed handling of multiple DB parameters to be as documented.
* omega: Added $collapsed to report get_collapse_count() for the current hit.
* omega: Added $transform{} which does regexp manipulation (currently disabled
until configure tests for regexp library are added)
* omega: Added $uniq{} to eliminate duplicates from a sorted list.
* omega: Don't force page 1 for a query with repeated terms!
* omega: removed duplicates from terms listed in term frequencies.
* omega: Added cgi parameter COLLAPSE to collapse on key values
* omega: Added $value{key[,docid]} support to omegascript
* omega: Renamed DATE1, DATE2, and DAYSMINUS to the more meaningful START, END,
and SPAN (NB SPAN is days before END, or after START, or before today -
whereas SPAN was before *DATE1* or before today). The old parameters names
are supported (with the original semantics) for now.
* omega: Actually install documentation!
* templates/query: propagate B boolean filters
* templates/godmode: removed link to EuroFerret image
* templates/godmode: added value dumping, for values from 0-255
* omindex: Report correct version number (was hard-wired to 1.0!)
* scriptindex: Allow '_' in fieldnames. Diagnose bad characters in fieldnames
better.
* dbi2omega: Added DBUSER and DBPASSWD environmental variable support so that
password protected DBs can easily be used
* scriptindex.cc: added missing "#include <stdio.h>" which caused builds
to fail for some platforms.
Xapian 0.6.4 (2002-12-24):
* Quartz backend: Fixed double setting of position list when updating a
document with term position information (overall result was correct, just
inefficient); when deleting a position_list, don't check if it's empty,
just ask the layer below to delete it and let it handle the case when
there's nothing to delete; Fixed unpacking of termlist on platforms where
char is signed.
* OmQueryParser: Added support for searching probabilistic fields (using
<field>:<term>); the unstem multimap now includes "." on the end of a
term if it was there in the query.
* Don't include "om.h" as a dependency for the api docs since it's generated
a configure time and the dependency was forcing users to regenerate the
documentation, which requires doxygen to be installed.
* Bindings: Python bindings updated to work with the updated API (still
disabled by default).
* Muscat 3.6 backend: Fixed to build with the new database factory functions;
fixed compilation warnings; Muscat 3.6 DA and DB databases don't support
positional information. Instead of throwing an exception when we try to
access it, return an empty position list (like a quartz database with no
position information would). This allows copydatabase to be used to convert
a Muscat 3.6 database to a quartz one.
* Documentation: quartzdesign and todo list updated.
* quartzcheck: default mode changed to "v" rather than "+", since "+" is too
verbose for a btree of any size; if you pass a quartz database directory,
quartzcheck will now check all the tables which make up a quartz database.
* quartzcompact: new tool which makes a copy of a quartz database with full
compaction turned on - this results in a smaller database which is faster
to search. The next update will result in a lot of block splitting though
(since all blocks are as full as possible).
* omega: Added $unstem to map a stemmed term to the form(s) used in the query;
$queryterms now only includes the first occurrence of each stemmed form;
$prettyterm makes use of the unstem map; prefer MINHITS to MIN_HITS and
RAWSEARCH to RAW_SEARCH since none of the other CGI parameter names have
_ separating words (continue to support old names for now); fixed default
template to not generate topterms twice, and fixed topterms to not stick
outside the green box; corrected omegascript docs - it's $setrelevant
not $set_relevant.
* scriptindex: index=nopos with new indexnopos action; index and indexnopos now
take an optional prefix argument; index=nopos is handled specially for
backwards compatibility; added new data action to generate terms for date
range searching.
Xapian 0.6.3 (2002-12-14):
* Updated PLATFORMS and todo list. Noted in HACKING that Bison 1.50 seems to
work with Xapian.
* OmQueryParser now creates an "unstem" multimap to allow probabilistic
query terms to be converted back to the form the user originally typed.
* Updated documentation for remote protocol description and the quickstart
tutorial which were both very out of date.
* No longer use OmSettings to pass matcher parameters. This completes the
removal of OmSettings.
* Added workaround for problem with cursors sharing levels in the btree.
This should fix sporadic problems with large databases (small databases
have fewer btree levels so aren't affected).
* Stub databases now work again, though with a different format. The new
format allows multiple databases to be specified in the stub file.
* OmEnquire::get_eset() now takes a flags argument of bit constants |-ed
together instead of 2 bools.
* Applied Martin Porter's better fix for the btree sequential addition bug
which Richard fixed a few months ago. Richard's fix resulted in a correct
btree, but didn't always utilise space as efficiently as possible.
* Fixed the remote backend to handle weighting schemes after the OmSettings
changes. You can now even implement your own weighting scheme and use it
with the remote backend provided you register it with SocketServer at
runtime (this feature has been on the todo list for ages).
Xapian 0.6.2 (2002-12-07):
* Set env var XAPIAN_SIG_DFL to stop the testsuite installing its
signal handler (may be useful with some debugging tools).
* backends/quartz/btree.cc: max_item_size wasn't being set due to
some over-zealous code pruning. It was defaulting to 0, and
was causing the code to write off the end of allocated memory
blocks.
* matcher/localmatch.cc: fixed handling of wtscheme() - we were
trying to use it for the extra weights, and then double
deleting it!
* common/omdebug.cc,common/omdebug.h: Fixed permissions on newly
created log file (was getting 000!); Simplified class internals;
Renamed env vars: OM_DEBUG_FILE is now XAPIAN_DEBUG_LOG,
OM_DEBUG_TYPES is now XAPIAN_DEBUG_FLAGS (old versions still work
for now).
* testsuite/testsuite.cc: Fixed so running "gdb .libs/apitest"
finds srcdir (for an in-tree build at least).
* Fixed to compile with --enable-debug=full.
* docs/remote.html: Updated from OmSettings to factory functions.
* PLATFORMS: ixion is actually Linux 2.2.
* OmWritableDatabase now has a default constructor.
* Weighting scheme now specified by passing OmWeight object to OmEnquire.
This also allows user weighting schemes (just subclass OmWeight and
pass in an instance of this new class). [This doesn't currently work
with the remote backend.]
* No longer use OmSettings to specify parameters for constructing databases.
Instead there's a factory function for each database type - temporary naming
scheme is OmXxx__open(), mostly because it's easy to grep for later.
Instead of create and overwrite flags, we pass in a value - a new possible
opening mode is "create or open". [At present stub databases and the
machinery in InMemory to allow the multierrhandler1 test aren't working.
Everything else should be.]
* OmEnquire::get_eset() takes parameters instead of an OmSettings object.
* Fixed reversed sense of use_query_terms (and fixed reversed sense test in
apitest which meant this wasn't spotted).
* Documentation: Link to annotated class lists in doxygen generated
documentation instead of the rather empty index pages; added doxygen
markup so that apidoc now documents header files; updated todo list.
* Documentation: intro doc thing was very out of date in places - fixed.
* Omega: index .php files as HTML, with the PHP code stripped out; omindex
return non-zero return code if an unexpected exception is caught; fixed
HTML parser to not read one character past the end of the document in
some cases; updated in line with OmSettings related changes to the API;
Fixed $dbname to return "default" for the default database instead of "";
templates/query: Removed now unused xDEFAULTOP hidden field, and superfluous
"}"; dbi2omega now more efficient and can be restricted to listed fields.
Xapian 0.6.1 (2002-11-28):
* Fixed to compile with GCC 3.0.
* PLATFORMS: Updated.
Xapian 0.6.0 (2002-11-27):
* Quartz database backend: lexicon disabled (./configure CXXFLAGS=-DUSE_LEXICON
to reenable it), and encoding schemes simplified and made more compact;
extended and added test cases; minimum block size is now 2048 bytes (as
documented before, but now we actually enforce this); btree checking code
split off and only linked in when required; tidied up btreetest's output.
* Replaced our stemmers with those from Snowball. These give better results,
and are actively maintained by Martin Porter (who wrote the original Xapian
stemmers too). It also means that Xapian now has stemmers for Finnish,
and Russian, and an implementation of Lovins' English stemmer.
* Assorted improvements to the documentation, especially the documentation
of the internals of the Quartz backend.
* Removed the three uses of RTTI (typeid() and dynamic_cast<>) - one was
totally superfluous, and the other two easily avoided.
* Omega and simpleindex example: limit probabilistic term length to 64
characters to stop the index filling up with junk terms which nobody will
ever search for.
* Omega: Added dbi2omega perl script to dump any database which perl DBI can
access into the dump format expected by scriptindex.
Xapian 0.5.5 (2002-12-04):
* Fixed compilation with --enable-debug.
* Minor documentation updates.
* Omega: Fixed paging on default database; removed xDEFAULTOP from the query
template as it's no longer used; removed bogus unmatched '}' from query
template; added dbi2omega perl script to dump any database which perl DBI
can access into the dump format expected by scriptindex; limit length of
probabilistic terms generated to 64 characters.
Xapian 0.5.4 (2002-10-16):
* Fixed a compilation error with "make check" when using GCC 3.2.
* PLATFORMS: checked 0.5.3 works on OpenBSD and Solaris 7.
Xapian 0.5.3 (2002-10-12):
Notable changes: Improvements to the test suite, and internal code cleanups:
* Internal code cleanups on Quartz Btree implementation.
* Minor documentation updates (TODO and PLATFORMS updated; Martin Porter's
stemming paper removed - see the Snowball site for background stemmer
info).
* Implemented QuartzAllTermsList::get_approx_size().
* Removed a couple of occurrences of "using std::XXX;" from externally
visible headers.
* With GCC, add warning flags "-Wall -W" rather than "-Wall -Wunused" (-Wall
implies -Wunused anyway). Fixed all the warnings this throws up, except in
languages/ (that code is to be replaced with Snowball soon).
* Test suite: Disable colour test output if stdout isn't a terminal and
reworked check for broken exception handling as the previous version never
seemed to fire. Other assorted minor improvements.
* include/om/om.h is now removed on "make distclean" rather than "make clean".
Xapian 0.5.2 (2002-10-06):
Further improvements to documentation and portability:
* docs/: converted all text docs to HTML (except omsettings which will
has odd markup (LaTeX?) and will probably soon be obsolete anyway).
* remote backend: Fixed handling of timeouts which are now in the past - fixes
test failures with redhat/x86.
* quartz backend: now works on 64 bit platforms.
* test suite: try to spot mishandled exceptions and stop them causing bogus
OMEXCEPT failures.
Xapian 0.5.1 (2002-10-02):
This release fixes features improved documentation and some build system
portability fixes.
* PLATFORMS: updated with more test results.
* docs/: tidied up layout of HTML documentation; converted the notes about
BM25 into HTML; updated stemmer docs to reflect intention to use Snowball
instead; included HTML versions of quickstart*.cc.
* automake 1.6.3 and autoconf 2.54 are now required for those working
from CVS to fix a problem with the generated Makefiles and Solaris
make.
* net/Makefile.am: Fixed building of readquery.cc from readquery.ll.
* buildall script is now deprecated - use the new streamlined bootstrap script
in preference.
Xapian 0.5.0 (2002-09-20):
The last release of the software that is now known as Xapian was Open Muscat
0.4.1 on November 24th 2000, not far from 2 years ago.
There's been a significant amount of development in this time, so we've
summarised the most notable changes and improvements:
* The project is now called "Xapian". We've renamed the modules in the light
of this change:
+ "om" is now "xapian-core"
+ "om-examples" is now "xapian-examples", and now contains small,
instructive examples which demonstrate how to use Xapian to implement
particularly features.
+ Added "xapian-applications" which contains larger sample applications
* Much improved build system - should now build "out of the box" on many Unix
platforms. Can now VPATH build with vendor tools on most platforms. Builds
as cleanly as we can achieve with GCC 2.95.* (some bogus warnings due to
compiler bugs). Should build without warnings on GCC 3.0, 3.1, and 3.2.
* If using GCC, om/om.h now contains a check that the compiler used to build
Xapian and the compiler used to build the application have compatible C++
ABIs. So you get a clear error message early from the first attempt to
compile a file rather than a confusing error from the linker near the end
of the build.
* RPM packages are now available. We intend to prepare Debian packages in the
near future too.
* xapian-config no longer support "--uninst". It's hard to make this work
reliably and portably, and the effort is better expended elsewhere.
Configure with a prefix and install to a temporary directory instead.
* Xapian can now work with files > 2Gb on OSes which support them.
* Restructured and reworked documentation.
* Removed thread locks. We intend to be "thread-friendly" so different
threads can access different objects without problems. In the rare event
that you want to concurrently call methods on the same object from
different threads you need to create a mutex and lock it. Thus the thread
lock overhead is only incurred when it's necessary.
* Indexgraph removed from core library. It will reappear as an add-on library
at some point.
* Omega's query parser has now been reworked as a separate library.
* Terminology change - "keys" are now known as "values" to avoid confusion,
since they're not like keys in a relational database. The exception is when
a value is used as a key in some operation, e.g. "match_collapse_key".
* Database backends:
+ Auto backend: can now be used to create a new database.
+ Auto backend: added support for "stub" databases - a text file
specifying the settings for the database to be opened (particularly
useful for allowing easy access to specific remote databases).
+ Quartz backend: many fixes and improvements, and the code has been
cleaned up a lot. Implemented deleting of items from postlists.
+ Remote backend: implemented term_exists() and get_termfreq();
+ Multi-backend: the document length is now fetched from the sub-postlist
rather than the database, which provides a huge speed-up in some cases.
+ Sleepycat backend: this experimental backend has been removed.
+ Muscat 3.6 backends: now disabled by default.
* Tests:
+ Test cases added for most bug fixes and new features.
+ stemtest: rewritten in C++ rather than part C++, part perl. Now 15%
faster.
+ includetest: removed - it's no longer useful now the code has matured.
+ Removed problematic leak checking from testsuite. We plan to use
valgrind instead soon.
* Matcher:
+ Fixed several matcher bugs which could cause incorrect results in some
situations.
+ Fix bug in expander due to nth_element being called on the wrong
element.
+ Added sorting within relevance bands to the matcher.
+ Matcher now calculates percentages differently, such that 100%
relevance is actually achievable.
+ Matcher now uses a min-heap rather than nth-element to maintain the
proto-mset. This is cleaner and more efficient.
+ New operator OP_ELITE_SET replaces match_max_or_terms option.
+ Implemented multiple XOR queries.
+ Add a new query operator, OP_WEIGHT_CUTOFF, which returns only those
documents from a query which have a weight greater than a specified
cutoff value.
+ Removed OmBatchEnquire from system: it may return at a later date, but
for now it is simply out of date and a maintenance liability, and
gives no significant advantage.
+ Added experimental match bias functors.
* The API has been cleaned up in various places:
+ OmDocumentContents and OmIndexDoc merged to become OmDocument
+ OmQuery interface cleaned up
+ OmData and OmKey removed - methods which used them now just pass a
string instead
+ OmESetItem replaced by OmESetIterator; OmMSetItem by OmMSetIterator;
om_termname_list by OmTermIterator
+ OmDocumentTerm and OmDocumentParams removed
+ OmMSet::mbound replaced by OmMSet::matches_
{lower_bound,estimated,upper_bound}, giving more information
+ Xapian iterators now have default constructors
+ Most API classes now have reference counted internals, so assignment
and copying are cheap
+ OmStem now has copy constructor and assignment operator
+ and more...
|