package org.drools.semantics.util.area;
import org.drools.semantics.builder.model.Concept;
import org.drools.semantics.builder.model.OntoModel;
import org.drools.semantics.builder.model.PropertyRelation;
import org.drools.util.HierarchyEncoder;
import org.drools.util.HierarchyEncoderImpl;
import org.drools.util.HierarchySorter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.BitSet;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
public abstract class AreaTxnImpl<C,P> implements AreaTxn<C,P> {
public static boolean showDebugInfo = false;
private HierarchyEncoder<AreaNode<C,P>> encoderArea = new HierarchyEncoderImpl<AreaNode<C,P>>();
private Map<Set<P>, AreaNode<C,P>> areas;
public abstract List<C> getInElements();
public abstract Set<P> getInKeys();
public Map<Set<P>, AreaNode<C,P>> getAreas() {
return areas;
}
public Collection<Set<P>> getAreaKeys() {
return areas.keySet();
}
public HierarchyEncoder<AreaNode<C,P>> getEncoderArea() {
return encoderArea;
}
//not used
public Collection<C> getElements( Set<P> keys ) {
return areas.get( keys ).getElements();
}
public boolean hasArea( Set<P> keys ) {
return areas.containsKey( keys );
}
public Area<C,P> getArea( Set<P> keys ) {
return areas.get( keys );
}
// //not used
// public Set<Concept> getArea( Set<P> relations ) {
//
// Set<Concept> area = new HashSet<Concept>();
// int eNum = relations.size();
//
// for( Concept cct : getInElements ) {
// Set<PropertyRelation> pRel = new HashSet<PropertyRelation>( cct.getProperties().values() );
// //System.out.println("pRel: "+pRel);
// if( pRel.size() != eNum )
// continue;
// int mNum = 0;
//
// for( PropertyRelation prRel : relations )
// {
// boolean included = false;
// for( PropertyRelation pr : pRel )
// {
// if( prRel.equals( pr ) ) {
// mNum++;
// pRel.remove(pr);
// included = true;
// break;
// }
// }
// if( ! included )
// break;
// }
// if( mNum == eNum )
// area.add(cct);
// }
//
// return area;
// }
public Map<Integer,HierarchyEncoder<Concept>> getPartialArea(Map<Integer, Set<Concept>> areas, Map<Integer, Set<Concept>> roots) {
HierarchyEncoder<Concept> encoder = null;
Map<Integer,HierarchyEncoder<Concept>> partialArea = new HashMap<Integer, HierarchyEncoder<Concept>>();
for( int i = 0; i < areas.size(); i++ ) {
Set<Concept> area = areas.get( i );
for( Concept root: roots.get( i ) ) {
encoder = new HierarchyEncoderImpl<Concept>();
encoder.encode( root,Collections.EMPTY_LIST );
for ( Concept subcon: root.getSubConcepts() ) {
if ( area.contains( subcon ) ) {
encoder.encode( subcon,Arrays.asList( root ) );
}
}
}
partialArea.put( i, encoder );
}
return partialArea;
}
public void getOverlappedConcepts() {
}
public void getBaseOverlappingRoots() {
}
protected abstract Map<Set<P>, AreaNode<C,P>> initNodes();
public void makeAreaNodes() {
areas = initNodes();
}
public Map<AreaNode<C,P>, Set<C>> makeAreaRoots() {
if ( areas==null || areas.isEmpty() ) {
return null;
}
Map<AreaNode<C,P>,Set<C>> roots = new HashMap<AreaNode<C,P>, Set<C>>( areas.size() );
Iterator<AreaNode<C,P>> it = areas.values().iterator();
AreaNode node = null;
while( it.hasNext() ) {
node = it.next();
Set<C> rb = new HashSet<C>(
node.getConHir().lowerBorder( node.getRootBitSet() )
);
roots.put( node, rb );
node.setRoots( rb );
}
return roots;
}
public HierarchyEncoder<AreaNode<C,P>> makeAreaNodeHierarchy() {
Map<AreaNode<C,P>,Collection<AreaNode<C,P>>> hir = new HashMap<AreaNode<C,P>, Collection<AreaNode<C,P>>>( areas.size() );
for( AreaNode<C,P> child : areas.values() ) {
Collection<AreaNode<C,P>> parents = new ArrayList<AreaNode<C,P>>();
for( AreaNode<C,P> node : areas.values() ) {
if ( child != node && child.getKeys().containsAll( node.getKeys() ) ) {
parents.add( node );
}
}
hir.put( child, parents );
}
//Map<AreaNode,Collection<AreaNode>> hir//
//hir.key is an area node and hir.value is a collection of its parents//
HierarchySorter<AreaNode<C,P>> hSorter = new HierarchySorter<AreaNode<C,P>>();
List<AreaNode<C,P>> sorted = hSorter.sort( hir );
if( showDebugInfo ) {
System.out.println("\nChild-of relations:");
}
//note: assumed that the root has an empty set as its parents: Collections.EMPTY_LIST
for( AreaNode<C,P> node : sorted ) {
node.setAreaCode( encoderArea.encode( node, hir.get( node ) ) );
if( showDebugInfo ) {
System.out.println( node + "\n-->\n" + node.getImmediateParents() + "\n%%---%%" );
}
}
return encoderArea;
}
protected void buildAreas() {
makeAreaNodes();
makeAreaRoots();
makeAreaNodeHierarchy();
}
}