Changeset 213


Ignore:
Timestamp:
03/03/10 20:21:17 (14 years ago)
Author:
oschonef
Message:
  • implement basic search feature
Location:
VirtualCollectionRegistry/trunk/VirtualCollectionRegistry
Files:
3 added
1 deleted
10 edited
1 moved

Legend:

Unmodified
Added
Removed
  • VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/pom.xml

    r199 r213  
    1313      <plugin>
    1414        <groupId>org.apache.maven.plugins</groupId>
    15         <artifactId>maven-compiler-plugin</artifactId>
    16         <version>2.1</version>
    17         <configuration>
    18           <source>${maven.compiler.source}</source>
    19           <target>${maven.compiler.target}</target>
    20         </configuration>
     15        <artifactId>maven-antrun-plugin</artifactId>
     16        <version>1.3</version>
     17        <executions>
     18          <execution>
     19            <id>process-jpa-annotations</id>
     20            <phase>generate-sources</phase>
     21            <configuration>
     22              <tasks>
     23                <echo>processing JPA annotations</echo>
     24                <property name="target.dir" value="${project.build.directory}/generated-sources/jpamodelgen"/>
     25                <mkdir dir="${target.dir}"/>
     26                <javac srcdir="${basedir}/src/main/java/eu/clarin/cmdi/virtualcollectionregistry/model"
     27                       destdir="${target.dir}"
     28                       failonerror="false"
     29                       fork="true"
     30                       target="${maven.compiler.target}">
     31                  <compilerarg value="-proc:only"/>
     32                  <classpath>
     33                    <path refid="maven.compile.classpath"/>
     34                  </classpath>
     35                </javac>
     36              </tasks>
     37              <sourceRoot>${project.build.directory}/generated-sources/jpamodelgen</sourceRoot>
     38            </configuration>
     39            <goals>
     40              <goal>run</goal>
     41            </goals>
     42          </execution>
     43        </executions>
    2144      </plugin>
    2245
     
    3356        </executions>
    3457      </plugin>
     58
     59      <plugin>
     60        <groupId>org.apache.maven.plugins</groupId>
     61        <artifactId>maven-compiler-plugin</artifactId>
     62        <version>2.1</version>
     63        <configuration>
     64          <source>${maven.compiler.source}</source>
     65          <target>${maven.compiler.target}</target>
     66        </configuration>
     67      </plugin>
    3568    </plugins>
    3669  </build>
     
    92125
    93126    <dependency>
     127      <groupId>org.hibernate</groupId>
     128      <artifactId>hibernate-jpamodelgen</artifactId>
     129      <version>${hibernate.jpaVersion}</version>
     130      <scope>compile</scope>
     131      <exclusions>
     132        <exclusion>
     133          <!-- Use the jpa-api defined here, crossing fingers they match up signature-wise -->
     134          <groupId>org.hibernate.javax.persistence</groupId>
     135          <artifactId>hibernate-jpa-2.0-api</artifactId>
     136        </exclusion>
     137        <exclusion>
     138          <groupId>org.slf4j</groupId>
     139          <artifactId>slf4j-api</artifactId>
     140        </exclusion>
     141      </exclusions>
     142    </dependency>
     143
     144    <dependency>
    94145      <groupId>commons-lang</groupId>
    95146      <artifactId>commons-lang</artifactId>
  • VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/antlr3/eu/clarin/cmdi/virtualcollectionregistry/query/VCRQL.g

    r190 r213  
    88tokens {
    99    EQ = '=';
    10     LT = '<';
    11     GT = '>';
     10    NE = '!=';
    1211    OR = 'or';
    1312    AND = 'and';
     
    2827
    2928query
    30     : expression EOF -> ^(QUERY<QueryNode> expression)
     29    : expression -> ^(QUERY<QueryNode> expression)
    3130    ;
    3231
     
    4948
    5049atom
    51     : component EQ<RelationNode>^ STRING<StringNode>
    52     | component LT<RelationNode>^ STRING<StringNode>
    53     | component GT<RelationNode>^ STRING<StringNode>
     50    : component EQ<RelationNode>^ STRING<ValueNode>
     51    | component NE<RelationNode>^ STRING<ValueNode>
    5452    ;
    5553
     
    6866
    6967STRING
    70     : '"' ( ESCAPE_SEQUENCE | ~('\u0000'..'\u001f' | '\\' | '\"' ) )* '"'
     68    : '"' ( ESCAPE_SEQUENCE | ~( '\u0000'..'\u001f' | '\\' | '\"' ) )* '"'
    7169    ;
    7270
  • VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/java/eu/clarin/cmdi/virtualcollectionregistry/VirtualCollectionRegistry.java

    r191 r213  
    2020import eu.clarin.cmdi.virtualcollectionregistry.model.VirtualCollectionList;
    2121import eu.clarin.cmdi.virtualcollectionregistry.model.VirtualCollectionValidator;
     22import eu.clarin.cmdi.virtualcollectionregistry.query.ParsedQuery;
    2223
    2324public class VirtualCollectionRegistry {
     
    261262        }
    262263
    263         public VirtualCollectionList getVirtualCollections(int offset, int count)
    264                         throws VirtualCollectionRegistryException {
     264        public VirtualCollectionList getVirtualCollections(String query,
     265                        int offset, int count) throws VirtualCollectionRegistryException {
    265266                EntityManager em = DataStore.instance().getEntityManager();
    266267                try {
    267268                        em.getTransaction().begin();
    268269
     270                        // setup queries
     271                        TypedQuery<Long>              cq = null;
     272                        TypedQuery<VirtualCollection>  q = null;
     273                        if (query != null) {
     274                                ParsedQuery parsedQuery = ParsedQuery.parseQuery(em, query);
     275                                cq = parsedQuery.getCountQuery(null);
     276                                q = parsedQuery.getQuery(null);
     277                        } else {
     278                                cq = em.createNamedQuery("VirtualCollection.countAll",
     279                                                Long.class);
     280                                q = em.createNamedQuery("VirtualCollection.findAll",
     281                                                VirtualCollection.class);
     282                        }
     283
     284                        // commence query ...
    269285                        List<VirtualCollection> results = null;
    270                         TypedQuery<Long> cq =
    271                                 em.createNamedQuery("VirtualCollection.countAll", Long.class);
    272286                        long totalCount = cq.getSingleResult();
    273287
    274288                        // optimization; don't query, if we won't get any results
    275289                        if ( totalCount > 0) {
    276                                 TypedQuery<VirtualCollection> q =
    277                                         em.createNamedQuery("VirtualCollection.findAll",
    278                                                                                 VirtualCollection.class);
    279290                                if (offset > 0) {
    280291                                        q.setFirstResult(offset);
     
    295306
    296307        public VirtualCollectionList getVirtualCollections(Principal principal,
    297                         int offset, int count) throws VirtualCollectionRegistryException {
     308                        String query, int offset, int count)
     309                        throws VirtualCollectionRegistryException {
    298310                if (principal == null) {
    299311                        throw new IllegalArgumentException("principal == null");
     
    303315                        em.getTransaction().begin();
    304316
     317                        // fetch user
    305318                        User user = fetchUser(em, principal);
    306319                        if (user == null) {
     
    308321                        }
    309322
     323                        // setup queries
     324                        TypedQuery<Long>              cq = null;
     325                        TypedQuery<VirtualCollection>  q = null;
     326                        if (query != null) {
     327                                ParsedQuery parsedQuery = ParsedQuery.parseQuery(em, query);
     328                                cq = parsedQuery.getCountQuery(user);
     329                                q = parsedQuery.getQuery(user);
     330                        } else {
     331                                cq = em.createNamedQuery("VirtualCollection.countByOwner", Long.class);
     332                                cq.setParameter("owner", user);
     333                                q = em.createNamedQuery("VirtualCollection.findByOwner",
     334                                                VirtualCollection.class);
     335                                q.setParameter("owner", user);
     336                        }
     337
     338                        // commence query ...
    310339                        List<VirtualCollection> results = null;
    311                         TypedQuery<Long> cq =
    312                                 em.createNamedQuery("VirtualCollection.countByOwner",
    313                                                                         Long.class);
    314                         cq.setParameter("owner", user);
    315340                        long totalCount = cq.getSingleResult();
    316341
    317342                        // optimization; don't query, if we won't get any results
    318343                        if (totalCount > 0) {
    319                                 TypedQuery<VirtualCollection> q =
    320                                         em.createNamedQuery("VirtualCollection.findByOwner",
    321                                                                                 VirtualCollection.class);
    322                                 q.setParameter("owner", user);
    323344                                if (offset > 0) {
    324345                                        q.setFirstResult(offset);
  • VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/java/eu/clarin/cmdi/virtualcollectionregistry/query/BooleanNode.java

    r190 r213  
    3030                        return Operator.OR;
    3131                default:
    32                         throw new IllegalArgumentException("invalid type");
     32                        throw new IllegalArgumentException("bad type: " + type);
    3333                }
    3434        }
  • VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/java/eu/clarin/cmdi/virtualcollectionregistry/query/EntityNode.java

    r190 r213  
    66
    77class EntityNode extends CommonTree implements ParseTreeNode {
    8         private String entity;
     8        public static enum Entity { VC, CREATOR };
     9        private Entity entity;
    910        private String property;
    1011       
    1112        public EntityNode(int type, Token entity, Token property) {
    1213                super(new CommonToken(type, "ENTITY"));
    13                 // check values for sanity!
    14                 this.entity   = entity.getText();
    15                 this.property = property.getText();
     14                this.entity    = entityFromString(entity.getText());
     15                this.property  = propertyFromString(property.getText());
    1616        }
    1717
    18         public String getEntity() {
     18        public Entity getEntity() {
    1919                return entity;
    2020        }
     
    2828        }
    2929
     30        private static Entity entityFromString(String s) {
     31                if (s == null) {
     32                        throw new NullPointerException("s == null");
     33                }
     34                s = s.trim();
     35                if (s.equalsIgnoreCase("vc")) {
     36                         return Entity.VC;
     37                } else if (s.equalsIgnoreCase("creator")) {
     38                        return Entity.CREATOR;
     39                } else {
     40                        throw new IllegalArgumentException("unknown entity: " + s);
     41                }
     42        }
     43
     44        private static String propertyFromString(String s) {
     45                if (s != null) {
     46                        s = s.trim();
     47                }
     48                if ((s == null) || (s.length() < 1)) {
     49                        throw new IllegalArgumentException("property is null or empty");
     50                }
     51                return s.toLowerCase();
     52        }
     53       
    3054} // class EntityNode
  • VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/java/eu/clarin/cmdi/virtualcollectionregistry/query/ParseTreeNodeVisitor.java

    r190 r213  
    55        public void visit(QueryNode node);
    66
     7        public void visit(BooleanNode node);
     8
    79        public void visit(RelationNode node);
    8 
    9         public void visit(BooleanNode node);
    1010
    1111        public void visit(EntityNode node);
    1212
    13         public void visit(StringNode node);
     13        public void visit(ValueNode node);
    1414
    1515} // interface ParseTreeNodeVisitor
  • VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/java/eu/clarin/cmdi/virtualcollectionregistry/query/PrettyPrinter.java

    r190 r213  
    2424        }
    2525
     26        public void visit(BooleanNode node) {
     27                doIndent(node);
     28                out.print("[");
     29                out.print(node.getOperator());
     30                out.println("]");
     31                parents.push(node);
     32                for (int i = 0; i < node.getChildCount(); i++) {
     33                        ParseTreeNode child = (ParseTreeNode) node.getChild(i);
     34                        child.accept(this);
     35                }
     36                parents.pop();
     37        }
     38
    2639        public void visit(RelationNode node) {
    2740                doIndent(node);
     
    3750        }
    3851
    39         public void visit(BooleanNode node) {
    40                 doIndent(node);
    41                 out.print("[");
    42                 out.print(node.getOperator());
    43                 out.println("]");
    44                 parents.push(node);
    45                 for (int i = 0; i < node.getChildCount(); i++) {
    46                         ParseTreeNode child = (ParseTreeNode) node.getChild(i);
    47                         child.accept(this);
    48                 }
    49                 parents.pop();
    50         }
    51 
    5252        public void visit(EntityNode node) {
    5353                doIndent(node);
    54                 out.print(node.getEntity());
     54                switch (node.getEntity()) {
     55                case VC:
     56                        out.print("virtualcollection");
     57                        break;
     58                case CREATOR:
     59                        out.print("creator");
     60                        break;
     61                }
    5562                out.print(".");
    5663                out.println(node.getProperty());
    5764        }
    5865
    59         public void visit(StringNode node) {
     66        public void visit(ValueNode node) {
    6067                doIndent(node);
    6168                out.println(node.getValue());
  • VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/java/eu/clarin/cmdi/virtualcollectionregistry/query/QueryNode.java

    r190 r213  
    22
    33import org.antlr.runtime.CommonToken;
     4import org.antlr.runtime.Token;
    45import org.antlr.runtime.tree.CommonTree;
    56
     
    1011        }
    1112       
     13        public QueryNode(Token token) {
     14                super(token);
     15        }
     16
    1217        public void accept(ParseTreeNodeVisitor visitor) {
    1318                visitor.visit(this);
  • VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/java/eu/clarin/cmdi/virtualcollectionregistry/query/RelationNode.java

    r190 r213  
    44import org.antlr.runtime.tree.CommonTree;
    55
    6 import eu.clarin.cmdi.virtualcollectionregistry.query.VCRQLLexer;
    7 
    86class RelationNode extends CommonTree implements ParseTreeNode {
    9         public static enum Relation { EQ, LT, GT };
     7        public static enum Relation { EQ, NE };
    108        private Relation relation;
    119       
     
    2725                case VCRQLLexer.EQ:
    2826                        return Relation.EQ;
    29                 case VCRQLLexer.LT:
    30                         return Relation.LT;                     
    31                 case VCRQLLexer.GT:
    32                         return Relation.GT;
     27                case VCRQLLexer.NE:
     28                        return Relation.NE;                     
    3329                default:
    34                         throw new IllegalArgumentException("inavlid relation type");
     30                        throw new IllegalArgumentException("bad relation type: " + type);
    3531                }
    3632        }
  • VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/java/eu/clarin/cmdi/virtualcollectionregistry/query/ValueNode.java

    r198 r213  
    44import org.antlr.runtime.tree.CommonTree;
    55
    6 class StringNode extends CommonTree implements ParseTreeNode {
     6class ValueNode extends CommonTree implements ParseTreeNode {
    77        private String value;
    88       
    9         StringNode(Token token) {
     9        ValueNode(Token token) {
    1010                super(token);
    1111                String s = token.getText();
     
    1313                int epos = s.lastIndexOf('"');
    1414                if ((spos != -1) && (epos != -1)) {
    15                         value = s.substring(spos + 1, epos);
    16                 } else {
    17                         value = s;
     15                        s = s.substring(spos + 1, epos);
    1816                }
    19                 // TODO: check escaping
     17                value = s;
    2018        }
    2119
  • VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/java/eu/clarin/cmdi/virtualcollectionregistry/rest/VirtualCollectionRegistryRestService.java

    r190 r213  
    3737import eu.clarin.cmdi.virtualcollectionregistry.model.VirtualCollection;
    3838import eu.clarin.cmdi.virtualcollectionregistry.model.VirtualCollectionList;
    39 import eu.clarin.cmdi.virtualcollectionregistry.query.Search;
    4039
    4140@Path("/")
    4241public class VirtualCollectionRegistryRestService {
    43         private VirtualCollectionRegistry registry =
     42        private final VirtualCollectionRegistry registry =
    4443                VirtualCollectionRegistry.instance();
    4544        @Context
     
    140139                        @DefaultValue("-1") @QueryParam("count") int count)
    141140                        throws VirtualCollectionRegistryException {
    142                 if ( query != null ) {
    143                         Search.doSearch(query);
    144                 }
    145141                final VirtualCollectionList vcs =
    146                         registry.getVirtualCollections((offset > 0) ? offset : 0, count);
     142                        registry.getVirtualCollections(query,
     143                                                                                   (offset > 0) ? offset : 0, count);
    147144                StreamingOutput writer = new StreamingOutput() {
    148145                        public void write(OutputStream stream) throws IOException,
     
    160157                                MediaType.APPLICATION_XML,
    161158                                MediaType.APPLICATION_JSON })
    162         public Response getMyVirtualCollections(
     159        public Response getMyVirtualCollections(@QueryParam("q") String query,
    163160                        @DefaultValue("0") @QueryParam("offset") int offset,
    164161                        @DefaultValue("-1") @QueryParam("count") int count)
     
    169166                }
    170167                final VirtualCollectionList vcs =
    171                                 registry.getVirtualCollections(principal,
    172                                                 (offset > 0) ? offset : 0, count);
     168                        registry.getVirtualCollections(principal, query,
     169                                                                                   (offset > 0) ? offset : 0, count);
    173170                StreamingOutput writer = new StreamingOutput() {
    174171                        public void write(OutputStream stream) throws IOException,
Note: See TracChangeset for help on using the changeset viewer.