docs: function(a,b,aItems, bItems){
  
  		var aClauseProps = this.getClauseProperties(a);
  		var bClauseProps = this.getClauseProperties(b);
  		var algebra = this;
  		var options;
  
  		if(this.subset(a, b)) {
  			return bItems;
  		} else if(this.subset(b, a)) {
  			return aItems;
  		}
  		// neither is a subset of the other
  		var combined;
  		// if either has paginate available, try that
  		if(aClauseProps.enabled.paginate || bClauseProps.enabled.paginate) {
  			options = {};
  			var isUnion = compare.union(aClauseProps.paginate, bClauseProps.paginate, undefined, undefined, undefined,
  				this.clauses.paginate, options);
  
  			// If there isn't a union, return `undefined`.
  			if(!isUnion) {
  				return;
  			}
  			else {
  				each(options.getUnions, function(filter){
  					var items = filter(a,b, aItems, bItems, algebra, options);
  					aItems = items[0];
  					bItems = items[1];
  				});
  				combined = concatUnique(aItems, bItems, this);
  			}
  		} else {
  			combined = concatUnique(aItems, bItems, this);
  		}
  
  		// If sorting is the same, sort the result.
  		if( combined.length && aClauseProps.enabled.order && compare.equal(aClauseProps.order, bClauseProps.order, undefined, undefined, undefined,{},{}) ) {
  			options = {};
  			var propName = h.firstProp(aClauseProps.order),
  				compareOrder = algebra.clauses.order[propName];
  			combined = combined.sort(function(aItem, bItem){
  				return compareOrder(a[propName], aItem, bItem);
  			});
  		}
  
  		return combined;
  	}