Here's the basic idea behind the code. An Analysis has lots of different columns, which have a class hierarchy like this
- AnalysisColumn
- ScoreColumn
- RawDataScoreColumn
- ComputedColumn (subclasses not shown)
- NonScoreColumn
- InfectionColumn
- WellColumn
- VirusColumn
We want to create policies that define whether a column is shown or hidden, for a certain set of columns. We create policies for ScoreColumn, InfectionColumn, WellColumn, and VirusColumn. Each of these policies is a case object. We can look at these as the enumeration values in a Java enumeration. We do need to iterate over these in other places, (e.g., when exposing them in the UI), so we maintain sequences of these values in the ColumnViewPolicy object.
We also want to have column view policies that function over all types of analysis columns. We do this by creating a composite object that contains one policy each of ScoreColumn, InfectionColumn, WellColumn, and VirusColumn. To determine the viewability of a column, the composite delegates to the contained policy corresponding to the type of the column. Pattern matching makes it easy to delegate. We use a case class to implement the composite, which makes a lot of things easy, such as creating a new composite from an old one by replacing one of the contained policies.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package org.broadinstitute.toolkit | |
package core.domain.analysis | |
/** | |
* Maintains sequences of singleton column view policies by the policy | |
* type. Also contains the composite column view policy that is used by | |
* default in an analysis. | |
*/ | |
object ColumnViewPolicy { | |
/** The default analysis column view policy. */ | |
val defaultAnalysisColumnViewPolicy = | |
CompositeColumnViewPolicy( | |
ShowAllScoreColumnViewPolicy, | |
ShowVisibleByDefaultInfectionColumnViewPolicy, | |
ShowVisibleByDefaultWellColumnViewPolicy, | |
HideAllVirusColumnViewPolicy) | |
/** | |
* The available view policies applicable to a | |
* [[[org.broadinstitute.toolkit.core.domain.analysis.ScoreColumn]]]. | |
*/ | |
val scoreColumnViewPolicies = Seq( | |
ShowAllScoreColumnViewPolicy, | |
ShowRawColumnsOnlyViewPolicy, | |
ShowComputedColumnsOnlyViewPolicy, | |
HideComputedColumnsParentsViewPolicy) | |
/** | |
* The available view policies applicable to an | |
* [[[org.broadinstitute.toolkit.core.domain.analysis.InfectionColumn]]]. | |
*/ | |
val infectionColumnViewPolicies = Seq( | |
ShowAllInfectionColumnViewPolicy, | |
ShowVisibleByDefaultInfectionColumnViewPolicy, | |
HideAllInfectionColumnViewPolicy) | |
/** | |
* The available view policies applicable to a | |
* [[[org.broadinstitute.toolkit.core.domain.analysis.WellColumn]]]. | |
*/ | |
val wellColumnViewPolicies = Seq( | |
ShowAllWellColumnViewPolicy, | |
ShowVisibleByDefaultWellColumnViewPolicy, | |
HideAllWellColumnViewPolicy) | |
/** | |
* The available view policies applicable to a | |
* [[[org.broadinstitute.toolkit.core.domain.analysis.VirusColumn]]]. | |
* | |
* A `ShowVisibleByDefaultVirusColumnViewPolicy` is not needed since all | |
* virus columns are hidden by default | |
*/ | |
val virusColumnViewPolicies = Seq( | |
ShowAllVirusColumnViewPolicy, | |
HideAllVirusColumnViewPolicy) | |
} | |
/** | |
* A policy that describes which columns of a certain type should be shown, | |
* and which should be hidden. | |
* | |
* @tparam A the type of analysis column that this policy is applicable to | |
*/ | |
sealed abstract class ColumnViewPolicy[A <: AnalysisColumn] { | |
/** A plain-text policy title suitable for UI controls. */ | |
val policyTitle: String | |
/** | |
* Under this policy, should the given column be visible for | |
* the given analysis? | |
*/ | |
def isColumnVisible(analysis: Analysis, column: A): Boolean | |
} | |
/** | |
* A column view policy that applies to a single category of | |
* columns, one of: score columns; infection columns; well | |
* columns; or virus columns. | |
* | |
* @tparam A the type of column that this policy is applicable to | |
*/ | |
abstract class LeafColumnViewPolicy[A <: AnalysisColumn] | |
extends ColumnViewPolicy[A] | |
/** | |
* A "show all" column view policy strategy. | |
* | |
* @tparam A the type of column that this policy is applicable to | |
*/ | |
trait ShowAllColumnViewPolicy[A <: AnalysisColumn] | |
extends LeafColumnViewPolicy[A] { | |
override def isColumnVisible(analysis: Analysis, column: A) = true | |
} | |
/** | |
* A "hide all" column view policy strategy. | |
* | |
* @tparam A the type of column that this policy is applicable to | |
*/ | |
trait HideAllColumnViewPolicy[A <: AnalysisColumn] | |
extends LeafColumnViewPolicy[A] { | |
override def isColumnVisible(analysis: Analysis, column: A) = false | |
} | |
/** A score column view policy. */ | |
abstract class ScoreColumnViewPolicy extends | |
LeafColumnViewPolicy[ScoreColumn] | |
/** The "show all" score column view policy. */ | |
case object ShowAllScoreColumnViewPolicy | |
extends ScoreColumnViewPolicy | |
with ShowAllColumnViewPolicy[ScoreColumn] { | |
override val policyTitle = "Show All Score Columns" | |
} | |
/** | |
* A score policy that only shows infection well columns. | |
*/ | |
case object ShowRawColumnsOnlyViewPolicy extends ScoreColumnViewPolicy { | |
override val policyTitle = "Show Raw Columns Only" | |
override def isColumnVisible(analysis: Analysis, column: ScoreColumn) = column match { | |
case c: RawDataScoreColumn => true | |
case _ => false | |
} | |
} | |
/** | |
* A score policy that only shows computed columns. | |
*/ | |
case object ShowComputedColumnsOnlyViewPolicy extends ScoreColumnViewPolicy { | |
override val policyTitle = "Show Computed Columns Only" | |
override def isColumnVisible(analysis: Analysis, column: ScoreColumn) = column match { | |
case c: RawDataScoreColumn => false | |
case _ => true | |
} | |
} | |
/** | |
* A score policy that shows all computed columns, unless they were used | |
* in the derivation of a computed column. | |
*/ | |
case object HideComputedColumnsParentsViewPolicy extends ScoreColumnViewPolicy { | |
override val policyTitle = "Hide Parents of Computed Columns" | |
override def isColumnVisible(analysis: Analysis, column: ScoreColumn) = | |
analysis.scoreColumns.filter { | |
_ match { | |
case c: ComputedScoreColumn => c.parentColumns.contains(column) | |
case _ => false | |
} | |
}.isEmpty | |
} | |
/** | |
* A column view policy that applies to a single category of | |
* non-score columns, one of: infection columns; well | |
* columns; or virus columns. | |
* | |
* @tparam A the type of column that this policy is applicable to | |
*/ | |
abstract class NonScoreColumnViewPolicy[A <% NonScoreColumn] | |
extends LeafColumnViewPolicy[A] | |
/** | |
* A "show visible by default" non-score column view policy strategy. | |
* | |
* @tparam A the type of column that this policy is applicable to | |
*/ | |
trait ShowVisibleByDefaultNonScoreColumnViewPolicy[A <: NonScoreColumn] | |
extends NonScoreColumnViewPolicy[A] { | |
override def isColumnVisible(analysis: Analysis, column: A) = column.visibleByDefault | |
} | |
/** An infection column view policy. */ | |
abstract class InfectionColumnViewPolicy | |
extends NonScoreColumnViewPolicy[InfectionColumn] | |
/** The "show all" infection column view policy. */ | |
case object ShowAllInfectionColumnViewPolicy | |
extends InfectionColumnViewPolicy | |
with ShowAllColumnViewPolicy[InfectionColumn] { | |
override val policyTitle = "Show All Infection Columns" | |
} | |
/** The "show visible by default" infection column view policy. */ | |
case object ShowVisibleByDefaultInfectionColumnViewPolicy | |
extends InfectionColumnViewPolicy | |
with ShowVisibleByDefaultNonScoreColumnViewPolicy[InfectionColumn] { | |
override val policyTitle = "Show Batch Only" | |
} | |
/** The "hide all" infection column view policy. */ | |
case object HideAllInfectionColumnViewPolicy | |
extends InfectionColumnViewPolicy | |
with HideAllColumnViewPolicy[InfectionColumn] { | |
override val policyTitle = "Hide All Infection Columns" | |
} | |
/** A well column view policy. */ | |
abstract class WellColumnViewPolicy | |
extends NonScoreColumnViewPolicy[WellColumn] | |
/** The "show all" well column view policy. */ | |
case object ShowAllWellColumnViewPolicy | |
extends WellColumnViewPolicy with ShowAllColumnViewPolicy[WellColumn] { | |
override val policyTitle = "Show All Well Columns" | |
} | |
/** The "show visible by default" well column view policy. */ | |
case object ShowVisibleByDefaultWellColumnViewPolicy | |
extends WellColumnViewPolicy | |
with ShowVisibleByDefaultNonScoreColumnViewPolicy[WellColumn] { | |
override val policyTitle = "Show Plate and Well Only" | |
} | |
/** The "hide all" well column view policy. */ | |
case object HideAllWellColumnViewPolicy | |
extends WellColumnViewPolicy with HideAllColumnViewPolicy[WellColumn] { | |
override val policyTitle = "Hide All Well Columns" | |
} | |
/** A virus column view policy. */ | |
abstract class VirusColumnViewPolicy | |
extends NonScoreColumnViewPolicy[VirusColumn] | |
/** The "show all" virus column view policy. */ | |
case object ShowAllVirusColumnViewPolicy | |
extends VirusColumnViewPolicy with ShowAllColumnViewPolicy[VirusColumn] { | |
override val policyTitle = "Show All Virus Columns" | |
} | |
/** The "hide all" virus column view policy. */ | |
case object HideAllVirusColumnViewPolicy | |
extends VirusColumnViewPolicy with HideAllColumnViewPolicy[VirusColumn] { | |
override val policyTitle = "Hide All Virus Columns" | |
} | |
/** A column view policy that applies to all the columns in an analysis. */ | |
abstract class AnalysisColumnViewPolicy | |
extends ColumnViewPolicy[AnalysisColumn] | |
/** | |
* An analysis column view policy that is implemented by composing leaf | |
* column view policies. | |
*/ | |
case class CompositeColumnViewPolicy( | |
scoreColumnViewPolicy: ScoreColumnViewPolicy, | |
infectionColumnViewPolicy: InfectionColumnViewPolicy, | |
wellColumnViewPolicy: WellColumnViewPolicy, | |
virusColumnViewPolicy: VirusColumnViewPolicy) | |
extends AnalysisColumnViewPolicy { | |
override val policyTitle = "Composite Column View Policy" | |
// the coop-a-dey-gra | |
override def isColumnVisible(analysis: Analysis, column: AnalysisColumn): Boolean = { | |
column match { | |
case c: ScoreColumn => scoreColumnViewPolicy.isColumnVisible(analysis, c) | |
case c: InfectionColumn => infectionColumnViewPolicy.isColumnVisible(analysis, c) | |
case c: WellColumn => wellColumnViewPolicy.isColumnVisible(analysis, c) | |
case c: VirusColumn => virusColumnViewPolicy.isColumnVisible(analysis, c) | |
} | |
} | |
/** | |
* Builds and returns a new `CompositeColumnViewPolicy` with one of the leaf | |
* policies replaced. | |
*/ | |
def updateLeafPolicy(leafPolicy: LeafColumnViewPolicy[_]): CompositeColumnViewPolicy = { | |
leafPolicy match { | |
case p: ScoreColumnViewPolicy => copy(scoreColumnViewPolicy = p) | |
case p: InfectionColumnViewPolicy => copy(infectionColumnViewPolicy = p) | |
case p: WellColumnViewPolicy => copy(wellColumnViewPolicy = p) | |
case p: VirusColumnViewPolicy => copy(virusColumnViewPolicy = p) | |
} | |
} | |
/** | |
* Returns true whenever the supplied leaf policy is the same as the | |
* leaf column policy used by this composite policy. | |
*/ | |
def leafPolicyMatches(leafPolicy: LeafColumnViewPolicy[_]): Boolean = { | |
leafPolicy match { | |
case p: ScoreColumnViewPolicy => scoreColumnViewPolicy == p | |
case p: InfectionColumnViewPolicy => infectionColumnViewPolicy == p | |
case p: WellColumnViewPolicy => wellColumnViewPolicy == p | |
case p: VirusColumnViewPolicy => virusColumnViewPolicy == p | |
} | |
} | |
} |
No comments:
Post a Comment
Note: Only a member of this blog may post a comment.