2016-06-28 11 views
1

ヘイゼルキャストで階層ツリー構造をクエリする方法を理解しようとしています。 ヘイゼルキャスト階層ツリー構造のクエリ

public class Organization { 
    private long id; 
    private long parentId; 
} 

と私はUserクラスがあります:のは、私は組織のクラスがあるとしましょう

public class NestupUser extends BaseEntity { 
    private long id; 
    private String firstName; 
    private String lastName; 
    private String email; 
    private String password; 
    private long organizationId; 
} 

、私はその組織を持っている組織のすべてのユーザーとすべての組織を見つけたいorganizationId与えられました親として、これらの団体を親として持っています。

私はこれがMapReduceのようなものだと思いますが、1つのMapReduceの一部としてさらに多くのMapReduceタスクを開始できますか?

助けてください。

+0

私は正確にデータ構造を視覚化することはできませんよ。いくつかのサンプルデータを投稿できますか?また、組織とユーザーの期待数は? –

+0

実際にフォーマットすることはできません... 2つの子組織child1とchild2を持つ親orgがあるとします。 Child1にもchild org_1という子があります。親orgを考えると、parent、child1、child2、child1_1のすべてのユーザーを検索したいと考えています。 –

+0

ありがとうございます。また、そのような親組織の数はどのくらいですか? –

答えて

1

私は非正規化マルチマップを構築しました。そのため、特定の組織IDのすべての到達可能な組織を見つけることができました。これは、起動時に別のノードによってまだ設定されていない場合に構造を設定するコードです。また、このクラスは、物事は(行うのは難しい示されていない、ではない)同期構造を維持するために変更したときにコールバックを取得するには、エントリのリスナー・インターフェースを実装します。

@PostConstruct 
public void init() { 
    IMap<String, Organization> organizationMap = organizationService.getMap(); 
    listenerRegistration = organizationMap.addLocalEntryListener(this); 
    MultiMap<String, String> orgStructureMap = getOrgStructureMap(); 
    if (orgStructureMap.keySet().size() == 0) { 
     Collection<Organization> all = organizationService.getAll(null); 
     Set<String> visited = new HashSet<>(); 
     for (Organization next : all) { 
      if (!visited.contains(next.getId())) { 
       while (next != null && next.getParentId() != null && !visited.contains(next.getParentId())) { 
        next = next.getParentOrganization(); 
       } 
       recurseReferences(visited, next); 
      } 
     } 
    } 
} 

private void recurseReferences(Set<String> visited, Organization org) { 
    addAllReferences(org); 
    visited.add(org.getId()); 
    Set<Organization> childOrganizations = org.getChildOrganizations(); 
    for (Organization child : childOrganizations) { 
     recurseReferences(visited, child); 
    } 
} 

private void addAllReferences(Organization organization) { 
    MultiMap<String, String> orgStructureMap = getOrgStructureMap(); 
    String parentId = organization.getParentId(); 
    if (parentId != null) { 
     Set<Map.Entry<String, String>> entries = orgStructureMap.entrySet(); 
     for (Map.Entry<String, String> next : entries) { 
      if (next.getValue().equals(parentId)) { 
       orgStructureMap.put(next.getKey(),organization.getId()); 
      } 
     } 
    } 
    orgStructureMap.put(organization.getId(), organization.getId()); 
} 



private void removeAllReferences(Organization organization) { 
    MultiMap<String, String> orgStructureMap = getOrgStructureMap(); 
    Set<String> keys = orgStructureMap.keySet(); 
    for (String key : keys) { 
     orgStructureMap.remove(key, organization.getId()); 
    } 
}