comparison flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/FixingsOverview.java @ 2563:59c920e73d8a

FixingsOverview: Added a filter mechanism for generating output. flys-artifacts/trunk@4089 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Mon, 20 Feb 2012 16:41:45 +0000
parents ba35dfb7c09a
children 3f038d54bc87
comparison
equal deleted inserted replaced
2562:ba35dfb7c09a 2563:59c920e73d8a
379 public int compare(Column a, Column b) { 379 public int compare(Column a, Column b) {
380 return a.startTime.compareTo(b.startTime); 380 return a.startTime.compareTo(b.startTime);
381 } 381 }
382 }; 382 };
383 383
384 public interface Filter {
385
386 boolean accept(Column column);
387
388 } // interface Filter
389
384 public class Column extends Range { 390 public class Column extends Range {
385 391
386 protected int columnId; 392 protected int columnId;
387 protected Date startTime; 393 protected Date startTime;
388 protected String name; 394 protected String name;
398 this.name = name; 404 this.name = name;
399 405
400 sectors = new ArrayList<SectorRange>(); 406 sectors = new ArrayList<SectorRange>();
401 } 407 }
402 408
409 public int getId() {
410 return columnId;
411 }
412
403 public Fixing getFixing() { 413 public Fixing getFixing() {
404 return Fixing.this; 414 return Fixing.this;
405 } 415 }
406 416
417 public Date getStartTime() {
418 return startTime;
419 }
420
421 public String getName() {
422 return name;
423 }
424
407 public List<SectorRange> getSectors() { 425 public List<SectorRange> getSectors() {
408 return sectors; 426 return sectors;
427 }
428
429 public List<SectorRange> getSectors(Range range) {
430
431 List<SectorRange> result =
432 new ArrayList<SectorRange>(sectors.size());
433
434 for (SectorRange src: sectors) {
435 SectorRange dst = new SectorRange(src);
436 if (dst.clip(range)) {
437 result.add(dst);
438 }
439 }
440
441 return result;
409 } 442 }
410 443
411 public void buildSectors(GaugeRange gauge, List<QRange> qRanges) { 444 public void buildSectors(GaugeRange gauge, List<QRange> qRanges) {
412 445
413 for (QRange qRange: qRanges) { 446 for (QRange qRange: qRanges) {
471 protected List<Column> columns; 504 protected List<Column> columns;
472 505
473 public Fixing() { 506 public Fixing() {
474 } 507 }
475 508
509 public int getId() {
510 return wstId;
511 }
512
513 public String getDescription() {
514 return description;
515 }
516
476 public Fixing(int wstId, String description) { 517 public Fixing(int wstId, String description) {
477 this.wstId = wstId; 518 this.wstId = wstId;
478 this.description = description; 519 this.description = description;
479 columns = new ArrayList<Column>(); 520 columns = new ArrayList<Column>();
480 } 521 }
503 for (Column column: columns) { 544 for (Column column: columns) {
504 column.loadQRanges(query, gaugeFinder); 545 column.loadQRanges(query, gaugeFinder);
505 } 546 }
506 } 547 }
507 548
508 public void addAllColumns(List<Column> allColumns, Range range) { 549 public void addAllColumns(
550 List<Column> allColumns,
551 Range range,
552 Filter filter
553 ) {
509 for (Column column: columns) { 554 for (Column column: columns) {
510 if (column.intersects(range)) { 555 if (column.intersects(range) && filter.accept(column)) {
511 allColumns.add(column); 556 allColumns.add(column);
512 } 557 }
513 } 558 }
514 } 559 }
515 } // class Fixing 560 } // class Fixing
678 loadFixingsColumnsQRanges(session, gaugeFinder); 723 loadFixingsColumnsQRanges(session, gaugeFinder);
679 724
680 return true; 725 return true;
681 } 726 }
682 727
683 private static final Range FULL_EXTENT = 728 public static final Range FULL_EXTENT =
684 new Range(-Double.MAX_VALUE, Double.MAX_VALUE); 729 new Range(-Double.MAX_VALUE, Double.MAX_VALUE);
685 730
731 public static final Fixing.Filter ACCEPT = new Fixing.Filter() {
732 @Override
733 public boolean accept(Fixing.Column column) {
734 return true;
735 }
736 };
737
738 public static class NotFilter implements Fixing.Filter {
739 protected Fixing.Filter child;
740
741 public NotFilter(Fixing.Filter child) {
742 this.child = child;
743 }
744
745 @Override
746 public boolean accept(Fixing.Column column) {
747 return !child.accept(column);
748 }
749 } // class NotFilter
750
751 public static abstract class ComponentFilter implements Fixing.Filter {
752 protected List<Fixing.Filter> children;
753
754 public ComponentFilter(List<Fixing.Filter> children) {
755 this.children = children;
756 }
757 } // class ComponentFilter
758
759 public static class OrFilter extends ComponentFilter {
760
761 public OrFilter(List<Fixing.Filter> children) {
762 super(children);
763 }
764
765 @Override
766 public boolean accept(Fixing.Column column) {
767 for (Fixing.Filter child: children) {
768 if (child.accept(column)) {
769 return true;
770 }
771 }
772 return false;
773 }
774 } // class OrFilter
775
776 public static class AndFilter extends ComponentFilter {
777
778 public AndFilter(List<Fixing.Filter> children) {
779 super(children);
780 }
781
782 @Override
783 public boolean accept(Fixing.Column column) {
784 for (Fixing.Filter child: children) {
785 if (!child.accept(column)) {
786 return false;
787 }
788 }
789 return true;
790 }
791 } // class AndFilter
792
793 public static class IdFilter implements Fixing.Filter {
794
795 protected int columnId;
796
797 public IdFilter(int columnId) {
798 this.columnId = columnId;
799 }
800
801 @Override
802 public boolean accept(Fixing.Column column) {
803 return column.getId() == columnId;
804 }
805 } // class IdFilter
806
807 public static class DateFilter implements Fixing.Filter {
808
809 protected Date date;
810
811 public DateFilter(Date date) {
812 this.date = date;
813 }
814
815 @Override
816 public boolean accept(Fixing.Column column) {
817 return date.equals(column.getStartTime());
818 }
819 } // class DateFilter
820
821 public static class DateRangeFilter implements Fixing.Filter {
822
823 protected Date start;
824 protected Date end;
825
826 public DateRangeFilter(Date start, Date end) {
827 this.start = start;
828 this.end = end;
829 }
830
831 @Override
832 public boolean accept(Fixing.Column column) {
833 Date date = column.getStartTime();
834 return start.compareTo(date) <= 0 && end.compareTo(date) >= 0;
835 }
836 } // class DateRangeFilter
837
838 public static class SectorRangeFilter implements Fixing.Filter {
839
840 protected int min;
841 protected int max;
842
843 public SectorRangeFilter(int min, int max) {
844 this.min = Math.min(min, max);
845 this.max = Math.max(min, max);
846 }
847
848 @Override
849 public boolean accept(Fixing.Column column) {
850 for (SectorRange s: column.getSectors()) {
851 int v = s.getSector();
852 if (v >= min && v <= max) {
853 return true;
854 }
855 }
856 return false;
857 }
858 } // class SectorRangeFilter
859
686 public void generateOverview(Document document) { 860 public void generateOverview(Document document) {
687 generateOverview(document, FULL_EXTENT); 861 generateOverview(document, FULL_EXTENT, ACCEPT);
688 } 862 }
689 863
690 public void generateOverview(Document document, Range range) { 864 public void generateOverview(
691 865 Document document,
866 Range range,
867 Fixing.Filter filter
868 ) {
692 List<Fixing.Column> allColumns = new ArrayList<Fixing.Column>(); 869 List<Fixing.Column> allColumns = new ArrayList<Fixing.Column>();
693 870
694 for (Fixing fixing: fixings) { 871 for (Fixing fixing: fixings) {
695 fixing.addAllColumns(allColumns, range); 872 fixing.addAllColumns(allColumns, range, filter);
696 } 873 }
697 874
698 Collections.sort(allColumns, Fixing.DATE_CMP); 875 Collections.sort(allColumns, Fixing.DATE_CMP);
699 876
700 Element fixingsElement = document.createElement("fixings"); 877 Element fixingsElement = document.createElement("fixings");
711 888
712 Element esE = document.createElement("events"); 889 Element esE = document.createElement("events");
713 890
714 for (Fixing.Column column: allColumns) { 891 for (Fixing.Column column: allColumns) {
715 892
716 // TODO: Apply additional filters here. 893 List<SectorRange> sectors = column.getSectors(range);
717 List<SectorRange> sectors = column.getSectors();
718 894
719 if (!sectors.isEmpty()) { 895 if (!sectors.isEmpty()) {
720 Element eE = document.createElement("event"); 896 Element eE = document.createElement("event");
721 eE.setAttribute("name", 897 eE.setAttribute("name",
722 String.valueOf(column.getFixing().description)); 898 String.valueOf(column.getFixing().description));

http://dive4elements.wald.intevation.org