    001/*
    002 * Copyright (c) 2007-2016 Concurrent, Inc. All Rights Reserved.
    003 *
    004 * Project and contact information: http://www.cascading.org/
    005 *
    006 * This file is part of the Cascading project.
    007 *
    008 * Licensed under the Apache License, Version 2.0 (the "License");
    009 * you may not use this file except in compliance with the License.
    010 * You may obtain a copy of the License at
    011 *
    012 *     http://www.apache.org/licenses/LICENSE-2.0
    013 *
    014 * Unless required by applicable law or agreed to in writing, software
    015 * distributed under the License is distributed on an "AS IS" BASIS,
    016 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    017 * See the License for the specific language governing permissions and
    018 * limitations under the License.
    019 */
    020
    021package cascading.flow.planner.rule.partitioner;
    022
    023import java.util.ArrayList;
    024import java.util.Arrays;
    025
    026import cascading.flow.planner.iso.ElementAnnotation;
    027import cascading.flow.planner.iso.expression.ExpressionGraph;
    028import cascading.flow.planner.iso.subgraph.GraphPartitioner;
    029import cascading.flow.planner.iso.subgraph.partitioner.ExpressionGraphPartitioner;
    030import cascading.flow.planner.rule.PlanPhase;
    031import cascading.flow.planner.rule.RuleExpression;
    032import cascading.flow.planner.rule.RulePartitioner;
    033
    034/**
    035 * Class ExpressionRulePartitioner relies on a {@link cascading.flow.planner.rule.RuleExpression} to identify
    036 * sub-graphs as partitions.
    037 */
    038public class ExpressionRulePartitioner extends RulePartitioner
    039  {
    040  Enum[] annotationExcludes = new Enum[ 0 ];
    041
    042  public ExpressionRulePartitioner( PlanPhase phase, RuleExpression ruleExpression )
    043    {
    044    this( phase, ruleExpression.getContractionExpression(), ruleExpression.getMatchExpression() );
    045    }
    046
    047  public ExpressionRulePartitioner( PlanPhase phase, RuleExpression ruleExpression, ElementAnnotation... annotations )
    048    {
    049    this( phase, ruleExpression.getContractionExpression(), ruleExpression.getMatchExpression(), annotations );
    050    }
    051
    052  public ExpressionRulePartitioner( PlanPhase phase, RuleExpression ruleExpression, Enum... annotationExcludes )
    053    {
    054    this( phase, ruleExpression.getContractionExpression(), ruleExpression.getMatchExpression() );
    055
    056    if( annotationExcludes != null )
    057      this.annotationExcludes = annotationExcludes;
    058    }
    059
    060  public ExpressionRulePartitioner( PlanPhase phase, PartitionSource partitionSource, RuleExpression ruleExpression )
    061    {
    062    this( phase, partitionSource, ruleExpression.getContractionExpression(), ruleExpression.getMatchExpression() );
    063    }
    064
    065  public ExpressionRulePartitioner( PlanPhase phase, PartitionSource partitionSource, RuleExpression ruleExpression, ElementAnnotation... annotations )
    066    {
    067    this( phase, partitionSource, ruleExpression.getContractionExpression(), ruleExpression.getMatchExpression(), annotations );
    068    }
    069
    070  public ExpressionRulePartitioner( PlanPhase phase, PartitionSource partitionSource, RuleExpression ruleExpression, Enum... annotationExcludes )
    071    {
    072    this( phase, partitionSource, ruleExpression.getContractionExpression(), ruleExpression.getMatchExpression() );
    073
    074    if( annotationExcludes != null )
    075      this.annotationExcludes = annotationExcludes;
    076    }
    077
    078  private ExpressionRulePartitioner( PlanPhase phase, ExpressionGraph contractionGraph, ExpressionGraph expressionGraph, ElementAnnotation... annotations )
    079    {
    080    this.phase = phase;
    081    this.graphPartitioner = createExpressionGraphPartitioner( contractionGraph, expressionGraph, annotations );
    082    }
    083
    084  private ExpressionRulePartitioner( PlanPhase phase, PartitionSource partitionSource, ExpressionGraph contractionGraph, ExpressionGraph expressionGraph, ElementAnnotation... annotations )
    085    {
    086    this.phase = phase;
    087    this.partitionSource = partitionSource;
    088    this.graphPartitioner = createExpressionGraphPartitioner( contractionGraph, expressionGraph, annotations );
    089    }
    090
    091  protected ExpressionRulePartitioner( PlanPhase phase, GraphPartitioner graphPartitioner )
    092    {
    093    this.phase = phase;
    094    this.graphPartitioner = graphPartitioner;
    095    }
    096
    097  protected ExpressionRulePartitioner( PlanPhase phase )
    098    {
    099    this.phase = phase;
    100    }
    101
    102  protected ExpressionRulePartitioner()
    103    {
    104    }
    105
    106  protected ExpressionGraphPartitioner createExpressionGraphPartitioner( ExpressionGraph contractionGraph, ExpressionGraph expressionGraph, ElementAnnotation[] annotations )
    107    {
    108    return new ExpressionGraphPartitioner( contractionGraph, expressionGraph, annotations );
    109    }
    110
    111  private ExpressionGraphPartitioner getExpressionGraphPartitioner()
    112    {
    113    return (ExpressionGraphPartitioner) graphPartitioner;
    114    }
    115
    116  protected ExpressionRulePartitioner setPhase( PlanPhase phase )
    117    {
    118    this.phase = phase;
    119
    120    return this;
    121    }
    122
    123  public ExpressionRulePartitioner setRuleExpression( RuleExpression ruleExpression )
    124    {
    125    this.graphPartitioner = createExpressionGraphPartitioner( ruleExpression.getContractionExpression(), ruleExpression.getMatchExpression(), new ElementAnnotation[ 0 ] );
    126
    127    return this;
    128    }
    129
    130  public ExpressionRulePartitioner addAnnotation( ElementAnnotation annotation )
    131    {
    132    ArrayList<ElementAnnotation> elementAnnotations = new ArrayList<>( Arrays.asList( getExpressionGraphPartitioner().getAnnotations() ) );
    133
    134    elementAnnotations.add( annotation );
    135
    136    getExpressionGraphPartitioner().setAnnotations( elementAnnotations.toArray( new ElementAnnotation[ elementAnnotations.size() ] ) );
    137
    138    return this;
    139    }
    140
    141  public RulePartitioner setAnnotations( ElementAnnotation... annotations )
    142    {
    143    getExpressionGraphPartitioner().setAnnotations( annotations );
    144
    145    return this;
    146    }
    147
    148  public void setAnnotationExcludes( Enum... annotationExcludes )
    149    {
    150    if( annotationExcludes != null )
    151      this.annotationExcludes = annotationExcludes;
    152    }
    153
    154  public RulePartitioner addAnnotationExclude( Enum exclude )
    155    {
    156    ArrayList<Enum> exclusions = new ArrayList<>( Arrays.asList( this.annotationExcludes ) );
    157
    158    exclusions.add( exclude );
    159
    160    this.annotationExcludes = exclusions.toArray( new Enum[ exclusions.size() ] );
    161
    162    return this;
    163    }
    164
    165  @Override
    166  public Enum[] getAnnotationExcludes()
    167    {
    168    return annotationExcludes;
    169    }
    170  }