Wikitty-commits
Threads by month
- ----- 2026 -----
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- 1653 discussions
r1456 - in trunk: wikitty-api/src/main/java/org/nuiton/wikitty/entities wikitty-api/src/main/java/org/nuiton/wikitty/services wikitty-api/src/test/java/org/nuiton/wikitty wikitty-generators/src/main/java/org/nuiton/wikitty/generator
by bpoussin@users.nuiton.org 14 Mar '12
by bpoussin@users.nuiton.org 14 Mar '12
14 Mar '12
Author: bpoussin
Date: 2012-03-14 20:11:21 +0100 (Wed, 14 Mar 2012)
New Revision: 1456
Url: http://nuiton.org/repositories/revision/wikitty/1456
Log:
Evolution #2013: add new constraints tag value on field (min, max, allow)
change contraint field validation implementation, add new constraints
Added:
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/FieldTypeConstaintChecker.java
Modified:
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/FieldFactory.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/FieldType.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceStorage.java
trunk/wikitty-api/src/test/java/org/nuiton/wikitty/WikittyClientTest.java
trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyAbstractGenerator.java
trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyTagValue.java
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/FieldFactory.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/FieldFactory.java 2012-03-14 18:14:38 UTC (rev 1455)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/FieldFactory.java 2012-03-14 19:11:21 UTC (rev 1456)
@@ -74,7 +74,12 @@
minOccur = min;
return this;
}
-
+
+ /**
+ * Si le champs est une collection indique que la collection ne peut pas
+ * contenir de doublon (Set)
+ * @return
+ */
public FieldFactory unique() {
addTagValue(FieldType.TAG_UNIQUE, "true");
return this;
@@ -100,18 +105,33 @@
}
/**
- * Ajoute le nom des extensions autorise pour ce champs (doit etre de type
- * Wikitty). Par exemple: "Person,Employee;Company"
- * Soit l'objet doit avoir Person et Employee soit Company seul
+ * Ajoute la liste de valeurs autorises pour ce champs.
+ * Par exemple pour un champs de type Wikitty: "Person,Employee,Company"
*
- * @param extNames
+ * @param values La liste de valeur en representation chaine (le separateur
+ * est la virgule)
* @return
*/
- public FieldFactory extensionAllowed(String extNames) {
- addTagValue(FieldType.TAG_EXTENSION_ALLOWED, extNames);
+ public FieldFactory allowed(String values) {
+ addTagValue(FieldType.TAG_ALLOWED, values);
return this;
}
+ public FieldFactory allowedQuery(String allowedQuery) {
+ addTagValue(FieldType.TAG_ALLOWED_QUERY, allowedQuery);
+ return this;
+ }
+
+ public FieldFactory choice(String values) {
+ addTagValue(FieldType.TAG_CHOICE, values);
+ return this;
+ }
+
+ public FieldFactory choiceQuery(String choiceQuery) {
+ addTagValue(FieldType.TAG_CHOICE_QUERY, choiceQuery);
+ return this;
+ }
+
/**
* Met a vrai la valeur indexed
* @return
@@ -141,8 +161,36 @@
return this;
}
+ public FieldFactory subtype(String type) {
+ addTagValue(FieldType.TAG_SUBTYPE, type);
+ return this;
+ }
+
+ public FieldFactory min(String v) {
+ addTagValue(FieldType.TAG_MIN, v);
+ return this;
+ }
+
+ public FieldFactory minQuery(String query) {
+ addTagValue(FieldType.TAG_MIN_QUERY, query);
+ return this;
+ }
+
+ public FieldFactory max(String v) {
+ addTagValue(FieldType.TAG_MAX, v);
+ return this;
+ }
+
+ public FieldFactory maxQuery(String query) {
+ addTagValue(FieldType.TAG_MAX_QUERY, query);
+ return this;
+ }
+
+
public FieldFactory addTagValue(String tag, String value) {
tagValues.put(tag, value);
return this;
}
+
+
}
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/FieldType.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/FieldType.java 2012-03-14 18:14:38 UTC (rev 1455)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/FieldType.java 2012-03-14 19:11:21 UTC (rev 1456)
@@ -294,37 +294,116 @@
}
/**
- * @see #TAG_EXTENSION_ALLOWED
+ * @see #TAG_SUBTYPE
*/
- public String getExtensionAllowed() {
- String allowed = getTagValue(TAG_EXTENSION_ALLOWED);
+ public String getSubtype() {
+ String result = getTagValue(TAG_SUBTYPE);
+ return result;
+ }
+ /**
+ * @see #TAG_ALLOWED
+ */
+ public String getAllowed() {
+ String allowed = getTagValue(TAG_ALLOWED);
return allowed;
}
/**
+ * @see #TAG_ALLOWED_QUERY
+ */
+ public String getAllowedQuery() {
+ String allowed = getTagValue(TAG_ALLOWED_QUERY);
+ return allowed;
+ }
+ /**
+ * @see #TAG_CHOICE
+ */
+ public String getChoice() {
+ String result = getTagValue(TAG_CHOICE);
+ return result;
+ }
+ /**
+ * @see #TAG_CHOICE_QUERY
+ */
+ public String getChoiceQuery() {
+ String result = getTagValue(TAG_CHOICE_QUERY);
+ return result;
+ }
+ /**
+ * @see #TAG_MIN
+ */
+ public String getMin() {
+ String result = getTagValue(TAG_MIN);
+ return result;
+ }
+ /**
+ * @see #TAG_MIN_QUERY
+ */
+ public String getMinQuery() {
+ String result = getTagValue(TAG_MIN_QUERY);
+ return result;
+ }
+ /**
+ * @see #TAG_MAX
+ */
+ public String getMax() {
+ String result = getTagValue(TAG_MAX);
+ return result;
+ }
+ /**
+ * @see #TAG_MAX_QUERY
+ */
+ public String getMaxQuery() {
+ String result = getTagValue(TAG_MAX_QUERY);
+ return result;
+ }
+ /**
* @return list or null if not spcified allowed extension
- * @see #TAG_EXTENSION_ALLOWED
+ * @see #TAG_ALLOWED
*/
- public List<List<String>> getExtensionAllowedAsList() {
- List<List<String>> result = null;
- if (isExtensionRestrited()) {
- result = new ArrayList<List<String>>();
- String allowed = getTagValue(TAG_EXTENSION_ALLOWED);
- String[] exts = allowed.split("\\s*;\\s*");
- for (String s : exts) {
- String [] e = s.split("\\s*,\\s*");
- result.add(Arrays.asList(e));
- }
+ public List<String> getAllowedAsList() {
+ List<String> result = null;
+ String allowed = getAllowed();
+ if (StringUtils.isNotBlank(allowed)) {
+ String[] v = allowed.split("\\s*,\\s*");
+ result = Arrays.asList(v);
}
return result;
}
/**
* Si les extensions autorisees pour ce champs est contrainte par le tag value
- * {@link #TAG_EXTENSION_ALLOWED} alors retourne true, sinon false.
- * @see #TAG_EXTENSION_ALLOWED
+ * {@link #TAG_ALLOWED} alors retourne true, sinon false.
+ * @see #TAG_ALLOWED
*/
- public boolean isExtensionRestrited() {
- boolean result = StringUtils.isNotBlank(getExtensionAllowed());
+ public boolean isRestrited() {
+ boolean result = hasAllowed() || hasAllowedQuery();
return result;
}
+
+ public boolean hasAllowed() {
+ boolean result = StringUtils.isNotBlank(getAllowed());
+ return result;
+ }
+
+ public boolean hasAllowedQuery() {
+ boolean result = StringUtils.isNotBlank(getAllowedQuery());
+ return result;
+ }
+ public boolean hasMin() {
+ boolean result = StringUtils.isNotBlank(getMin());
+ return result;
+ }
+ public boolean hasMinQuery() {
+ boolean result = StringUtils.isNotBlank(getMinQuery());
+ return result;
+ }
+
+ public boolean hasMax() {
+ boolean result = StringUtils.isNotBlank(getMax());
+ return result;
+ }
+ public boolean hasMaxQuery() {
+ boolean result = StringUtils.isNotBlank(getMaxQuery());
+ return result;
+ }
}
Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/FieldTypeConstaintChecker.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/FieldTypeConstaintChecker.java (rev 0)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/FieldTypeConstaintChecker.java 2012-03-14 19:11:21 UTC (rev 1456)
@@ -0,0 +1,445 @@
+package org.nuiton.wikitty.entities;
+
+
+import java.math.BigDecimal;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.regex.Pattern;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.nuiton.wikitty.WikittyClient;
+import org.nuiton.wikitty.WikittyService;
+import org.nuiton.wikitty.query.WikittyQuery;
+import org.nuiton.wikitty.query.WikittyQueryMaker;
+import org.nuiton.wikitty.query.WikittyQueryParser;
+import org.nuiton.wikitty.query.WikittyQueryResult;
+
+/**
+ * Cet objets sert a gerer les contraintes qui peuvent exister sur un champs.
+ * On ne les implantes pas dans le champs directement, car l'objet champs aurait
+ * alors des dependances vers des objets complexe (WikittyClient, WikittyService,
+ * Wikitty) chose que l'on ne veut pas.
+ *
+ * @author poussin
+ * @version $Revision$
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class FieldTypeConstaintChecker {
+
+ /** to use log facility, just put in your code: log.info(\"...\"); */
+ static private Log log = LogFactory.getLog(FieldTypeConstaintChecker.class);
+
+ protected WikittyService ws;
+ protected String token;
+
+ /**
+ * Create FieldTypeConstaintChecker usable in client side
+ * @param client client used to do request if needed by tag value
+ */
+ public FieldTypeConstaintChecker(WikittyClient client) {
+ this.ws = client.getWikittyService();
+ this.token = client.getSecurityToken();
+ }
+
+ /**
+ * this constructor must be used only be framework in WikittyServiceStorage.
+ * @param ws
+ */
+ public FieldTypeConstaintChecker(WikittyService ws) {
+ this.ws = ws;
+ }
+
+ /**
+ * check all contraints
+ *
+ * @param fqfield
+ * @param field
+ * @param value
+ * @param errors can be null
+ *
+ * @return true if all contraints is satified, otherwize false
+ */
+ public boolean isValid(String fqfield, FieldType field, Object value, Collection<String> errors) {
+ boolean result = true;
+ // notnull
+ result = result && isNotNull(fqfield, field, value, errors);
+ // unique de collection
+ result = result && isUnique(fqfield, field, value, errors);
+ // pattern
+ result = result && checkPattern(fqfield, field, value, errors);
+ // min et max pour les date et numeric
+ result = result && checkMin(fqfield, field, value, errors);
+ result = result && checkMax(fqfield, field, value, errors);
+ // allowed
+ result = result && isAllowed(fqfield, field, value, errors);
+ return result;
+ }
+
+ public Object getMin(FieldType field) {
+ String min = null;
+ if (field.hasMinQuery()) {
+ String query = field.getMinQuery();
+ WikittyQuery q = WikittyQueryParser.parse(query);
+ List<String> queryResult = ws.findByQuery(token, Collections.singletonList(q));
+ min = queryResult.get(0);
+ }
+
+ if (min == null && field.hasMin()) {
+ min = field.getMin();
+ }
+
+ Object result = null;
+ if (min != null) {
+ result = field.getContainedValidObject(min);
+ }
+ return result;
+ }
+ public Date getMinAsDate(FieldType field) {
+ Date result = (Date)getMin(field);
+ return result;
+ }
+ public BigDecimal getMinAsBigDecimal(FieldType field) {
+ BigDecimal result = (BigDecimal)getMin(field);
+ return result;
+ }
+ public Object getMax(FieldType field) {
+ String max = null;
+ if (field.hasMaxQuery()) {
+ String query = field.getMaxQuery();
+ WikittyQuery q = WikittyQueryParser.parse(query);
+ List<String> queryResult = ws.findByQuery(token, Collections.singletonList(q));
+ max = queryResult.get(0);
+ }
+
+ if (max == null && field.hasMax()) {
+ max = field.getMax();
+ }
+
+ Object result = null;
+ if (max != null) {
+ result = field.getContainedValidObject(max);
+ }
+ return result;
+ }
+ public Date getMaxAsDate(FieldType field) {
+ Date result = (Date)getMax(field);
+ return result;
+ }
+ public BigDecimal getMaxAsBigDecimal(FieldType field) {
+ BigDecimal result = (BigDecimal)getMax(field);
+ return result;
+ }
+
+ public boolean isAllowed(String fqfield, FieldType field, Object value, Collection<String> errors) {
+ boolean result = true;
+ if (value != null && (field.hasAllowed() || field.hasAllowedQuery())) {
+ switch(field.getType()) {
+ case STRING:
+ if (field.isCollection()) {
+ result = isAllowedString(fqfield, field, (Collection<String>)value, errors);
+ } else {
+ result = isAllowedString(fqfield, field, Collections.singleton((String)value), errors);
+ }
+ break;
+ case WIKITTY:
+ if (field.isCollection()) {
+ result = isAllowedWikitty(fqfield, field, (Collection<String>)value, errors);
+ } else {
+ result = isAllowedWikitty(fqfield, field, Collections.singleton((String)value), errors);
+ }
+ break;
+ default:
+ result = true;
+ }
+ }
+ return result;
+ }
+
+ /**
+ * allowed contient une liste d'extension possible, allowedQuery retourne
+ * une liste d'objet possible. Si les deux existes seul allowedQuery est
+ * utilisee, allowed dans ce cas a d'autre usage comme la navigation
+ * entre entity, ou permettre la creation d'une nouvelle entity pour ce
+ * champs suivant une des extensions declaree.
+ *
+ * @param fqfield
+ * @param field
+ * @param ids
+ * @param errors
+ * @return
+ */
+ protected boolean isAllowedWikitty(String fqfield, FieldType field,
+ Collection<String> ids, Collection<String> errors) {
+ boolean result = false;
+
+ WikittyQuery q = null;
+ if (field.hasAllowedQuery()) {
+ // construire les requetes
+ q = WikittyQueryParser.parse(field.getAllowedQuery());
+
+ } else if (field.hasAllowed()) {
+ WikittyQueryMaker maker = new WikittyQueryMaker().or();
+ for (String extName : field.getAllowedAsList()) {
+ maker.exteq(extName);
+ }
+ q = maker.end();
+ }
+
+ List<String> allowed = null;
+ if (q != null) {
+ q.setOffset(0);
+ q.setLimit(WikittyQuery.MAX);
+
+ WikittyQuery wq = new WikittyQueryMaker().containsOne(Element.ID, ids).end();
+ wq.setOffset(0);
+ wq.setLimit(WikittyQuery.MAX);
+
+ List<WikittyQueryResult<String>> queryResult =
+ ws.findAllByQuery(token, Arrays.asList(q, wq));
+ allowed = queryResult.get(0).getAll();
+ List<String> findedIds = queryResult.get(1).getAll();
+
+ // on ne check que sur les ids trouve dans la base et on espere
+ // que les autres sont bon :). En fait, lorsqu'on store plusieurs
+ // wikitties en meme temps donc un wikitty qui doit etre la valeur
+ // d'un champs d'un autre. Celui ci n'est pas retrouvable dans la
+ // base et donc on ne peut pas verifier facilement la contrainte.
+ // Pour l'instant on ne fait rien, car les solutions seraient trop
+ // couteuse (creeer un storage in memory y mettre les objets a
+ // checker, faire le check en requetant le vrai repo et le in memory
+ // si tout va bien faire le store reel sur le vrai repo.
+ result = allowed.containsAll(findedIds);
+ if (log.isDebugEnabled() && findedIds.size() != ids.size()) {
+ log.debug(String.format(
+ "For field '%s' allowed contraint not checked for: %s",
+ fqfield, CollectionUtils.disjunction(findedIds, ids)));
+ }
+ }
+
+ if (errors != null && !result) {
+ errors.add(String.format(
+ "Field '%s' contains unallowed Wikitty values %s allowed %s",
+ fqfield, ids, allowed));
+ }
+ return result;
+ }
+
+ protected boolean isAllowedString(String fqfield, FieldType field,
+ Collection<String> values, Collection<String> errors) {
+ boolean result = false;
+
+ List<String> allowed = null;
+ // on commence par ce qui ne demande pas a faire une requete
+ if (field.hasAllowed()) {
+ allowed = field.getAllowedAsList();
+ result = allowed.containsAll(values);
+ }
+
+ if (!result && field.hasAllowedQuery()) {
+ // construire les requetes
+ String query = field.getAllowedQuery();
+ WikittyQuery q = WikittyQueryParser.parse(query);
+ q.setOffset(0).setLimit(WikittyQuery.MAX);
+ List<WikittyQueryResult<String>> queryResult =
+ ws.findAllByQuery(token, Collections.singletonList(q));
+ allowed = queryResult.get(0).getAll();
+ result = allowed.containsAll(values);
+ }
+
+ if (errors != null && !result) {
+ errors.add(String.format(
+ "Field '%s' contains unallowed string values: %s allowed: %s",
+ fqfield, values, allowed));
+ }
+ return result;
+ }
+
+ public boolean checkPattern(String fqfield, FieldType field, Object value, Collection<String> errors) {
+ boolean result = true;
+ if (value != null && field.hasPattern() && field.getType() == WikittyTypes.STRING) {
+ String pattern = field.getPattern();
+ result = Pattern.matches(pattern, (String)value);
+ if (errors != null && !result) {
+ errors.add(String.format(
+ "Field '%s' must match pattern '%s' but value is '%s'",
+ fqfield, pattern, value));
+ }
+ }
+ return result;
+ }
+
+ public boolean isNotNull(String fqfield, FieldType field, Object value, Collection<String> errors) {
+ boolean result = true;
+ if (field.isNotNull()) {
+ result = value != null;
+ }
+
+ if (errors != null && !result) {
+ errors.add(String.format("Field '%s' contains null value", fqfield));
+ }
+ return result;
+ }
+
+ /**
+ * Vrai si la collection ne contient pas de doublon.
+ * @param field
+ * @param value
+ * @return
+ */
+ public boolean isUnique(String fqfield, FieldType field, Object value, Collection<String> errors) {
+ boolean result = true;
+ if (field.isUnique() && value != null && field.isCollection() && !(value instanceof Set)) {
+ Collection c = (Collection)value;
+ Set s = new HashSet(c);
+ result = s.size() == c.size();
+ }
+
+ if (errors != null && !result) {
+ errors.add(String.format("Field '%s' contains duplicate value", fqfield));
+ }
+ return result;
+ }
+
+ public boolean checkMin(String fqfield, FieldType field, Object value, Collection<String> errors) {
+ boolean result = true;
+ if (value != null && (field.hasMin() || field.hasMinQuery())) {
+ switch(field.getType()) {
+ case DATE: {
+ if (field.isCollection()) {
+ result = checkMinDate(fqfield, field,
+ (Collection<Date>)value, errors);
+ } else {
+ result = checkMinDate(fqfield, field,
+ Collections.singleton((Date)value), errors);
+ }
+ }
+ break;
+ case NUMERIC: {
+ if (field.isCollection()) {
+ result = checkMinBigDecimal(fqfield, field,
+ (Collection<BigDecimal>)value, errors);
+ } else {
+ result = checkMinBigDecimal(fqfield, field,
+ Collections.singleton((BigDecimal)value), errors);
+ }
+ }
+ break;
+ default:
+ result = true;
+ }
+ }
+ return result;
+ }
+
+ protected boolean checkMinDate(String fqfield, FieldType field,
+ Collection<Date> values, Collection<String> errors) {
+ boolean result = true;
+ Date min = getMinAsDate(field);
+ for (Date b : values) {
+ result = min.compareTo(b) <= 0;
+ if (!result) {
+ break;
+ }
+ }
+ if (errors != null && !result) {
+ errors.add(String.format(
+ "Field '%s' contains value higher then '%s': %s",
+ fqfield, min, values));
+ }
+ return result;
+ }
+
+ protected boolean checkMinBigDecimal(String fqfield, FieldType field,
+ Collection<BigDecimal> values, Collection<String> errors) {
+ boolean result = true;
+ BigDecimal min = getMinAsBigDecimal(field);
+ for (BigDecimal b : values) {
+ result = min.compareTo(b) <= 0;
+ if (!result) {
+ break;
+ }
+ }
+ if (errors != null && !result) {
+ errors.add(String.format(
+ "Field '%s' contains value higher then '%s': %s",
+ fqfield, min, values));
+ }
+ return result;
+ }
+
+ public boolean checkMax(String fqfield, FieldType field, Object value, Collection<String> errors) {
+ boolean result = true;
+ if (value != null && (field.hasMax() || field.hasMaxQuery())) {
+ switch(field.getType()) {
+ case DATE: {
+ if (field.isCollection()) {
+ result = checkMaxDate(fqfield, field,
+ (Collection<Date>)value, errors);
+ } else {
+ result = checkMaxDate(fqfield, field,
+ Collections.singleton((Date)value), errors);
+ }
+ }
+ break;
+ case NUMERIC: {
+ if (field.isCollection()) {
+ result = checkMaxBigDecimal(fqfield, field,
+ (Collection<BigDecimal>)value, errors);
+ } else {
+ result = checkMaxBigDecimal(fqfield, field,
+ Collections.singleton((BigDecimal)value), errors);
+ }
+ }
+ break;
+ default:
+ result = true;
+ }
+ }
+ return result;
+ }
+
+ protected boolean checkMaxDate(String fqfield, FieldType field,
+ Collection<Date> values, Collection<String> errors) {
+ boolean result = true;
+ Date max = getMaxAsDate(field);
+ for (Date b : values) {
+ result = max.compareTo(b) >= 0;
+ if (!result) {
+ break;
+ }
+ }
+ if (errors != null && !result) {
+ errors.add(String.format(
+ "Field '%s' contains value lower then '%s': %s",
+ fqfield, max, values));
+ }
+ return result;
+ }
+
+ protected boolean checkMaxBigDecimal(String fqfield, FieldType field,
+ Collection<BigDecimal> values, Collection<String> errors) {
+ boolean result = true;
+ BigDecimal max = getMaxAsBigDecimal(field);
+ for (BigDecimal b : values) {
+ result = max.compareTo(b) >= 0;
+ if (!result) {
+ break;
+ }
+ }
+ if (errors != null && !result) {
+ errors.add(String.format(
+ "Field '%s' contains value lower then '%s': %s",
+ fqfield, max, values));
+ }
+ return result;
+ }
+
+}
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceStorage.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceStorage.java 2012-03-14 18:14:38 UTC (rev 1455)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceStorage.java 2012-03-14 19:11:21 UTC (rev 1456)
@@ -38,8 +38,10 @@
import java.util.Map;
import java.util.Set;
import java.util.LinkedHashSet;
+import java.util.LinkedList;
import java.util.regex.Pattern;
import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -55,6 +57,7 @@
import org.nuiton.wikitty.entities.WikittyTreeNode;
import org.nuiton.wikitty.entities.WikittyTreeNodeHelper;
import org.nuiton.wikitty.WikittyUtil;
+import org.nuiton.wikitty.entities.FieldTypeConstaintChecker;
import org.nuiton.wikitty.entities.WikittyTypes;
import org.nuiton.wikitty.query.WikittyQuery;
import org.nuiton.wikitty.query.WikittyQueryMaker;
@@ -83,6 +86,9 @@
protected WikittyExtensionMigration defaultExtensionMigration =
new WikittyExtensionMigrationRename();
+ protected FieldTypeConstaintChecker contraintChecker =
+ new FieldTypeConstaintChecker(this);
+
protected ApplicationConfig config;
protected WikittySearchEngine searchEngine;
protected WikittyExtensionStorage extensionStorage;
@@ -174,44 +180,17 @@
for(Wikitty w : wikitties) {
for(WikittyExtension ext : w.getExtensions()) {
for (String fieldName : ext.getFieldNames()) {
+ String fqfield = WikittyUtil.getFQFieldName(ext.getName(), fieldName);
FieldType type = ext.getFieldType(fieldName);
- if (type.isNotNull()) {
- if (null == w.getFieldAsObject(ext.getName(), fieldName)) {
- throw new WikittyException(String.format(
- "Field '%s.%s' must not be null",
- ext.getName(), fieldName));
- }
- }
- if (type.hasPattern() && type.getType() == WikittyTypes.STRING) {
- String pattern = type.getPattern();
- String value = w.getFieldAsString(ext.getName(), fieldName);
- if (!Pattern.matches(pattern, value)) {
- throw new WikittyException(String.format(
- "Field '%s.%s' must match pattern '%s' but value is '%s'",
- ext.getName(), fieldName, pattern, value));
- }
- }
- if (type.isExtensionRestrited() && type.getType() == WikittyTypes.WIKITTY) {
- String id = w.getFieldAsWikitty(ext.getName(), fieldName);
- Wikitty wikittyField = restore(null, id);
- if (wikittyField != null) {
- Collection<String> extensionNames =
- wikittyField.getExtensionNames();
+ Object value = w.getFqField(fqfield);
- boolean authorized = false;
- List<List<String>> allowed = type.getExtensionAllowedAsList();
- for (List<String> l : allowed) {
- if (extensionNames.containsAll(l)) {
- authorized = true;
- break;
- }
- }
- if (!authorized) {
- throw new WikittyException(String.format(
- "Field '%s.%s' must have extension '%s' but have '%s'",
- ext.getName(), fieldName, allowed, extensionNames));
- }
- }
+ List<String> errors = new LinkedList<String>();
+
+ if (!contraintChecker.isValid(fqfield, type, value, errors)) {
+ throw new WikittyException(String.format(
+ "Field constraint error %s",
+ StringUtils.join(errors, "\n")));
+
}
}
}
Modified: trunk/wikitty-api/src/test/java/org/nuiton/wikitty/WikittyClientTest.java
===================================================================
--- trunk/wikitty-api/src/test/java/org/nuiton/wikitty/WikittyClientTest.java 2012-03-14 18:14:38 UTC (rev 1455)
+++ trunk/wikitty-api/src/test/java/org/nuiton/wikitty/WikittyClientTest.java 2012-03-14 19:11:21 UTC (rev 1456)
@@ -1066,7 +1066,7 @@
// test strict equals
WikittyQuery query = new WikittyQueryMaker().bw(Product.FQ_FIELD_PRODUCT_PRICE, 14, 99).end();
- query.setLimit(-1);
+ query.setLimit(0);
WikittyQueryResult<Product> results = wikittyClient.findAllByQuery(Product.class, query);
Assert.assertEquals(2, results.getTotalResult());
Assert.assertEquals(0, results.getAll().size());
Modified: trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyAbstractGenerator.java
===================================================================
--- trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyAbstractGenerator.java 2012-03-14 18:14:38 UTC (rev 1455)
+++ trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyAbstractGenerator.java 2012-03-14 19:11:21 UTC (rev 1456)
@@ -239,12 +239,12 @@
// si le champs est de type wikitty et qu'il n'y a pas de tag value
// on regarde s'il faut en generer un
if (StringUtils.equals("Wikitty", wikittyType)
- && null == attribute.getTagValue(TAG_EXTENSION_ALLOWED)) {
+ && null == attribute.getTagValue(TAG_ALLOWED)) {
String type = WikittyTransformerUtil.FQNtoSimpleName(attribute.getType());
if (!StringUtils.equals("Wikitty", type)) {
// dans le modele on a specifie un type particulier, on
// le met comme contrainte
- attribute.getTagValues().put(TAG_EXTENSION_ALLOWED, type);
+ attribute.getTagValues().put(TAG_ALLOWED, type);
}
}
Modified: trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyTagValue.java
===================================================================
--- trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyTagValue.java 2012-03-14 18:14:38 UTC (rev 1455)
+++ trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyTagValue.java 2012-03-14 19:11:21 UTC (rev 1456)
@@ -112,24 +112,120 @@
public static final String TAG_CRYPT = "crypt";
/**
- * extensionAllowed: indique que le champs wikitty ne peut prendre comme
- * valeur que des wikitties ayant les extensions specifiees.
+ * preload: indique les champs de type Wikitty qui doivent etre preloade
+ * lors du chargement de cette extension.
* exemple:
- * <li>Person,Employee;Company
- * Ici il faut que l'objet ait les extensions Person et Employee ou
- * l'extension Company
+ * <li> preload="Company.employee,Employee.person;Company.address"
* <p>
- * <li> target: wikitty type field
+ * <li> target: extension
*/
- public static final String TAG_EXTENSION_ALLOWED = "extensionAllowed";
+ public static final String TAG_PRELOAD = "preload";
/**
- * preload: indique les champs de type Wikitty qui doivent etre preloade
- * lors du chargement de cette extension.
+ * subtype: indique que le champs a un sous type. Ce sous type est différent
+ * pour chaque type possible d'un champs
+ * <li> Boolean: aucun pour l'instant
+ * <li> Binary: aucun pour l'instant
+ * <li> Date
+ * <li> 'date' (defaut) indique que seule la date est pertinante</li>
+ * <li> 'month' indique que seule le mois et l'annee sont pertinants</li>
+ * <li> 'time' indique que seule l'heure est pertinante</li>
+ * <li> 'datetime' indique que la date et l'heure sont pertinantes</li>
+ * <li> Numeric
+ * <li> 'real' (defaut) indique que le nombre est de type reel</li>
+ * <li> 'integer' indique que le nombre est de type entier</li>
+ * <li> 'currency' indique que le nombre est de type reel et represente une somme d'argent</li>
+ * <li> String
+ * <li> 'char' indique que la chaine ne peut qu'un caractere</li>
+ * <li> 'monoline' (defaut) indique que la chaine ne peut contenir qu'une ligne</li>
+ * <li> 'multiline' indique que la chaine peut-etre multiligne</li>
+ * <li> '[mime type]' indique que la chaine represente le type mime
+ * precisse. exemple: 'text/plain' ou 'text/javascript' ou 'text/html'
+ * <li> Wikitty: aucun pour l'instant
+ *
+ * <p>
+ * <li> target: field
+ */
+ public static final String TAG_SUBTYPE = "subtype";
+
+ /**
+ * allowed: indique que le champs devra prendre sa valeur dans une des valeurs
+ * de ce tag. Les differentes valeurs sont separees par une virgule.
+ * <li> Boolean ne s'applique pas
+ * <li> Binary: l'utilisateur ne pourra importer des binaires que du type
+ * mime indique (s'additionne avec les resultats de allowedQuery).
+ * Ne s'applique que si le champs binaire doit contenir un fichier.
+ * Cette contrainte n'est utilisable que cote client lors de la selection
+ * du fichier. Pour une verification cote serveur, il faut associer un
+ * champs texte (par exemple 'mimetype') qui contiendra la valeur du fichier
+ * mis dans le champs binaire et mettre sur ce champs le meme tag value
+ * allowed que sur le champs binaire</li>
+ * <li> Date ne s'applique pas (voir {@link #TAG_MIN} {@link #TAG_MAX})
+ * <li> Numeric ne s'applique pas (voir {@link #TAG_MIN} {@link #TAG_MAX})
+ * <li> String: l'utilisateur ne pourra mettre comme valeur que des valeurs
+ * presentes dans allowed (s'additionne avec les resultats de allowedQuery).</li>
+ * <li> Wikitty: l'utilisateur devra choisir l'objet dans la liste des objets
+ * qui ont une des extensions listee. Si allowedQuery est aussi specifie
+ * allowedQuery prend le dessus sur allowed.
+ *<p>
* exemple:
- * <li> preload="Company.employee,Employee.person;Company.address"
+ * <li> String companyType allowed="SA,SARL,SAS" allowedQuery="SELECT Company.companyType WHERE extension=Company"
+ * <li> Wikitty target allowed="Person,Employee,Company"
* <p>
- * <li> target: extension
+ * <li> target: field
*/
- public static final String TAG_PRELOAD = "preload";
+ public static final String TAG_ALLOWED = "allowed";
+ /**
+ * Sert a la meme chose que allowed et vient en plus ou en remplacement
+ * (pour les Wikitties) des valeur de allowed. La valeur de ce tag doit
+ * etre une requete bien formee qui retourne le bon type d'element en
+ * fonction du champs (pour cela la requete commencera le plus souvent par
+ * un select).
+ */
+ public static final String TAG_ALLOWED_QUERY = "allowedQuery";
+ /**
+ * choice indique que l'utilisateur sera guide dans son choix de valeurs
+ * grace aux valeurs listees, mais il pourra s'il le souhaite mettre une
+ * nouvelle valeur. Les valeurs sont separees par des virgules
+ * <p>
+ * exemple:
+ * <li>String type choice="SA,SAS,SARL,SARL SCOOP,EURL"
+ *
+ */
+ public static final String TAG_CHOICE = "choice";
+ /**
+ * Sert a la meme chose que choice et vient en plus des valeur de choice.
+ * La valeur de ce tag doit etre une requete bien formee qui retourne le bon
+ * type d'element en fonction du champs (pour cela la requete commencera le
+ * plus souvent par un select).
+ */
+ public static final String TAG_CHOICE_QUERY = "choiceQuery";
+
+ /**
+ * min indique la valeur minimal que peut prendre le champs. Cela s'applique
+ * au Date et Numeric.
+ */
+ public static final String TAG_MIN = "min";
+
+ /**
+ * minQuery sert a la meme chose que min mais prend sa valeur grace a une
+ * requete. Si min et minQuery sont tous les deux présents, minQuery est
+ * utilisee sauf si aucun resultat n'est retourne par la requete.
+ */
+ public static final String TAG_MIN_QUERY = "minQuery";
+
+ /**
+ * max indique la valeur maximal que peut prendre le champs. Cela s'applique
+ * au Date et Numeric.
+ */
+ public static final String TAG_MAX = "max";
+
+ /**
+ * maxQuery sert a la meme chose que max mais prend sa valeur grace a une
+ * requete. Si max et maxQuery sont tous les deux présents, maxQuery est
+ * utilisee sauf si aucun resultat n'est retourne par la requete.
+ */
+ public static final String TAG_MAX_QUERY = "maxQuery";
+
+
}
1
0
r1455 - trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query
by bpoussin@users.nuiton.org 14 Mar '12
by bpoussin@users.nuiton.org 14 Mar '12
14 Mar '12
Author: bpoussin
Date: 2012-03-14 19:14:38 +0100 (Wed, 14 Mar 2012)
New Revision: 1455
Url: http://nuiton.org/repositories/revision/wikitty/1455
Log:
negatif number if transformed to MAX for setLimit
Modified:
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQuery.java
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQuery.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQuery.java 2012-03-11 17:22:05 UTC (rev 1454)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQuery.java 2012-03-14 18:14:38 UTC (rev 1455)
@@ -245,13 +245,16 @@
/**
* Set result limit.
*
- * 0 return no result (usefull for facets and result count). -1 return all
- * results.
+ * 0 return no result (usefull for facets and result count). negative value
+ * or {@link #MAX} return all results.
*
* @param count new count
* @return this
*/
public WikittyQuery setLimit(int count) {
+ if (count < 0) {
+ count = MAX;
+ }
this.limit = count;
return this;
}
1
0
r1454 - in trunk/wikitty-api/src/main/java/org/nuiton/wikitty: entities services
by bpoussin@users.nuiton.org 11 Mar '12
by bpoussin@users.nuiton.org 11 Mar '12
11 Mar '12
Author: bpoussin
Date: 2012-03-11 18:22:05 +0100 (Sun, 11 Mar 2012)
New Revision: 1454
Url: http://nuiton.org/repositories/revision/wikitty/1454
Log:
change accessor for extension allowed tag value
Modified:
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/FieldType.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceStorage.java
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/FieldType.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/FieldType.java 2012-03-11 17:21:28 UTC (rev 1453)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/FieldType.java 2012-03-11 17:22:05 UTC (rev 1454)
@@ -296,7 +296,15 @@
/**
* @see #TAG_EXTENSION_ALLOWED
*/
- public List<List<String>> getExtensionAllowed() {
+ public String getExtensionAllowed() {
+ String allowed = getTagValue(TAG_EXTENSION_ALLOWED);
+ return allowed;
+ }
+ /**
+ * @return list or null if not spcified allowed extension
+ * @see #TAG_EXTENSION_ALLOWED
+ */
+ public List<List<String>> getExtensionAllowedAsList() {
List<List<String>> result = null;
if (isExtensionRestrited()) {
result = new ArrayList<List<String>>();
@@ -316,7 +324,7 @@
* @see #TAG_EXTENSION_ALLOWED
*/
public boolean isExtensionRestrited() {
- String allowed = getTagValue(TAG_EXTENSION_ALLOWED);
- return allowed != null;
+ boolean result = StringUtils.isNotBlank(getExtensionAllowed());
+ return result;
}
}
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceStorage.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceStorage.java 2012-03-11 17:21:28 UTC (rev 1453)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceStorage.java 2012-03-11 17:22:05 UTC (rev 1454)
@@ -199,7 +199,7 @@
wikittyField.getExtensionNames();
boolean authorized = false;
- List<List<String>> allowed = type.getExtensionAllowed();
+ List<List<String>> allowed = type.getExtensionAllowedAsList();
for (List<String> l : allowed) {
if (extensionNames.containsAll(l)) {
authorized = true;
1
0
r1453 - trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities
by bpoussin@users.nuiton.org 11 Mar '12
by bpoussin@users.nuiton.org 11 Mar '12
11 Mar '12
Author: bpoussin
Date: 2012-03-11 18:21:28 +0100 (Sun, 11 Mar 2012)
New Revision: 1453
Url: http://nuiton.org/repositories/revision/wikitty/1453
Log:
add tag value direct accessor
Modified:
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/WikittyExtension.java
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/WikittyExtension.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/WikittyExtension.java 2012-03-10 16:21:17 UTC (rev 1452)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/WikittyExtension.java 2012-03-11 17:21:28 UTC (rev 1453)
@@ -392,7 +392,71 @@
this.tagValues = tagValues;
getPropertyChangeSupport().firePropertyChange("tagValues", oldValue, tagValues);
}
+
+ public boolean hasTagValueToString() {
+ boolean result = StringUtils.isNotBlank(getTagValueToString());
+ return result;
+ }
+
+ public String getTagValueToString() {
+ String result = getTagValue(WikittyTagValue.TAG_TO_STRING);
+ return result;
+ }
+ public boolean hasTagValueSortOrder() {
+ boolean result = StringUtils.isNotBlank(getTagValueSortOrder());
+ return result;
+ }
+
+ public String getTagValueSortOrder() {
+ String result = getTagValue(WikittyTagValue.TAG_SORT_ORDER);
+ return result;
+ }
+
+ /**
+ * Retourne la liste des champs a trier de facon ascendante
+ * @return une liste contenant les champs de tri ou une liste vide
+ */
+ public List<Element> getSortAscending() {
+ List<Element> result = new ArrayList<Element>();
+ String sortOrder = getTagValueSortOrder();
+ String[] orders = StringUtils.split(sortOrder, ",");
+ if (orders != null) {
+ for (String order : orders) {
+ String s = StringUtils.substringAfterLast(order, " ");
+ s = StringUtils.trim(s);
+ if (StringUtils.isBlank(s) || StringUtils.equalsIgnoreCase("asc", s)) {
+ String field = StringUtils.substringBefore(order, " ");
+ field = StringUtils.trim(field);
+ result.add(Element.get(field));
+ }
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Retourne la liste des champs a trier de facon descendante
+ * @return une liste contenant les champs de tri ou une liste vide
+ */
+ public List<Element> getSortDescending() {
+ List<Element> result = new ArrayList<Element>();
+ String sortOrder = getTagValueSortOrder();
+ String[] orders = StringUtils.split(sortOrder, ",");
+ if (orders != null) {
+ for (String order : orders) {
+ String s = StringUtils.substringAfterLast(order, " ");
+ s = StringUtils.trim(s);
+ if (StringUtils.equalsIgnoreCase("desc", s)) {
+ String field = StringUtils.substringBefore(order, " ");
+ field = StringUtils.trim(field);
+ result.add(Element.get(field));
+ }
+ }
+ }
+ return result;
+ }
+
@Override
public boolean equals(Object obj) {
boolean result = false;
1
0
r1452 - trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities
by bpoussin@users.nuiton.org 10 Mar '12
by bpoussin@users.nuiton.org 10 Mar '12
10 Mar '12
Author: bpoussin
Date: 2012-03-10 17:21:17 +0100 (Sat, 10 Mar 2012)
New Revision: 1452
Url: http://nuiton.org/repositories/revision/wikitty/1452
Log:
Evolution #2003: toString tagValue must support preload wikitty access
suppression de '[copyonwrite]' dans le toString des classes WikittyCopyOnWrite (ca permet une presentation plus jolie par defaut dans les applications)
Modified:
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/WikittyCopyOnWrite.java
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/WikittyCopyOnWrite.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/WikittyCopyOnWrite.java 2012-03-10 16:10:31 UTC (rev 1451)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/WikittyCopyOnWrite.java 2012-03-10 16:21:17 UTC (rev 1452)
@@ -170,7 +170,7 @@
@Override
public String toString() {
- return "[" + WikittyCopyOnWrite.class.getName() + "]" + target.toString();
+ return target.toString();
}
@Override
1
0
10 Mar '12
Author: bpoussin
Date: 2012-03-10 17:10:31 +0100 (Sat, 10 Mar 2012)
New Revision: 1451
Url: http://nuiton.org/repositories/revision/wikitty/1451
Log:
Evolution #2003: toString tagValue must support preload wikitty access
remove System.out.println
Modified:
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyUtil.java
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyUtil.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyUtil.java 2012-03-10 16:09:04 UTC (rev 1450)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyUtil.java 2012-03-10 16:10:31 UTC (rev 1451)
@@ -479,7 +479,6 @@
if (log.isDebugEnabled()) {
log.debug(String.format("%s -> %s (with %s from %s)", formatWikitty, format, values, fields));
}
- System.out.println(String.format("%s -> %s (with %s from %s)", formatWikitty, format, values, fields));
// use standard String.format
String result = String.format(format, values.toArray());
1
0
r1450 - in trunk/wikitty-api/src: main/java/org/nuiton/wikitty test/java/org/nuiton/wikitty
by bpoussin@users.nuiton.org 10 Mar '12
by bpoussin@users.nuiton.org 10 Mar '12
10 Mar '12
Author: bpoussin
Date: 2012-03-10 17:09:04 +0100 (Sat, 10 Mar 2012)
New Revision: 1450
Url: http://nuiton.org/repositories/revision/wikitty/1450
Log:
Evolution #2003: toString tagValue must support preload wikitty access
bugfix for date. empty string doesn't work for date format. now put null as default for all type
Modified:
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyUtil.java
trunk/wikitty-api/src/test/java/org/nuiton/wikitty/WikittyUtilTest.java
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyUtil.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyUtil.java 2012-03-08 23:48:59 UTC (rev 1449)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyUtil.java 2012-03-10 16:09:04 UTC (rev 1450)
@@ -54,6 +54,7 @@
import java.util.Collections;
import java.util.Date;
import java.util.Enumeration;
+import java.util.Formatter;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
@@ -394,44 +395,12 @@
return result;
}
- /** Pattern de recherche des field dans les chaines de formatage */
- static protected Pattern formatMatcher =
- Pattern.compile("%([^0-9][^|$]*)(?:\\|(.*?))?(\\$[0-9]*?[a-zA-Z])");
- /**
- * Format wikitty for string representation.
- * exemple:
- * <li> "%Person.lastName$s %Person.firstName$s: %Person.birthday$tm %Person.birthday$te,%Person.birthday$tY"
- * <li> "Hello %Person.firstName|unknow$s" if firstName field doesn't exist, unknow is used
- *
- * @param format format as {@link http://download.oracle.com/javase/6/docs/api/java/util/Formatter.html#synta…
- * except that position is replace with fq field name.
- * @param w wikitty to format
- * @return String that represent the wikitty
+ /** Pattern de recherche des field dans les chaines de formatage
+ * @see {@link Formatter#formatSpecifier}
*/
- static public String format1(String formatWikitty, Wikitty w) {
- Set<String> fields = w.getAllFieldNames();
- Object[] values = new Object[fields.size()];
+ static protected Pattern formatMatcher =
+ Pattern.compile("%([^0-9][^|$]*)(?:\\|(.*?))?(\\$(:?[-#+ 0,(\\<]*)?(:?\\d+)?(:?\\.\\d+)?[tT]?[a-zA-Z])");
- String format = formatWikitty;
- // convert Map field to array
- int i = 0;
- for (String field : fields) {
- values[i++] = w.getFqField(field);
- // i is incremented before replace, because String.format start at 1 not 0
- format = format.replaceAll("%"+Pattern.quote(field)+"(\\|.*?)?\\$", "\\%"+i+"\\$");
- }
-
- // on remplace tous les champs non trouve
- format = formatMatcher.matcher(format).replaceAll("$2");
- if (log.isDebugEnabled()) {
- log.debug(String.format("%s -> %s (with %s)", formatWikitty, format, fields));
- }
-
- // use standard String.format
- String result = String.format(format, values);
- return result;
- }
-
/**
* Format wikitty for string representation.
* exemple:
@@ -455,7 +424,7 @@
Matcher matcher = formatMatcher.matcher(formatWikitty);
while(matcher.find()) {
String fieldAsked = matcher.group(1);
- String defaultValue = StringUtils.defaultString(matcher.group(2));
+ String defaultValue = matcher.group(2);
fields.add(new ImmutablePair<String, String>(fieldAsked, defaultValue));
// i is incremented before replace, because String.format start at 1 not 0
matcher.appendReplacement(formatBuffer, "%"+(++i)+"$3");
@@ -470,6 +439,7 @@
String fieldAsked = pair.getKey();
String defaultValue = pair.getValue();
Wikitty wtmp = w;
+ // recherche de l'objet reel sur lequel prendre la valeur du champs
if (StringUtils.contains(fieldAsked, ",")) {
String path = StringUtils.substringBeforeLast(fieldAsked, ",");
fieldAsked = StringUtils.substringAfterLast(fieldAsked, ",");
@@ -489,6 +459,7 @@
Object value = null;
if(wtmp != null) {
+ // recuperation de la valeur du champs
if (wtmp.hasField(fieldAsked)) {
String extName = WikittyExtension.extractExtensionName(fieldAsked);
String fieldName = WikittyExtension.extractFieldName(fieldAsked);
@@ -501,13 +472,14 @@
}
}
}
+ // on ajoute dans la liste la valeur du champs
values.add(ObjectUtils.defaultIfNull(value, defaultValue));
}
if (log.isDebugEnabled()) {
- log.debug(String.format("%s -> %s (with %s)", formatWikitty, format, fields));
+ log.debug(String.format("%s -> %s (with %s from %s)", formatWikitty, format, values, fields));
}
- System.out.println(String.format("%s -> %s (with %s)", formatWikitty, format, fields));
+ System.out.println(String.format("%s -> %s (with %s from %s)", formatWikitty, format, values, fields));
// use standard String.format
String result = String.format(format, values.toArray());
Modified: trunk/wikitty-api/src/test/java/org/nuiton/wikitty/WikittyUtilTest.java
===================================================================
--- trunk/wikitty-api/src/test/java/org/nuiton/wikitty/WikittyUtilTest.java 2012-03-08 23:48:59 UTC (rev 1449)
+++ trunk/wikitty-api/src/test/java/org/nuiton/wikitty/WikittyUtilTest.java 2012-03-10 16:09:04 UTC (rev 1450)
@@ -104,16 +104,16 @@
result = WikittyUtil.format(
"Group Name = %"+WikittyGroupImpl.FQ_FIELD_WIKITTYGROUP_NAME+"toto$s",
group.getWikitty());
- Assert.assertEquals("Group Name = ", result);
+ Assert.assertEquals("Group Name = null", result);
// test un cas ou le champs demande n'existe pas dans le wikitty (sans remplacement)
// avec deux fois le meme champs
result = WikittyUtil.format(
"Group Name = %"+WikittyGroupImpl.FQ_FIELD_WIKITTYGROUP_NAME+"toto$s(%"+WikittyGroupImpl.FQ_FIELD_WIKITTYGROUP_NAME+"tata$s)",
group.getWikitty());
- Assert.assertEquals("Group Name = ()", result);
+ Assert.assertEquals("Group Name = null(null)", result);
- // test un cas ou le champs demande n'existe pas dans le wikitty (sans remplacement)
+ // test un cas ou le champs demande n'existe pas dans le wikitty (avec remplacement vide)
result = WikittyUtil.format(
"Group Name = %"+WikittyGroupImpl.FQ_FIELD_WIKITTYGROUP_NAME+"toto|$s",
group.getWikitty());
1
0
08 Mar '12
Author: bpoussin
Date: 2012-03-09 00:48:59 +0100 (Fri, 09 Mar 2012)
New Revision: 1449
Url: http://nuiton.org/repositories/revision/wikitty/1449
Log:
Evolution #2003: toString tagValue must support preload wikitty access
Modified:
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyUtil.java
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyUtil.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyUtil.java 2012-03-07 23:36:33 UTC (rev 1448)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyUtil.java 2012-03-08 23:48:59 UTC (rev 1449)
@@ -76,6 +76,9 @@
import org.apache.commons.lang.time.DateUtils;
import org.apache.commons.lang.time.FastDateFormat;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.tuple.ImmutablePair;
+import org.apache.commons.lang3.tuple.Pair;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.nuiton.wikitty.entities.WikittyTypes;
@@ -393,7 +396,7 @@
/** Pattern de recherche des field dans les chaines de formatage */
static protected Pattern formatMatcher =
- Pattern.compile("%[^0-9][^|$]*(\\|(.*?))?\\$[0-9]*?[a-zA-Z]");
+ Pattern.compile("%([^0-9][^|$]*)(?:\\|(.*?))?(\\$[0-9]*?[a-zA-Z])");
/**
* Format wikitty for string representation.
* exemple:
@@ -401,11 +404,11 @@
* <li> "Hello %Person.firstName|unknow$s" if firstName field doesn't exist, unknow is used
*
* @param format format as {@link http://download.oracle.com/javase/6/docs/api/java/util/Formatter.html#synta…
- * execpt that position is replace with fq field name.
+ * except that position is replace with fq field name.
* @param w wikitty to format
* @return String that represent the wikitty
*/
- static public String format(String formatWikitty, Wikitty w) {
+ static public String format1(String formatWikitty, Wikitty w) {
Set<String> fields = w.getAllFieldNames();
Object[] values = new Object[fields.size()];
@@ -430,6 +433,88 @@
}
/**
+ * Format wikitty for string representation.
+ * exemple:
+ * <li> "%Person.lastName$s %Person.firstName$s: %Person.birthday$tm %Person.birthday$te,%Person.birthday$tY"
+ * <li> "Hello %Person.firstName|unknown$s" if firstName field doesn't exist, unknow is used
+ * <li> "My company %Employee.company,Company.name|unknown$s" if employee has company field and this company has name field
+ *
+ * @param format format as {@link http://download.oracle.com/javase/6/docs/api/java/util/Formatter.html#synta…
+ * except that position is replace with fq field name.
+ * @param w wikitty to format
+ * @return String that represent the wikitty
+ */
+ static public String format(String formatWikitty, Wikitty w) {
+ List<Pair<String, String>> fields = new ArrayList<Pair<String, String>>();
+
+ StringBuffer formatBuffer = new StringBuffer();
+ int i = 0;
+ // on collect tous les champs demande et leur valeur par defaut
+ // et en meme temps on cree la chaine formatBuffer qui substitue les
+ // champs par des numeros
+ Matcher matcher = formatMatcher.matcher(formatWikitty);
+ while(matcher.find()) {
+ String fieldAsked = matcher.group(1);
+ String defaultValue = StringUtils.defaultString(matcher.group(2));
+ fields.add(new ImmutablePair<String, String>(fieldAsked, defaultValue));
+ // i is incremented before replace, because String.format start at 1 not 0
+ matcher.appendReplacement(formatBuffer, "%"+(++i)+"$3");
+ }
+ matcher.appendTail(formatBuffer);
+ // la vrai chaine de formatage pour String.format
+ String format = formatBuffer.toString();
+
+ List<Object> values = new ArrayList<Object>(fields.size());
+ // on recherche la valeur de chaque champs demande
+ for (Pair<String, String> pair : fields) {
+ String fieldAsked = pair.getKey();
+ String defaultValue = pair.getValue();
+ Wikitty wtmp = w;
+ if (StringUtils.contains(fieldAsked, ",")) {
+ String path = StringUtils.substringBeforeLast(fieldAsked, ",");
+ fieldAsked = StringUtils.substringAfterLast(fieldAsked, ",");
+ for (String field : StringUtils.split(path, ",")) {
+ if (wtmp.hasField(field)) {
+ String extName = WikittyExtension.extractExtensionName(field);
+ String fieldName = WikittyExtension.extractFieldName(field);
+ wtmp = wtmp.getFieldAsWikitty(extName, fieldName, false);
+ } else {
+ wtmp = null;
+ }
+ if (wtmp == null) {
+ break;
+ }
+ }
+ }
+
+ Object value = null;
+ if(wtmp != null) {
+ if (wtmp.hasField(fieldAsked)) {
+ String extName = WikittyExtension.extractExtensionName(fieldAsked);
+ String fieldName = WikittyExtension.extractFieldName(fieldAsked);
+ // on essai toujours de recuperer l'objet plutot que l'id si
+ // possible en 1er
+ value = wtmp.getFieldAsWikitty(extName, fieldName, false);
+ if (value == null) {
+ // pas un wikitty ou pas pre-charge, on demande simplement le champs
+ value = wtmp.getFqField(fieldAsked);
+ }
+ }
+ }
+ values.add(ObjectUtils.defaultIfNull(value, defaultValue));
+ }
+
+ if (log.isDebugEnabled()) {
+ log.debug(String.format("%s -> %s (with %s)", formatWikitty, format, fields));
+ }
+ System.out.println(String.format("%s -> %s (with %s)", formatWikitty, format, fields));
+
+ // use standard String.format
+ String result = String.format(format, values.toArray());
+ return result;
+ }
+
+ /**
* Get value as Binary.
*
* @param value null and empty return empty byte[]
1
0
07 Mar '12
Author: bpoussin
Date: 2012-03-08 00:36:33 +0100 (Thu, 08 Mar 2012)
New Revision: 1448
Url: http://nuiton.org/repositories/revision/wikitty/1448
Log:
Evolution #1997: Add elapsed time in QueryResult
Modified:
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyClient.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/addons/importexport/ImportExportCSV.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/addons/importexport/ImportExportXML.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryResult.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceStorage.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceTransaction.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngineHelper.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngineInMemory.java
trunk/wikitty-api/src/test/java/org/nuiton/wikitty/WikittyClientTest.java
trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyClient.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyClient.java 2012-03-07 21:52:52 UTC (rev 1447)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyClient.java 2012-03-07 23:36:33 UTC (rev 1448)
@@ -787,7 +787,7 @@
if (limitToFirst) {
for (WikittyQuery query : serviceQueries) {
- query.setFirst(0);
+ query.setOffset(0);
query.setLimit(1);
// lorsqu'on limit au premier, c'est qu'on utilise la methode
// pour retourne seulement un objet et pas un WikittyQueryResult
@@ -798,8 +798,8 @@
}
}
- List<WikittyQueryResult<String>> pagedResult = wikittyService.findAllByQuery(
- securityToken, serviceQueries);
+ List<WikittyQueryResult<String>> pagedResult =
+ findAllByQuery(serviceQueries);
result = new ArrayList<WikittyQueryResult<E>>(pagedResult.size());
for (WikittyQueryResult<String> p : pagedResult) {
@@ -934,6 +934,16 @@
//
///////////////////////////////////////////////////////////////////////////
+ /**
+ * Retourne les ids des wikitties qui correspondent au critere, chaque
+ * query passees en argument et retourne un WikittyQueryResult.
+ *
+ * Cette method est la seul a reellement faire un appel a findAllByQuery
+ * du wikitty service.
+ *
+ * @param query
+ * @return
+ */
public List<WikittyQueryResult<String>> findAllByQuery(List<WikittyQuery> query) {
long start = TimeLog.getTime();
List<WikittyQueryResult<String>> result = null;
@@ -1712,13 +1722,17 @@
*/
public <E> WikittyQueryResult<E> castTo(Class<E> target,
WikittyQueryResult queryResult) {
+
+ long startTime = System.nanoTime();
List<E> castedResult = castTo(target, queryResult.getAll());
+ long estimatedTime = System.nanoTime() - startTime;
WikittyQueryResult<E> result = new WikittyQueryResult<E>(
queryResult.getQueryName(),
- queryResult.getFirst(), queryResult.getTotalResult(),
+ queryResult.getOffset(), queryResult.getTotalResult(),
queryResult.getQueryString(), queryResult.getFacets(),
- castedResult);
+ castedResult, queryResult.getTimeQuery(), estimatedTime);
+
return result;
}
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/addons/importexport/ImportExportCSV.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/addons/importexport/ImportExportCSV.java 2012-03-07 21:52:52 UTC (rev 1447)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/addons/importexport/ImportExportCSV.java 2012-03-07 23:36:33 UTC (rev 1448)
@@ -400,7 +400,7 @@
WikittyQueryResult<Wikitty> queryResult = new WikittyQueryResult(
pagedResult.getCriteriaName(), pagedResult.getFirstIndice(),
pagedResult.getNumFound(), pagedResult.getQueryString(), facet,
- pagedResult.getAll());
+ pagedResult.getAll(), 0, 0);
exportWriter(client, writer, queryResult);
}
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/addons/importexport/ImportExportXML.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/addons/importexport/ImportExportXML.java 2012-03-07 21:52:52 UTC (rev 1447)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/addons/importexport/ImportExportXML.java 2012-03-07 23:36:33 UTC (rev 1448)
@@ -222,7 +222,7 @@
WikittyQueryResult<Wikitty> queryResult = new WikittyQueryResult(
pagedResult.getCriteriaName(), pagedResult.getFirstIndice(),
pagedResult.getNumFound(), pagedResult.getQueryString(), null,
- pagedResult.getAll());
+ pagedResult.getAll(), 0, 0);
exportWriter(client, result, queryResult);
}
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryResult.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryResult.java 2012-03-07 21:52:52 UTC (rev 1447)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryResult.java 2012-03-07 23:36:33 UTC (rev 1448)
@@ -57,8 +57,8 @@
/** nom du critere qui a ete uitilise (peut-etre null) si le critete n'avait pas de nom */
protected String queryName;
- /** indice of first result in global search result */
- protected int first;
+ /** indice of offset result in global search result */
+ protected int offset;
/** total number of result if we call the query for all possible result */
protected int totalResult;
/** query really executed (internal representation depend of search engine used */
@@ -72,6 +72,10 @@
* lazy loaded from facets variable.
*/
protected Map<String, Map<String, FacetTopic>> facetsAsMap = null;
+ /** temps (nanoseconde) mis pour faire la requete (calcul cote serveur)*/
+ protected long timeQuery;
+ /** temps (nanoseconde) de transformation des resultats bruts en un autre type(calcul cote client)*/
+ protected long timeConvertion;
/**
@@ -79,31 +83,43 @@
*
* we don't initialize securityToken
*
- * @param first indice element in global search result
+ * @param offset indice element in global search result
* @param totalResult total number of result if we call the query for all possible result
* @param queryString query really executed
* @param facets facet asked or null if no facet
* @param results list of result in the wanted interval
*/
public WikittyQueryResult(String queryName,
- int first, int totalResult, String queryString,
- Map<String, List<FacetTopic>> facets, List<T> results) {
+ int offset, int totalResult, String queryString,
+ Map<String, List<FacetTopic>> facets, List<T> results,
+ long timeQuery, long timeConvertion) {
this.queryName = queryName;
- this.first = first;
+ this.offset = offset;
this.totalResult = totalResult;
this.queryString = queryString;
this.facets = facets;
this.results = Collections.unmodifiableList(results);
+ this.timeQuery = timeQuery;
+ this.timeConvertion = timeConvertion;
}
public String getQueryName() {
return queryName;
}
+ /**
+ *
+ * @deprecated since 3.5 use {@link #getOffset()}
+ */
+ @Deprecated
public int getFirst() {
- return first;
+ return offset;
}
+ public int getOffset() {
+ return offset;
+ }
+
public int getTotalResult() {
return totalResult;
}
@@ -208,10 +224,10 @@
/**
- * Return the first element in result
+ * Return the offset element in result
*
* Can throw an exception if no element available
- * @return first element
+ * @return offset element
*/
public T peek() {
T result = get(0);
@@ -249,6 +265,36 @@
}
/**
+ * temps (nanoseconde) mis pour faire la requete (calcul cote serveur)
+ */
+ public long getTimeQuery() {
+ return timeQuery;
+ }
+
+ /**
+ * temps (nanoseconde) mis pour faire la requete (calcul cote serveur)
+ */
+ public void setTimeQuery(long timeQuery) {
+ this.timeQuery = timeQuery;
+ }
+
+ /**
+ * temps (nanoseconde) de transformation des resultats bruts en un autre
+ * type(calcul cote client)
+ */
+ public long getTimeConvertion() {
+ return timeConvertion;
+ }
+
+ /**
+ * temps (nanoseconde) de transformation des resultats bruts en un autre
+ * type(calcul cote client)
+ */
+ public void setTimeConvertion(long timeConvertion) {
+ this.timeConvertion = timeConvertion;
+ }
+
+ /**
* Iterate on result, same as getAll().iterator().
* @return
*/
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceStorage.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceStorage.java 2012-03-07 21:52:52 UTC (rev 1447)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceStorage.java 2012-03-07 23:36:33 UTC (rev 1448)
@@ -999,8 +999,11 @@
if (c == null) {
result.add(null);
} else {
+ long startTime = System.nanoTime();
WikittyQueryResult<String> searchResult =
getSearchEngine().findAllByQuery(tx, c);
+ long estimatedTime = System.nanoTime() - startTime;
+ searchResult.setTimeQuery(estimatedTime);
result.add(searchResult);
}
}
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceTransaction.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceTransaction.java 2012-03-07 21:52:52 UTC (rev 1447)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceTransaction.java 2012-03-07 23:36:33 UTC (rev 1448)
@@ -425,9 +425,10 @@
// FIXME les facettes sont fausses :(
Map<String, List<org.nuiton.wikitty.query.FacetTopic>> facets = resultWs.getFacets();
List<String> results = new ArrayList<String>(ids);
+ long timeQuery = resultTx.getTimeQuery() + resultWs.getTimeQuery();
result.add(new WikittyQueryResult<String>(queryName,
- firstIndice, numFound, queryString, facets, results));
+ firstIndice, numFound, queryString, facets, results, timeQuery, 0));
}
if (queries.size() != result.size()) {
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngineHelper.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngineHelper.java 2012-03-07 21:52:52 UTC (rev 1447)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngineHelper.java 2012-03-07 23:36:33 UTC (rev 1448)
@@ -208,11 +208,12 @@
// fusion des resultats
WikittyQueryResult<String> result = new WikittyQueryResult<String>(
query.getName(),
- query.getFirst(),
+ query.getOffset(),
topics.size(),
resultSelect.getQueryString(),
resultFacet.getFacets(),
- selectList);
+ selectList,
+ 0, 0);
return result;
}
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngineInMemory.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngineInMemory.java 2012-03-07 21:52:52 UTC (rev 1447)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngineInMemory.java 2012-03-07 23:36:33 UTC (rev 1448)
@@ -354,7 +354,8 @@
}
result = new WikittyQueryResult<String>(query.getName(),
- offset, totalResult, query.getCondition().toString(), facets.getFacets(), ids);
+ offset, totalResult, query.getCondition().toString(),
+ facets.getFacets(), ids, 0, 0);
}
return result;
}
Modified: trunk/wikitty-api/src/test/java/org/nuiton/wikitty/WikittyClientTest.java
===================================================================
--- trunk/wikitty-api/src/test/java/org/nuiton/wikitty/WikittyClientTest.java 2012-03-07 21:52:52 UTC (rev 1447)
+++ trunk/wikitty-api/src/test/java/org/nuiton/wikitty/WikittyClientTest.java 2012-03-07 23:36:33 UTC (rev 1448)
@@ -2420,7 +2420,21 @@
Assert.assertEquals(2, treeNodeResult.getAttCount()); // 0 before move
}
+ /**
+ * Test time query duration
+ */
@Test
+ public void testTimeQuery() {
+ WikittyQuery query = WikittyQueryParser.parse(
+ "ProductPicture.price=*");
+ WikittyQueryResult<Product> result = wikittyClient.findAllByQuery(Product.class, query);
+ Assert.assertTrue(0 < result.getTimeQuery());
+ Assert.assertTrue(0 < result.getTimeConvertion());
+ }
+
+
+
+ @Test
public void testCryptAndPatternField() throws Exception {
WikittyExtension ext = new WikittyExtension("UserTest",
"1.0", // version
Modified: trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java
===================================================================
--- trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java 2012-03-07 21:52:52 UTC (rev 1447)
+++ trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java 2012-03-07 23:36:33 UTC (rev 1448)
@@ -794,7 +794,7 @@
// Build paged result
result = new WikittyQueryResult<String>(
query.getName(),
- offset, numFound, queryString, facets, ids);
+ offset, numFound, queryString, facets, ids, 0, 0);
}
return result;
1
0
r1447 - in trunk/wikitty-api/src: main/java/org/nuiton/wikitty/query test/java/org/nuiton/wikitty
by bpoussin@users.nuiton.org 07 Mar '12
by bpoussin@users.nuiton.org 07 Mar '12
07 Mar '12
Author: bpoussin
Date: 2012-03-07 22:52:52 +0100 (Wed, 07 Mar 2012)
New Revision: 1447
Url: http://nuiton.org/repositories/revision/wikitty/1447
Log:
Evolution #1998: In parser support ' as string delimiter and not only "
Evolution #1999: Add support of limit and offset in query parser
Modified:
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQuery.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryParser.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorToString.java
trunk/wikitty-api/src/test/java/org/nuiton/wikitty/WikittyClientTest.java
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQuery.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQuery.java 2012-03-07 18:42:05 UTC (rev 1446)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQuery.java 2012-03-07 21:52:52 UTC (rev 1447)
@@ -208,8 +208,9 @@
* au maximume que 75 reponses retournees.
* @return
*/
- public void setOffset(int offset) {
+ public WikittyQuery setOffset(int offset) {
this.offset = offset;
+ return this;
}
/**
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryParser.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryParser.java 2012-03-07 18:42:05 UTC (rev 1446)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryParser.java 2012-03-07 21:52:52 UTC (rev 1447)
@@ -29,7 +29,7 @@
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.nuiton.wikitty.query.conditions.Aggregate;
@@ -97,8 +97,10 @@
public static final String SELECT = "SELECT";
public static final String WHERE = "WHERE";
public static final String IN = "IN";
- public static final String LITERAL_CLOSE = "\"";
- public static final String LITERAL_OPEN = "\"";
+ public static final String LITERAL_OPEN_SIMPLE = "'";
+ public static final String LITERAL_CLOSE_SIMPLE = "'";
+ public static final String LITERAL_OPEN_DOUBLE = "\"";
+ public static final String LITERAL_CLOSE_DOUBLE = "\"";
public static final String NULL = "NULL";
public static final String TO = "TO";
public static final String FALSE = "FALSE";
@@ -124,6 +126,12 @@
public static final String SQUARE_BRACKET_CLOSE = "]";
public static final String SQUARE_BRACKET_OPEN = "[";
+ public static final String OFFSET = "#OFFSET";
+ public static final String LIMIT = "#LIMIT";
+
+ public Rule icOFFSET = IgnoreCase(OFFSET);
+ public Rule icLIMIT = IgnoreCase(LIMIT);
+
public Rule icEXTENSION = IgnoreCase(Element.EXTENSION.getValue());
public Rule icID = IgnoreCase(Element.ID.getValue());
public Rule icNOT = IgnoreCase(NOT);
@@ -260,9 +268,8 @@
}
// System.out.println("\nParse Tree:\n" + ParseTreeUtils.printNodeTree(result) + '\n');
- Condition c = (Condition)result.resultValue;
+ WikittyQuery query = (WikittyQuery)result.resultValue;
- WikittyQuery query = new WikittyQuery(c);
return query;
}
@@ -276,6 +283,11 @@
return result;
}
+ protected int toInt(String v) {
+ int result = Integer.parseInt(v);
+ return result;
+ }
+
/**
* Remove quote at beginning and ending of String in parameter if necessary
*
@@ -289,17 +301,30 @@
*/
protected String removeQuote(String s) {
String result = s;
- if (StringUtils.startsWith(s, LITERAL_OPEN)
- && StringUtils.startsWith(s, LITERAL_CLOSE)) {
+ if (StringUtils.startsWithAny(s, LITERAL_OPEN_SIMPLE, LITERAL_OPEN_DOUBLE)
+ && StringUtils.endsWithAny(s, LITERAL_CLOSE_SIMPLE, LITERAL_CLOSE_DOUBLE)) {
result = StringUtils.substring(s, 1, -1);
}
return result;
}
Rule start() {
- return Sequence(or(), EOI);
+ return Sequence(or(), push(new WikittyQuery((Condition)pop())),
+ offset(), limit(), space(), EOI);
}
+ Rule offset() {
+ return Optional(space(), icOFFSET, FirstOf(EQUALS, space()), OneOrMore(AnyOf("1234567890")),
+ push(((WikittyQuery)pop()).setOffset(toInt(match())))
+ );
+ }
+
+ Rule limit() {
+ return Optional(space(), icLIMIT, FirstOf(EQUALS, space()), OneOrMore(AnyOf("1234567890")),
+ push(((WikittyQuery)pop()).setLimit(toInt(match())))
+ );
+ }
+
Rule or() {
return Sequence(and(), ZeroOrMore(space(), icOR, space(), and(),
push(new Or((Condition)pop(1), (Condition)pop()))));
@@ -487,44 +512,69 @@
}
Rule valueText() {
- return Sequence(FirstOf(StringLiteral(), SimpleString()),
+ return Sequence(FirstOf(StringLiteralDouble(), StringLiteralSimple(), SimpleString()),
push(new ConditionValueString(removeQuote(match()))));
}
/**
* Une chaine simple sans espace, parenthese, retour chariot, tabulation,
- * accolade, crochet
+ * accolade, crochet, ", '.
* @return
*/
Rule SimpleString() {
return OneOrMore(FirstOf(
Escape(),
- Sequence(TestNot(AnyOf(" \t\r\n\\"
+ Sequence(TestNot(AnyOf(" #\t\r\n\\"
+COMMA
- +LITERAL_OPEN+LITERAL_CLOSE
+ +LITERAL_OPEN_SIMPLE+LITERAL_OPEN_DOUBLE
+BRACKET_OPEN+BRACKET_CLOSE
+CURLY_BRACKET_OPEN+CURLY_BRACKET_CLOSE
+SQUARE_BRACKET_OPEN+SQUARE_BRACKET_CLOSE)), ANY)
)).suppressSubnodes();
}
- Rule StringLiteral() {
+ Rule StringLiteralSimple() {
return Sequence(
- LITERAL_OPEN,
+ LITERAL_OPEN_SIMPLE,
ZeroOrMore(
FirstOf(
- Escape(),
- Sequence(TestNot(AnyOf("\r\n\\"+LITERAL_OPEN+LITERAL_CLOSE)), ANY)
+ EscapeSimple(),
+ Sequence(TestNot(AnyOf("\r\n\\"+LITERAL_CLOSE_SIMPLE)), ANY)
)
).suppressSubnodes(),
- LITERAL_CLOSE
+ LITERAL_CLOSE_SIMPLE
);
}
+ Rule StringLiteralDouble() {
+ return Sequence(
+ LITERAL_OPEN_DOUBLE,
+ ZeroOrMore(
+ FirstOf(
+ EscapeDouble(),
+ Sequence(TestNot(AnyOf("\r\n\\"+LITERAL_CLOSE_DOUBLE)), ANY)
+ )
+ ).suppressSubnodes(),
+ LITERAL_CLOSE_DOUBLE
+ );
+ }
+
Rule Escape() {
- return Sequence('\\', FirstOf(AnyOf("btnfr\'\\"+LITERAL_OPEN+LITERAL_CLOSE), OctalEscape(), UnicodeEscape()));
+ return Sequence('\\', FirstOf(AnyOf("btnfr\'\\"
+ +LITERAL_OPEN_SIMPLE+LITERAL_CLOSE_SIMPLE+LITERAL_OPEN_DOUBLE+LITERAL_CLOSE_DOUBLE),
+ OctalEscape(), UnicodeEscape()));
}
+ Rule EscapeSimple() {
+ return Sequence('\\', FirstOf(AnyOf("btnfr\'\\"+LITERAL_CLOSE_SIMPLE),
+ OctalEscape(), UnicodeEscape()));
+ }
+
+ Rule EscapeDouble() {
+ return Sequence('\\', FirstOf(AnyOf("btnfr\'\\"+LITERAL_CLOSE_DOUBLE),
+ OctalEscape(), UnicodeEscape()));
+ }
+
Rule OctalEscape() {
return FirstOf(
Sequence(CharRange('0', '3'), CharRange('0', '7'), CharRange('0', '7')),
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorToString.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorToString.java 2012-03-07 18:42:05 UTC (rev 1446)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorToString.java 2012-03-07 21:52:52 UTC (rev 1447)
@@ -161,7 +161,7 @@
@Override
public void visit(ConditionValueString o) {
- text += WikittyQueryParser.LITERAL_OPEN + o.getValue() + WikittyQueryParser.LITERAL_CLOSE;
+ text += WikittyQueryParser.LITERAL_OPEN_DOUBLE + o.getValue() + WikittyQueryParser.LITERAL_CLOSE_DOUBLE;
}
@Override
Modified: trunk/wikitty-api/src/test/java/org/nuiton/wikitty/WikittyClientTest.java
===================================================================
--- trunk/wikitty-api/src/test/java/org/nuiton/wikitty/WikittyClientTest.java 2012-03-07 18:42:05 UTC (rev 1446)
+++ trunk/wikitty-api/src/test/java/org/nuiton/wikitty/WikittyClientTest.java 2012-03-07 21:52:52 UTC (rev 1447)
@@ -50,7 +50,6 @@
import org.nuiton.wikitty.entities.ExtensionFactory;
import org.nuiton.wikitty.entities.Wikitty;
import org.nuiton.wikitty.entities.WikittyAuthorisation;
-import org.nuiton.wikitty.entities.WikittyAuthorisationHelper;
import org.nuiton.wikitty.entities.WikittyAuthorisationImpl;
import org.nuiton.wikitty.entities.WikittyExtension;
import org.nuiton.wikitty.entities.WikittyGroup;
@@ -337,7 +336,7 @@
public void testSearchExtensionFacetExplicitly() throws Exception {
// essai de facettiser sur les extensions
WikittyQuery query = new WikittyQueryMaker().keyword("*").end();
- query.setFirst(0);
+ query.setOffset(0);
query.setLimit(0);
query.setFacetExtension(true);
WikittyQueryResult<String> result = wikittyClient.findAllByQuery(query);
@@ -352,7 +351,7 @@
public void testSearchExtensionFacet() throws Exception {
// essai de facettiser sur les extensions
WikittyQuery query = new WikittyQueryMaker().keyword("*").end();
- query.setFirst(0);
+ query.setOffset(0);
query.setLimit(0);
query.setFacetField(Element.EXTENSION);
WikittyQueryResult<String> result = wikittyClient.findAllByQuery(query);
@@ -937,6 +936,59 @@
}
/**
+ * Test de ' comme chaine de caractere
+ */
+ @Test
+ public void testQueryParserSimpleQuote() throws IOException {
+ importBooks();
+ { // avec ' escape
+ WikittyQuery query = WikittyQueryParser.parse("Product.name=\"Harry Potter et le Prisonnier d'Azkaban\"");
+ WikittyQueryResult<Product> results = wikittyClient.findAllByQuery(Product.class, query);
+ Assert.assertEquals(1, results.getTotalResult());
+ }
+ { // avec ' escape
+ WikittyQuery query = WikittyQueryParser.parse("Product.name='Harry Potter et le Prisonnier d\\'Azkaban'");
+ WikittyQueryResult<Product> results = wikittyClient.findAllByQuery(Product.class, query);
+ Assert.assertEquals(1, results.getTotalResult());
+ }
+ }
+ /**
+ * Test de limit et offset dans le parser.
+ */
+ @Test
+ public void testQueryParseOffsetAndLimit() {
+ {
+ // 22 in init db
+ WikittyQuery query = WikittyQueryParser.parse("TRUE");
+ WikittyQueryResult<String> results = wikittyClient.findAllByQuery(query);
+ Assert.assertEquals(22, results.getTotalResult());
+ }
+ {
+ // 22 in init db
+ WikittyQuery query = WikittyQueryParser.parse("TRUE #offset 2");
+ WikittyQueryResult<String> results = wikittyClient.findAllByQuery(query);
+ Assert.assertEquals(22, results.getTotalResult());
+ Assert.assertEquals(20, results.size());
+ }
+ {
+ // 22 in init db
+ WikittyQuery query = WikittyQueryParser.parse("TRUE #limit 10");
+ WikittyQueryResult<String> results = wikittyClient.findAllByQuery(query);
+ Assert.assertEquals(22, results.getTotalResult());
+ Assert.assertEquals(10, results.size());
+ }
+ {
+ // 22 in init db
+ WikittyQuery query = WikittyQueryParser.parse("TRUE #offset 2 #limit 10");
+ WikittyQueryResult<String> results = wikittyClient.findAllByQuery(query);
+ Assert.assertEquals(22, results.getTotalResult());
+ Assert.assertEquals(10, results.size());
+ }
+ }
+
+
+
+ /**
* Test eq() operator.
*/
@Test
@@ -1631,7 +1683,7 @@
.select(Product.ELEMENT_FIELD_PRODUCT_PRICE)
.exteq(Product.EXT_PRODUCT).end();
query1.setSortAscending(Product.ELEMENT_FIELD_PRODUCT_PRICE);
- query1.setFirst(0);
+ query1.setOffset(0);
query1.setLimit(2);
WikittyQueryResult<Double> results1 = wikittyClient.findAllByQuery(Double.class, query1);
// 17 books, but only 11 differents prices ?
@@ -1641,14 +1693,14 @@
// second
// FIXME echatellier 20120201 setLimit -1 us buggy
- /*query1.setFirst(0);
+ /*query1.setOffset(0);
query1.setLimit(WikittyQuery.MAX);
results1 = wikittyClient.findAllByQuery(query1);
Assert.assertEquals(17, results1.getTotalResult());
Assert.assertEquals(17, results1.getAll().size());*/
// third
- query1.setFirst(0);
+ query1.setOffset(0);
query1.setLimit(0);
results1 = wikittyClient.findAllByQuery(Double.class, query1);
Assert.assertEquals(11, results1.getTotalResult());
1
0