-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 19 posts ]  Go to page 1, 2  Next
Author Message
 Post subject: [Hibernate Search] Embedded and associated objects
PostPosted: Thu Sep 06, 2007 2:03 pm 
Newbie

Joined: Thu Aug 23, 2007 11:59 am
Posts: 10
Hello, I am not able to index associated objects as well as embedded objects.

This is a simple example that rapresent my problem:

Code:
class A{
@IndexedEmbedded
private B b;
}

class B{
@IndexedEmbedded
private A a;

@IndexedEmbedded
private C c;

@Field
private String place;
}

class C{
  @IndexedEmbedded
  private B b;

  @Field
  private String name;
}


I attend that the A index documents will also contain
the fields b.place and b.c.name.

Instead, i don't "catch" b.c.name.

The annotation

Code:
@IndexedEmbedded


in default mode set depth to infinite
Code:
@IndexedEmbedded(depth="aVeryBigNumber")


Which is the solution?

Thanks


Last edited by terun on Tue Sep 11, 2007 4:49 pm, edited 1 time in total.

Top
 Profile  
 
 Post subject:
PostPosted: Thu Sep 06, 2007 8:28 pm 
Hibernate Team
Hibernate Team

Joined: Sun Sep 14, 2003 3:54 am
Posts: 7256
Location: Paris, France
Are you sure, I have a test case for that AFAIR. maybe your data b.c.name is null, in this case it is not indexed

_________________
Emmanuel


Top
 Profile  
 
 Post subject:
PostPosted: Fri Sep 07, 2007 10:11 am 
Newbie

Joined: Thu Aug 23, 2007 11:59 am
Posts: 10
Yes, I'm sure.

Using, DEPTH=4, for example, i catch b.c.name, but I obtained also
b.c.b.c.name

Not good :(


Top
 Profile  
 
 Post subject:
PostPosted: Fri Sep 07, 2007 12:52 pm 
Hibernate Team
Hibernate Team

Joined: Sun Sep 14, 2003 3:54 am
Posts: 7256
Location: Paris, France
Please post the exact code failing, what you're saying cannot be done with the class you gave.

_________________
Emmanuel


Top
 Profile  
 
 Post subject:
PostPosted: Tue Sep 11, 2007 9:41 am 
Newbie

Joined: Thu Aug 23, 2007 11:59 am
Posts: 10
Code:
@MappedSuperclass
public abstract class XXObject <P extends Proprieta<TP>, TP extends TipologiaProprieta, A extends Area<TP>> extends AnagraficaObject<P, TP, A> {
   
   @Transient
   protected final Log logger = LogFactory.getLog(this.getClass());
   
   @Transient
   private int type;
   
   @Field(index=Index.TOKENIZED)
   private String identificatore;
   
   

   public void setIdentificatore(String identificatore) {
      this.identificatore = identificatore;
   }

   public void setType(int type) {
      this.type = type;
   }

   public String getIdentificatore() {
      return identificatore;
   }
   
   public int getType() {
      return type;
   }

   
}


@Entity
@NamedQueries( {
      ... })
@Inheritance(strategy = InheritanceType.JOINED)
@Indexed(index = "collane")
public class Collana extends
      XXObject<ProprietaCollana, TipologiaProprietaCollana, AreaCollana>
      implements Serializable, Selectable {

   /** chiave primaria */
   @Id
   @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "COLLANA_SEQ")
   @SequenceGenerator(name = "COLLANA_SEQ", sequenceName = "COLLANA_SEQ")
   @DocumentId
   private Integer id;

   
   @OneToMany(mappedBy = "contenitore")
   @Cascade(value = { CascadeType.ALL, CascadeType.DELETE_ORPHAN })
   @IndexedEmbedded @ContainedIn
   private List<Opera> opere;

   @OneToMany
   @Cascade(value = { CascadeType.ALL })
   @IndexedEmbedded @ContainedIn
   private List<Progetto> progettiStandard;

   @ManyToMany
   @Cascade(value = { CascadeType.ALL })
   private List<TipologiaProgetto> tipologieProgettiAmmessi;

   /** operatore responsabile */
   @ManyToOne
   @IndexedEmbedded @ContainedIn
   private Operatore responsabile;

   @Transient
   private Map<String, List<ProprietaCollana>> anagrafica4view = new HashMap<String, List<ProprietaCollana>>();

   @OneToMany(mappedBy = "parent")
   @Cascade(value = { CascadeType.ALL, CascadeType.DELETE_ORPHAN })
   @Field
   @FieldBridge(impl = ProprietaBridge.class)
   @IndexedEmbedded @ContainedIn
   private List<ProprietaCollana> anagrafica;

   public Collana() {
      logger
            .debug("nel costruttore di collana---inizializzo anagrafica e lista di progetti standard");
      anagrafica = new LinkedList<ProprietaCollana>();
      if (getProgettiStandard() == null) {
         setProgettiStandard(new LinkedList<Progetto>());
      }
   }

   public List<ProprietaCollana> getAnagrafica() {
      return anagrafica;
   }

   public String getDisplayValue() {

      if (getAnagrafica4view().get("titolo") != null) {
         logger.debug("**************" + getAnagrafica4view().get("titolo"));
         return getAnagrafica4view().get("titolo").toString();
      }

      logger
            .debug("COLLANA ************** nessun oggetto con key: 'titolo' trovato in anagrafica4view");
      return "VVVV FOR PRESIDENT"; // lista vuota
   }

   public String getIdentifyingValue() {
      return getId().toString();
   }

   public Class<ProprietaCollana> getClassProprieta() {
      return ProprietaCollana.class;
   }

   public Class<TipologiaProprietaCollana> getClassTipologiaProprieta() {
      return TipologiaProprietaCollana.class;
   }

   public Class<AreaCollana> getClassArea() {
      return AreaCollana.class;
   }

   // accessori e setter
   public Integer getId() {
      return id;
   }

   public void setId(Integer id) {
      this.id = id;
   }

   public Operatore getResponsabile() {
      return responsabile;
   }

   public void setResponsabile(Operatore responsabile) {
      this.responsabile = responsabile;
   }

   public List<Opera> getOpere() {
      return opere;
   }

   public void setOpere(List<Opera> opere) {
      this.opere = opere;
   }

   public List<Progetto> getProgettiStandard() {
      return progettiStandard;
   }

   public void setProgettiStandard(List<Progetto> progettiStandard) {
      this.progettiStandard = progettiStandard;
   }

   public List<TipologiaProgetto> getTipologieProgettiAmmessi() {
      return tipologieProgettiAmmessi;
   }

   public void setTipologieProgettiAmmessi(
         List<TipologiaProgetto> tipologieProgettiAmmessi) {
      this.tipologieProgettiAmmessi = tipologieProgettiAmmessi;
   }

}

@Entity
@Table(name = "Opere")
@NamedQueries( {
       ....
})
@Indexed(index="opere")
public class Opera extends XXObject<ProprietaOpera,TipologiaProprietaOpera, AreaOpera>
{
   //public <T extends it.cilea.epi.intranet.anagrafica.TipologiaProprieta, R extends it.cilea.epi.intranet.anagrafica.Proprieta> R createProprieta(T tipologiaProprieta) {return null;};
   public Opera() {
      anagrafica = new LinkedList<ProprietaOpera>();      
   }
   

    /** chiave primaria per l'accesso */
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "OPERA_SEQ")
    @SequenceGenerator(name = "OPERA_SEQ", sequenceName = "OPERA_SEQ")
    @DocumentId
    private Integer id;

   
    @ManyToOne
    @IndexedEmbedded @ContainedIn
    private Operatore responsabile;

   
    @ManyToOne(fetch = FetchType.LAZY)
    @IndexedEmbedded @ContainedIn
    private Collana contenitore;
   
    @ManyToOne(fetch = FetchType.LAZY)
    @IndexedEmbedded @ContainedIn
    private Rivista rivista;

    /
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "opera")
    @Cascade(value = { CascadeType.ALL })
    @IndexedEmbedded @ContainedIn
    private List<Pubblicazione> pubblicazioni;

   
    @OneToMany(mappedBy = "opera")
    @Cascade(value = { CascadeType.ALL })
    @IndexedEmbedded @ContainedIn
    private List<Allegato> oggetti;

   
    @OneToMany(mappedBy = "opera")
    @Cascade(value = { CascadeType.ALL })
    @IndexedEmbedded @ContainedIn
    private List<Progetto> progetti;

   
    private int versione;

   
    @OneToMany(mappedBy = "parent")
    @Cascade(value = { CascadeType.ALL, CascadeType.DELETE_ORPHAN })
    @Field
    @FieldBridge(impl=ProprietaBridge.class)
    @IndexedEmbedded @ContainedIn
    private List<ProprietaOpera> anagrafica;

    @Transient
    private Map<String, List<ProprietaOpera>> anagrafica4view = new HashMap<String, List<ProprietaOpera>>();


    public Integer getId()
    {
        return id;
    }

    public void setId(Integer id)
    {
        this.id = id;
    }

    public List<Allegato> getOggetti()
    {
        return oggetti;
    }

    protected void setOggetti(List<Allegato> oggetti)
    {
        this.oggetti = oggetti;
    }

    public List<Progetto> getProgetti()
    {
        return progetti;
    }

    public void setProgetti(List<Progetto> progetti)
    {
        this.progetti = progetti;
    }

    public List<Pubblicazione> getPubblicazioni()
    {
        return pubblicazioni;
    }

    public void setPubblicazioni(List<Pubblicazione> pubblicazioni)
    {
        this.pubblicazioni = pubblicazioni;
    }

    public Operatore getResponsabile()
    {
        return responsabile;
    }

    public void setResponsabile(Operatore responsabile)
    {
        this.responsabile = responsabile;
    }

    public int getVersione()
    {
        return versione;
    }

    public void setVersione(int versione)
    {
        this.versione = versione;
    }

 
    public List<ProprietaOpera> getAnagrafica()
    {
        Collections.sort(anagrafica);
        return anagrafica;
    }


   public Collana getContenitore() {
      return contenitore;
   }

   public void setContenitore(Collana contenitore) {
      this.contenitore = contenitore;
   }

   
   
   public Class<ProprietaOpera> getClassProprieta() {
      return ProprietaOpera.class;
   }
   
   public Class<TipologiaProprietaOpera> getClassTipologiaProprieta() {
      return TipologiaProprietaOpera.class;
   }
   
   public Class<AreaOpera> getClassArea() {
      return AreaOpera.class;
   }

   public Rivista getRivista() {
      return rivista;
   }

   public void setRivista(Rivista rivista) {
      this.rivista = rivista;
   }

}

@Entity
@Table (name="Pubblicazioni")
@NamedQueries( {
       ..   
})
@Indexed(index="pubblicazioni")
public class Pubblicazione extends XXObject<ProprietaPubblicazione, TipologiaProprietaPubblicazione, AreaPubblicazione> implements TypeSupport<ProprietaPubblicazione, TipologiaProprietaPubblicazione, AreaPubblicazione>{
   
   
   @Id
   @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "PUBBLICAZIONE_SEQ")
   @SequenceGenerator(name = "PUBBLICAZIONE_SEQ", sequenceName = "PUBBLICAZIONE_SEQ")
   @DocumentId
   private Integer id;
    
   
   
   @OneToMany (mappedBy="pubblicazione", fetch=FetchType.LAZY)
   @Cascade(value = { CascadeType.ALL, CascadeType.DELETE_ORPHAN })
   @IndexedEmbedded @ContainedIn
   private List<Allegato> oggetti;

   
   
   @OneToMany (mappedBy="pubblicazione")
   @Cascade(value = { CascadeType.ALL, CascadeType.DELETE_ORPHAN })
   @IndexedEmbedded @ContainedIn
   private List<Parte> parti;
   
   
   @ManyToOne
   @IndexedEmbedded @ContainedIn
   private Operatore responsabile;
   
   @OneToMany(mappedBy="parent")
    @Cascade(value = { CascadeType.ALL, CascadeType.DELETE_ORPHAN })
    @Field
    @FieldBridge(impl=ProprietaBridge.class)
    @IndexedEmbedded @ContainedIn
    private List<ProprietaPubblicazione> anagrafica;
   
   
   @Transient
   private Map<String, List<ProprietaPubblicazione>> anagrafica4view = new HashMap<String, List<ProprietaPubblicazione>>();

   
   private int versione;
   
   
   @ManyToOne(fetch = FetchType.LAZY)
   @IndexedEmbedded @ContainedIn
   private Progetto progetto;
   
   
   
   @ManyToOne(fetch = FetchType.LAZY)
   private TipologiaPubblicazione tipologia;
   
   
   @ManyToOne(fetch = FetchType.LAZY)
   @IndexedEmbedded @ContainedIn
   private Opera opera;
   
   //costruttore e metodi
   public Pubblicazione() {
      anagrafica = new LinkedList<ProprietaPubblicazione>();
      
      }

   public Allegato createAllegato() {
      Allegato allegato = new Allegato();
      allegato.setPubblicazione(this);
      if(oggetti==null)
         oggetti = new LinkedList<Allegato>();
      oggetti.add(allegato);
      return allegato;
   }
   
   //accessori e setter   
   public Opera getOpera() {
      return opera;
   }
   public void setOpera(Opera opera) {
      this.opera = opera;
   }

   public List<Allegato> getOggetti() {
      return oggetti;
   }
   public void setOggetti(List<Allegato> oggetti) {
      this.oggetti = oggetti;
   }
   
   public List<Parte> getParti() {
      return parti;
   }
   public void setParti(List<Parte> parti) {
      this.parti = parti;
   }
   public Progetto getProgetto() {
      return progetto;
   }
   public void setProgetto(Progetto progetto) {
      this.progetto = progetto;
   }
   public Operatore getResponsabile() {
      return responsabile;
   }
   public void setResponsabile(Operatore responsabile) {
      this.responsabile = responsabile;
   }

   public TipologiaPubblicazione getTipologia() {
      return tipologia;
   }
   public void setTipologia(TipologiaPubblicazione tipologia) {
      this.tipologia = tipologia;
   }
   public int getVersione() {
      return versione;
   }
   public void setVersione(int versione) {
      this.versione = versione;
   }

   public List<ProprietaPubblicazione> getAnagrafica() {
      return anagrafica;
   }
   public Integer getId() {
      return id;
   }
   public void setId(Integer id) {
      this.id = id;
   }

   public Class<ProprietaPubblicazione> getClassProprieta() {
      return ProprietaPubblicazione.class;
   }
   
   public Class<TipologiaProprietaPubblicazione> getClassTipologiaProprieta() {
      return TipologiaProprietaPubblicazione.class;
   }
   
   public Class<AreaPubblicazione> getClassArea() {
      return AreaPubblicazione.class;
   }
}



My problem is always this:
I attend that the collane index documents contains
opera.anagrafica...
but also
opera.pubblicazione.anagrafica..


Last edited by terun on Tue Sep 11, 2007 4:43 pm, edited 1 time in total.

Top
 Profile  
 
 Post subject:
PostPosted: Tue Sep 11, 2007 3:49 pm 
Hibernate Team
Hibernate Team

Joined: Sun Sep 14, 2003 3:54 am
Posts: 7256
Location: Paris, France
I can't figure out what is going on. can you attach your minimal set of classes that can reproduce the issue. From what I've seen your graph is like

Code:
Collana --anagrafica-->PropietaCollana
            -- opere --> Opera -- publicaxion --> Publicazione -- anagrafica --> PropietaPiblicazione


So it should work

Independently of that, the deep level can be refined at each level
For example taking the A, B C class, you could additionally set

class B {
@IndexEmbedded(depth=1 //or 0 I can't remember) c;
}

That way you won't have

b.c.b.c

But the model without depth should work nevertheless, so your test case would be helpful.

_________________
Emmanuel


Top
 Profile  
 
 Post subject:
PostPosted: Tue Sep 11, 2007 4:40 pm 
Newbie

Joined: Thu Aug 23, 2007 11:59 am
Posts: 10
Code:
Collana
  Opera
     Pubblicazione


Everyone have an anagrafica.

In my project, I would not use depth=0, because (e.g) from Pubblicazione (indexed="pubblicazioni") I want catch also collana.anagrafica

thanks for answers :)


Top
 Profile  
 
 Post subject:
PostPosted: Tue Sep 11, 2007 5:02 pm 
Hibernate Team
Hibernate Team

Joined: Sun Sep 14, 2003 3:54 am
Posts: 7256
Location: Paris, France
Be careful then, Indexes are essentially a denormalized model. so too much depth means that the index grows exponentially (not quite true but you get the idea)

_________________
Emmanuel


Top
 Profile  
 
 Post subject:
PostPosted: Tue Sep 18, 2007 9:50 am 
Newbie

Joined: Thu Aug 23, 2007 11:59 am
Posts: 10
Another question..
Code:
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
class A{
  @GeneratedValue
  @Id
  @DocumentId
  Integer id;
}

class B extends A{
  .....
}


The indexing with Inheritance, works on Hibernate Search?


Top
 Profile  
 
 Post subject:
PostPosted: Tue Sep 18, 2007 10:19 pm 
Hibernate Team
Hibernate Team

Joined: Sun Sep 14, 2003 3:54 am
Posts: 7256
Location: Paris, France
yes if both a @Indexed

_________________
Emmanuel


Top
 Profile  
 
 Post subject: Just to verify...
PostPosted: Thu Oct 18, 2007 5:41 pm 
Newbie

Joined: Thu Oct 18, 2007 5:27 pm
Posts: 4
With the following class layout (lots of code omitted):

Code:
public class A
{
    @IndexedEmbedded
    private B b;

    @Field(index=Index.TOKENIZED, store=Store.YES)
    private String name;
}

public class B
{
    @IndexedEmbedded
    private C c;

    @Field(index=Index.TOKENIZED, store=Store.YES)
    private String name;
}

public class C
{
    @Field(index=Index.TOKENIZED, store=Store.YES)
    private String name;
}


Should one be able to search based on all of the following fields:

name
b.name
b.c.name (in particular this one)

I see name and b.name after indexing, but there is no sign of b.c.name visible in the Lucene index browser 'Luke'. I have a jUnit test written and can post it and the supporting classes somewhere if needed. Right now, I just wanted to verify that the concept of the sub-sub object index is even something that should work in hibernate-search-3.0.0.GA.

Thanks!


Top
 Profile  
 
 Post subject:
PostPosted: Thu Oct 18, 2007 10:33 pm 
Hibernate Team
Hibernate Team

Joined: Sun Sep 14, 2003 3:54 am
Posts: 7256
Location: Paris, France
Yes it should work. And I believe I ahve a unit test (but I could be wrong).

remember though that if b.c.name is null, then the property is not indexed for the given object, hence you don't see it in Luke

_________________
Emmanuel


Top
 Profile  
 
 Post subject:
PostPosted: Thu Oct 18, 2007 11:08 pm 
Newbie

Joined: Thu Oct 18, 2007 5:27 pm
Posts: 4
I did verify that the 'name' value was not null. I also looked through your unit test which does seem to test a one level deep index, but I didn't see where it did a second.

Issue created with attached jUnit test:
http://opensource.atlassian.com/project ... SEARCH-128

Thanks!


Top
 Profile  
 
 Post subject:
PostPosted: Fri Oct 19, 2007 11:33 am 
Hibernate Team
Hibernate Team

Joined: Sun Sep 14, 2003 3:54 am
Posts: 7256
Location: Paris, France
thanks

_________________
Emmanuel


Top
 Profile  
 
 Post subject: Any progress?
PostPosted: Mon Dec 03, 2007 3:28 am 
Newbie

Joined: Tue Apr 12, 2005 10:37 am
Posts: 6
Is there any progress on this issue? Specifically, are multiple levels of @IndexedEmbedded supported?

I have the same problem reported above, which is that Hibernate Search only indexes one level down. I know that each level works, because I can vary the starting level, and the index always goes one association down but no further.

All entities concerned have appropriate annotations for @Indexed, @IndexedEmbedded, and @ContainedIn

From what I read above, there is no unit test for more than one level deep, so we can assume it doesn't work :-)

Cheers,
John


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 19 posts ]  Go to page 1, 2  Next

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.