|  | @@ -23,12 +23,12 @@ import org.elasticsearch.common.Table;
 | 
	
		
			
				|  |  |  import org.elasticsearch.common.xcontent.XContentType;
 | 
	
		
			
				|  |  |  import org.elasticsearch.rest.AbstractRestChannel;
 | 
	
		
			
				|  |  |  import org.elasticsearch.rest.RestResponse;
 | 
	
		
			
				|  |  | -import org.elasticsearch.rest.action.cat.RestTable;
 | 
	
		
			
				|  |  |  import org.elasticsearch.test.ESTestCase;
 | 
	
		
			
				|  |  |  import org.elasticsearch.test.rest.FakeRestRequest;
 | 
	
		
			
				|  |  |  import org.junit.Before;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  import java.util.ArrayList;
 | 
	
		
			
				|  |  | +import java.util.Arrays;
 | 
	
		
			
				|  |  |  import java.util.Collections;
 | 
	
		
			
				|  |  |  import java.util.List;
 | 
	
		
			
				|  |  |  import java.util.Map;
 | 
	
	
		
			
				|  | @@ -62,11 +62,13 @@ public class RestTableTests extends ESTestCase {
 | 
	
		
			
				|  |  |              "  invalidAliasesBulk: \"foo\"\n" +
 | 
	
		
			
				|  |  |              "  timestamp: \"foo\"\n" +
 | 
	
		
			
				|  |  |              "  epoch: \"foo\"\n";
 | 
	
		
			
				|  |  | -    private Table table = new Table();
 | 
	
		
			
				|  |  | -    private FakeRestRequest restRequest = new FakeRestRequest();
 | 
	
		
			
				|  |  | +    private Table table;
 | 
	
		
			
				|  |  | +    private FakeRestRequest restRequest;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      @Before
 | 
	
		
			
				|  |  |      public void setup() {
 | 
	
		
			
				|  |  | +        restRequest = new FakeRestRequest();
 | 
	
		
			
				|  |  | +        table = new Table();
 | 
	
		
			
				|  |  |          table.startHeaders();
 | 
	
		
			
				|  |  |          table.addCell("bulk.foo", "alias:f;desc:foo");
 | 
	
		
			
				|  |  |          table.addCell("bulk.bar", "alias:b;desc:bar");
 | 
	
	
		
			
				|  | @@ -146,6 +148,110 @@ public class RestTableTests extends ESTestCase {
 | 
	
		
			
				|  |  |          assertThat(headerNames, not(hasItem("epoch")));
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    public void testCompareRow() {
 | 
	
		
			
				|  |  | +        Table table = new Table();
 | 
	
		
			
				|  |  | +        table.startHeaders();
 | 
	
		
			
				|  |  | +        table.addCell("compare");
 | 
	
		
			
				|  |  | +        table.endHeaders();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        for (Integer i : Arrays.asList(1,2,1)) {
 | 
	
		
			
				|  |  | +            table.startRow();
 | 
	
		
			
				|  |  | +            table.addCell(i);
 | 
	
		
			
				|  |  | +            table.endRow();
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        RestTable.TableIndexComparator comparator = new RestTable.TableIndexComparator(table,
 | 
	
		
			
				|  |  | +            Collections.singletonList(new RestTable.ColumnOrderElement("compare", false)));
 | 
	
		
			
				|  |  | +        assertTrue(comparator.compare(0,1) < 0);
 | 
	
		
			
				|  |  | +        assertTrue(comparator.compare(0,2) == 0);
 | 
	
		
			
				|  |  | +        assertTrue(comparator.compare(1,2) > 0);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        RestTable.TableIndexComparator reverseComparator = new RestTable.TableIndexComparator(table,
 | 
	
		
			
				|  |  | +            Collections.singletonList(new RestTable.ColumnOrderElement("compare", true)));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        assertTrue(reverseComparator.compare(0,1) > 0);
 | 
	
		
			
				|  |  | +        assertTrue(reverseComparator.compare(0,2) == 0);
 | 
	
		
			
				|  |  | +        assertTrue(reverseComparator.compare(1,2) < 0);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    public void testRowOutOfBounds() {
 | 
	
		
			
				|  |  | +        Table table = new Table();
 | 
	
		
			
				|  |  | +        table.startHeaders();
 | 
	
		
			
				|  |  | +        table.addCell("compare");
 | 
	
		
			
				|  |  | +        table.endHeaders();
 | 
	
		
			
				|  |  | +        RestTable.TableIndexComparator comparator = new RestTable.TableIndexComparator(table,
 | 
	
		
			
				|  |  | +            Collections.singletonList(new RestTable.ColumnOrderElement("compare", false)));
 | 
	
		
			
				|  |  | +        Error e = expectThrows(AssertionError.class, () -> {
 | 
	
		
			
				|  |  | +            comparator.compare(0,1);
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +        assertEquals("Invalid comparison of indices (0, 1): Table has 0 rows.", e.getMessage());
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    public void testUnknownHeader() {
 | 
	
		
			
				|  |  | +        Table table = new Table();
 | 
	
		
			
				|  |  | +        table.startHeaders();
 | 
	
		
			
				|  |  | +        table.addCell("compare");
 | 
	
		
			
				|  |  | +        table.endHeaders();
 | 
	
		
			
				|  |  | +        restRequest.params().put("s", "notaheader");
 | 
	
		
			
				|  |  | +        Exception e = expectThrows(UnsupportedOperationException.class, () -> RestTable.getRowOrder(table, restRequest));
 | 
	
		
			
				|  |  | +        assertEquals("Unable to sort by unknown sort key `notaheader`", e.getMessage());
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    public void testAliasSort() {
 | 
	
		
			
				|  |  | +        Table table = new Table();
 | 
	
		
			
				|  |  | +        table.startHeaders();
 | 
	
		
			
				|  |  | +        table.addCell("compare", "alias:c;");
 | 
	
		
			
				|  |  | +        table.endHeaders();
 | 
	
		
			
				|  |  | +        List<Integer> comparisonList = Arrays.asList(3,1,2);
 | 
	
		
			
				|  |  | +        for (int i = 0; i < comparisonList.size(); i++) {
 | 
	
		
			
				|  |  | +            table.startRow();
 | 
	
		
			
				|  |  | +            table.addCell(comparisonList.get(i));
 | 
	
		
			
				|  |  | +            table.endRow();
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        restRequest.params().put("s", "c");
 | 
	
		
			
				|  |  | +        List<Integer> rowOrder = RestTable.getRowOrder(table, restRequest);
 | 
	
		
			
				|  |  | +        assertEquals(Arrays.asList(1,2,0), rowOrder);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    public void testReversedSort() {
 | 
	
		
			
				|  |  | +        Table table = new Table();
 | 
	
		
			
				|  |  | +        table.startHeaders();
 | 
	
		
			
				|  |  | +        table.addCell("reversed");
 | 
	
		
			
				|  |  | +        table.endHeaders();
 | 
	
		
			
				|  |  | +        List<Integer> comparisonList = Arrays.asList(0, 1, 2);
 | 
	
		
			
				|  |  | +        for (int i = 0; i < comparisonList.size(); i++) {
 | 
	
		
			
				|  |  | +            table.startRow();
 | 
	
		
			
				|  |  | +            table.addCell(comparisonList.get(i));
 | 
	
		
			
				|  |  | +            table.endRow();
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        restRequest.params().put("s", "reversed:desc");
 | 
	
		
			
				|  |  | +        List<Integer> rowOrder = RestTable.getRowOrder(table, restRequest);
 | 
	
		
			
				|  |  | +        assertEquals(Arrays.asList(2,1,0), rowOrder);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    public void testMultiSort() {
 | 
	
		
			
				|  |  | +        Table table = new Table();
 | 
	
		
			
				|  |  | +        table.startHeaders();
 | 
	
		
			
				|  |  | +        table.addCell("compare");
 | 
	
		
			
				|  |  | +        table.addCell("second.compare");
 | 
	
		
			
				|  |  | +        table.endHeaders();
 | 
	
		
			
				|  |  | +        List<Integer> comparisonList = Arrays.asList(3, 3, 2);
 | 
	
		
			
				|  |  | +        List<Integer> secondComparisonList = Arrays.asList(2, 1, 3);
 | 
	
		
			
				|  |  | +        for (int i = 0; i < comparisonList.size(); i++) {
 | 
	
		
			
				|  |  | +            table.startRow();
 | 
	
		
			
				|  |  | +            table.addCell(comparisonList.get(i));
 | 
	
		
			
				|  |  | +            table.addCell(secondComparisonList.get(i));
 | 
	
		
			
				|  |  | +            table.endRow();
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        restRequest.params().put("s", "compare,second.compare");
 | 
	
		
			
				|  |  | +        List<Integer> rowOrder = RestTable.getRowOrder(table, restRequest);
 | 
	
		
			
				|  |  | +        assertEquals(Arrays.asList(2,1,0), rowOrder);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        restRequest.params().put("s", "compare:desc,second.compare");
 | 
	
		
			
				|  |  | +        rowOrder = RestTable.getRowOrder(table, restRequest);
 | 
	
		
			
				|  |  | +        assertEquals(Arrays.asList(1,0,2), rowOrder);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      private RestResponse assertResponseContentType(Map<String, String> headers, String mediaType) throws Exception {
 | 
	
		
			
				|  |  |          FakeRestRequest requestWithAcceptHeader = new FakeRestRequest.Builder().withHeaders(headers).build();
 | 
	
		
			
				|  |  |          table.startRow();
 |