anchor.diff:  
   
   [[constraintStreamsFilter]]
  -== Constraint streams API filter
  +== Filter
   
   image::ConstraintStreams/constraintStreamFilter.png[align="center"]
   
   
   [[constraintStreamsJoin]]
  -== Constraint streams join BLAH
  -//COMMENT: waht is join? For example, parameter, argument, function....
  -// COMMENT: Ideally we need to move descriptive text in images out of the images and into the asciidoc. In this example, I would change to this:
  -//The `ContraintStreams: join() BLAH is similar to an SQL inner join. If no other joiners are used,it creates a cartesian  product. The follow illustration demonstrates the `ContraintStreams: join() BLAH without joiners."
  -// And then maybe talk about the example, what it is doing and so forth. Is 'cartesian product' something our audience knows?
  +== Join
   
   image::ConstraintStreams/constraintStreamJoinWithoutJoiners.png[align="center"]
   
  
positive.code: 
  
  [[constraintStreamsGroupingAndCollectors]]
  
  == Constraint Stream API grouping and collectors
  
  Grouping collects items in a stream according to user-provided criteria, also called a group key. This is similar to what a `GROUP BY` SQL clause does. Additionally, some grouping operations also accept one or more collectors, which provide various aggregation functions.
  
  For example, the following code snippet groups all processes by the computer they run on, sums up all of the power required by the processes on that computer using the `ConstraintCollectors.sum(...)` collector, and then penalizes every computer whose processes consume more power than is available:
  
  [source,java,options="nowrap"]
  ----
  
negative.code: [collectorsCountDistinct]
  ==== Collecting `countDistinct()`
  
  The `ConstraintCollectors.countDistinct(...)` counts any element in a group once, regardless of how many times it
  occurs. For example, the following use of the collector gives a number of talks in each unique room.
  
  [source,java,options="nowrap"]
  ----
  