diff --git a/dbflute_fess/dfprop/freeGenDefinitionMap.dfprop b/dbflute_fess/dfprop/freeGenDefinitionMap.dfprop index 7486bb9eb..024b878fc 100644 --- a/dbflute_fess/dfprop/freeGenDefinitionMap.dfprop +++ b/dbflute_fess/dfprop/freeGenDefinitionMap.dfprop @@ -1,5 +1,5 @@ map:{ - ; ElasticsearchBeanGen = map:{ + ; ElasticsearchFessConfigGen = map:{ ; resourceMap = map:{ ; resourceType = ELASTICSEARCH ; resourceFile = ../src/main/config/es/fess_config.json @@ -25,5 +25,31 @@ map:{ } } } + ; ElasticsearchSearchLogGen = map:{ + ; resourceMap = map:{ + ; resourceType = ELASTICSEARCH + ; resourceFile = ../src/main/config/es/search_log.json + } + ; outputMap = map:{ + ; templateFile = unused + ; outputDirectory = ../src/main/java + ; package = org.codelibs.fess.es + ; className = unused + } + ; tableMap = map:{ + ; tablePath = search_log -> mappings -> map + ; mappingMap = map:{ + ; type = map:{ + ; string = String + ; integer = Integer + ; long = Long + ; float = Float + ; double = Double + ; boolean = Boolean + ; date = java.time.LocalDateTime + } + } + } + } } diff --git a/dbflute_fess/freegen/ControlFreeGen.vm b/dbflute_fess/freegen/ControlFreeGen.vm index 9989e6a44..ce32af659 100644 --- a/dbflute_fess/freegen/ControlFreeGen.vm +++ b/dbflute_fess/freegen/ControlFreeGen.vm @@ -44,7 +44,7 @@ $manager.makeDirectory($request.generateDirPath) #end #end #elseif ($request.isResourceTypeElasticsearch()) -#if ($request.requestName == "ElasticsearchBeanGen") +#if ($request.requestName.startsWith("Elasticsearch")) ## ## <<< Elasticsearch Schema Gen >>> ## @@ -115,6 +115,7 @@ $manager.makeDirectory($request.generateDirPath) #end #end +#if ($request.requestName == "ElasticsearchFessConfigGen") #set ($path = "${request.generateDirPath}/cbean/bs/AbstractConditionBean.java") $manager.makeDirectory($path) $request.info("parse('${path}')") @@ -150,6 +151,7 @@ $manager.makeDirectory($request.generateDirPath) $request.info("parse('${path}')") $generator.parse("./elasticsearch/SqlClauseEs.vm", $path, "", "") #end +#end #else ## ## <<< Normal Gen >>> diff --git a/dbflute_fess/freegen/elasticsearch/AbstractBehavior.vm b/dbflute_fess/freegen/elasticsearch/AbstractBehavior.vm index 0ffbf77dc..6f9d6fd14 100644 --- a/dbflute_fess/freegen/elasticsearch/AbstractBehavior.vm +++ b/dbflute_fess/freegen/elasticsearch/AbstractBehavior.vm @@ -1,7 +1,12 @@ package ${request.package}.bsbhv; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; import java.util.List; +import java.util.ListIterator; import java.util.Map; +import java.util.function.Function; import javax.annotation.Resource; @@ -12,12 +17,17 @@ import ${request.package}.cbean.bs.AbstractConditionBean; import ${request.package}.cbean.result.EsPagingResultBean; import org.dbflute.Entity; import org.dbflute.bhv.AbstractBehaviorWritable; +import org.dbflute.bhv.readable.EntityRowHandler; import org.dbflute.bhv.writable.DeleteOption; import org.dbflute.bhv.writable.InsertOption; import org.dbflute.bhv.writable.UpdateOption; import org.dbflute.cbean.ConditionBean; +import org.dbflute.cbean.coption.CursorSelectOption; import org.dbflute.cbean.result.ListResultBean; import org.dbflute.exception.IllegalBehaviorStateException; +import org.elasticsearch.action.bulk.BulkItemResponse; +import org.elasticsearch.action.bulk.BulkRequestBuilder; +import org.elasticsearch.action.bulk.BulkResponse; import org.elasticsearch.action.count.CountRequestBuilder; import org.elasticsearch.action.delete.DeleteRequestBuilder; import org.elasticsearch.action.delete.DeleteResponse; @@ -25,41 +35,60 @@ import org.elasticsearch.action.index.IndexRequestBuilder; import org.elasticsearch.action.index.IndexResponse; import org.elasticsearch.action.search.SearchRequestBuilder; import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.action.search.SearchType; +import org.elasticsearch.action.update.UpdateRequestBuilder; import org.elasticsearch.client.Client; +import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.SearchHits; +/** + * @author FreeGen + */ public abstract class AbstractBehavior extends AbstractBehaviorWritable { @Resource protected Client client; - protected abstract String asIndexEsName(); + protected int sizeForDelete = 100; + + protected String scrollForDelete = "1m"; + + protected int sizeForCursor = 100; + + protected String scrollForCursor = "1m"; + + protected abstract String asEsIndex(); + + protected abstract String asEsIndexType(); + + protected abstract String asEsSearchType(); protected abstract RESULT createEntity(Map source, Class entityType); @Override - protected int delegateSelectCountUniquely(ConditionBean cb) { + protected int delegateSelectCountUniquely(final ConditionBean cb) { // TODO check response and cast problem - CountRequestBuilder builder = client.prepareCount(asIndexEsName()).setTypes(asTableDbName()); + final CountRequestBuilder builder = client.prepareCount(asEsIndex()).setTypes(asEsSearchType()); return (int) ((AbstractConditionBean) cb).build(builder).execute().actionGet().getCount(); } - protected List delegateSelectList(ConditionBean cb, Class entityType) { + @Override + protected List delegateSelectList(final ConditionBean cb, final Class entityType) { // TODO check response - SearchRequestBuilder builder = client.prepareSearch(asIndexEsName()).setTypes(asTableDbName()); + final SearchRequestBuilder builder = client.prepareSearch(asEsIndex()).setTypes(asEsSearchType()); if (cb.isFetchScopeEffective()) { builder.setFrom(cb.getFetchStartIndex()); builder.setSize(cb.getFetchSize()); } ((AbstractConditionBean) cb).request().build(builder); - SearchResponse response = ((AbstractConditionBean) cb).build(builder).execute().actionGet(); + final SearchResponse response = ((AbstractConditionBean) cb).build(builder).execute().actionGet(); - EsPagingResultBean list = new EsPagingResultBean<>(); - SearchHits searchHits = response.getHits(); + final EsPagingResultBean list = new EsPagingResultBean<>(); + final SearchHits searchHits = response.getHits(); searchHits.forEach(hit -> { - Map source = hit.getSource(); - RESULT entity = createEntity(source, entityType); - DocMeta docMeta = ((AbstractEntity) entity).asDocMeta(); + final Map source = hit.getSource(); + final RESULT entity = createEntity(source, entityType); + final DocMeta docMeta = ((AbstractEntity) entity).asDocMeta(); docMeta.id(hit.getId()); docMeta.version(hit.getVersion()); list.add(entity); @@ -78,14 +107,85 @@ public abstract class AbstractBehavior void helpSelectCursorHandlingByPaging(CB cb, EntityRowHandler handler, + Class entityType, CursorSelectOption option) { + delegateSelectCursor(cb, handler, entityType); + } + + @Override + protected void delegateSelectCursor(final ConditionBean cb, final EntityRowHandler handler, + final Class entityType) { + delegateBulkRequest(cb, searchHits -> { + searchHits.forEach(hit -> { + if (handler.isBreakCursor()) { + return; + } + final Map source = hit.getSource(); + final RESULT entity = createEntity(source, entityType); + final DocMeta docMeta = ((AbstractEntity) entity).asDocMeta(); + docMeta.id(hit.getId()); + docMeta.version(hit.getVersion()); + handler.handle(entity); + }); + + return !handler.isBreakCursor(); + }); + } + + protected void delegateSelectBulk(final ConditionBean cb, final EntityRowHandler> handler, + final Class entityType) { + assertCBStateValid(cb); + assertObjectNotNull("entityRowHandler", handler); + assertSpecifyDerivedReferrerEntityProperty(cb, entityType); + assertObjectNotNull("entityRowHandler", handler); + delegateBulkRequest(cb, searchHits -> { + List list = new ArrayList<>(); + searchHits.forEach(hit -> { + final Map source = hit.getSource(); + final RESULT entity = createEntity(source, entityType); + final DocMeta docMeta = ((AbstractEntity) entity).asDocMeta(); + docMeta.id(hit.getId()); + docMeta.version(hit.getVersion()); + list.add(entity); + }); + + handler.handle(list); + return !handler.isBreakCursor(); + }); + } + + protected void delegateBulkRequest(final ConditionBean cb, Function handler) { + final SearchRequestBuilder builder = client.prepareSearch(asEsIndex()).setTypes(asEsIndexType()).setSearchType(SearchType.SCAN) + .setScroll(scrollForCursor).setSize(sizeForCursor); + ((AbstractConditionBean) cb).request().build(builder); + final SearchResponse response = ((AbstractConditionBean) cb).build(builder).execute().actionGet(); + + String scrollId = response.getScrollId(); + while (scrollId != null) { + final SearchResponse scrollResponse = client.prepareSearchScroll(scrollId).setScroll(scrollForDelete).execute().actionGet(); + scrollId = scrollResponse.getScrollId(); + final SearchHits searchHits = scrollResponse.getHits(); + final SearchHit[] hits = searchHits.getHits(); + if (hits.length == 0) { + scrollId = null; + break; + } + + if (!handler.apply(searchHits)) { + break; + } + } + } + @Override protected Number doReadNextVal() { - String msg = "This table is NOT related to sequence: " + asTableDbName(); + final String msg = "This table is NOT related to sequence: " + asEsIndexType(); throw new UnsupportedOperationException(msg); } @Override - protected ListResultBean createListResultBean(ConditionBean cb, List selectedList) { + protected ListResultBean createListResultBean(final ConditionBean cb, final List selectedList) { if (selectedList instanceof EsPagingResultBean) { return (ListResultBean) selectedList; } @@ -93,48 +193,160 @@ public abstract class AbstractBehavior option) { - AbstractEntity esEntity = (AbstractEntity) entity; - IndexRequestBuilder builder = client.prepareIndex(asIndexEsName(), asTableDbName()).setSource(esEntity.toSource()); - RequestOptionCall indexOption = esEntity.asDocMeta().indexOption(); - if (indexOption != null) { - indexOption.callback(builder); - } - IndexResponse response = builder.execute().actionGet(); + protected int delegateInsert(final Entity entity, final InsertOption option) { + final AbstractEntity esEntity = (AbstractEntity) entity; + IndexRequestBuilder builder = createInsertRequest(esEntity); + + final IndexResponse response = builder.execute().actionGet(); esEntity.asDocMeta().id(response.getId()); return response.isCreated() ? 1 : 0; } - @Override - protected int delegateUpdate(Entity entity, UpdateOption option) { - AbstractEntity esEntity = (AbstractEntity) entity; - IndexRequestBuilder builder = - client.prepareIndex(asIndexEsName(), asTableDbName(), esEntity.asDocMeta().id()).setSource(esEntity.toSource()); - RequestOptionCall indexOption = esEntity.asDocMeta().indexOption(); + protected IndexRequestBuilder createInsertRequest(final AbstractEntity esEntity) { + final IndexRequestBuilder builder = client.prepareIndex(asEsIndex(), asEsIndexType()).setSource(esEntity.toSource()); + final RequestOptionCall indexOption = esEntity.asDocMeta().indexOption(); if (indexOption != null) { indexOption.callback(builder); } - Long version = esEntity.asDocMeta().version(); - if (version != null && version.longValue() != -1) { - builder.setVersion(version); - } - IndexResponse response = builder.execute().actionGet(); - return 1; + return builder; } @Override - protected int delegateDelete(Entity entity, DeleteOption option) { - AbstractEntity esEntity = (AbstractEntity) entity; - DeleteRequestBuilder builder = client.prepareDelete(asIndexEsName(), asTableDbName(), esEntity.asDocMeta().id()); - RequestOptionCall deleteOption = esEntity.asDocMeta().deleteOption(); - if (deleteOption != null) { - deleteOption.callback(builder); + protected int delegateUpdate(final Entity entity, final UpdateOption option) { + final AbstractEntity esEntity = (AbstractEntity) entity; + final IndexRequestBuilder builder = createUpdateRequest(esEntity); + + final IndexResponse response = builder.execute().actionGet(); + long version = response.getVersion(); + if (version != -1) { + esEntity.asDocMeta().version(version); } - DeleteResponse response = builder.execute().actionGet(); + return 1; + } + + protected IndexRequestBuilder createUpdateRequest(final AbstractEntity esEntity) { + final IndexRequestBuilder builder = + client.prepareIndex(asEsIndex(), asEsIndexType(), esEntity.asDocMeta().id()).setSource(esEntity.toSource()); + final RequestOptionCall indexOption = esEntity.asDocMeta().indexOption(); + if (indexOption != null) { + indexOption.callback(builder); + } + final Long version = esEntity.asDocMeta().version(); + if (version != null && version.longValue() != -1) { + builder.setVersion(version); + } + return builder; + } + + @Override + protected int delegateDelete(final Entity entity, final DeleteOption option) { + final AbstractEntity esEntity = (AbstractEntity) entity; + final DeleteRequestBuilder builder = createDeleteRequest(esEntity); + + final DeleteResponse response = builder.execute().actionGet(); return response.isFound() ? 1 : 0; } - protected static String toString(Object value) { + protected DeleteRequestBuilder createDeleteRequest(final AbstractEntity esEntity) { + final DeleteRequestBuilder builder = client.prepareDelete(asEsIndex(), asEsIndexType(), esEntity.asDocMeta().id()); + final RequestOptionCall deleteOption = esEntity.asDocMeta().deleteOption(); + if (deleteOption != null) { + deleteOption.callback(builder); + } + return builder; + } + + @Override + protected int delegateQueryDelete(final ConditionBean cb, final DeleteOption option) { + final SearchRequestBuilder builder = client.prepareSearch(asEsIndex()).setTypes(asEsIndexType()).setSearchType(SearchType.SCAN) + .setScroll(scrollForDelete).setSize(sizeForDelete); + ((AbstractConditionBean) cb).request().build(builder); + final SearchResponse response = ((AbstractConditionBean) cb).build(builder).execute().actionGet(); + + int count = 0; + String scrollId = response.getScrollId(); + while (scrollId != null) { + final SearchResponse scrollResponse = client.prepareSearchScroll(scrollId).setScroll(scrollForDelete).execute().actionGet(); + scrollId = scrollResponse.getScrollId(); + final SearchHits searchHits = scrollResponse.getHits(); + final SearchHit[] hits = searchHits.getHits(); + if (hits.length == 0) { + scrollId = null; + break; + } + + final BulkRequestBuilder bulkRequest = client.prepareBulk(); + for (final SearchHit hit : hits) { + bulkRequest.add(client.prepareDelete(asEsIndex(), asEsIndexType(), hit.getId())); + } + count += hits.length; + final BulkResponse bulkResponse = bulkRequest.execute().actionGet(); + if (bulkResponse.hasFailures()) { + throw new IllegalBehaviorStateException(bulkResponse.buildFailureMessage()); + } + } + return count; + } + + protected int[] delegateBatchInsert(final List entityList, final InsertOption option) { + if (entityList.isEmpty()) { + return new int[] {}; + } + return delegateBatchRequest(entityList, esEntity -> { + return createInsertRequest(esEntity); + }); + } + + protected int[] delegateBatchUpdate(List entityList, UpdateOption option) { + if (entityList.isEmpty()) { + return new int[] {}; + } + return delegateBatchRequest(entityList, esEntity -> { + return createUpdateRequest(esEntity); + }); + } + + protected int[] delegateBatchDelete(List entityList, DeleteOption option) { + if (entityList.isEmpty()) { + return new int[] {}; + } + return delegateBatchRequest(entityList, esEntity -> { + return createDeleteRequest(esEntity); + }); + } + + protected int[] delegateBatchRequest(final List entityList, Function call) { + final BulkList bulkList = (BulkList) entityList; + final BulkRequestBuilder bulkBuilder = client.prepareBulk(); + for (final Entity entity : entityList) { + final AbstractEntity esEntity = (AbstractEntity) entity; + BUILDER builder = call.apply(esEntity); + if (builder instanceof IndexRequestBuilder) { + bulkBuilder.add((IndexRequestBuilder) builder); + } else if (builder instanceof UpdateRequestBuilder) { + bulkBuilder.add((UpdateRequestBuilder) builder); + } else if (builder instanceof DeleteRequestBuilder) { + bulkBuilder.add((DeleteRequestBuilder) builder); + } + } + RequestOptionCall builderCall = bulkList.getCall(); + if (builderCall != null) { + builderCall.callback(bulkBuilder); + } + BulkResponse response = bulkBuilder.execute().actionGet(); + + List resultList = new ArrayList<>(); + for (BulkItemResponse itemResponse : response.getItems()) { + resultList.add(itemResponse.isFailed() ? 0 : 1); + } + int[] results = new int[resultList.size()]; + for (int i = 0; i < resultList.size(); i++) { + results[i] = resultList.get(i); + } + return results; + } + + protected static String toString(final Object value) { if (value != null) { return value.toString(); } else { @@ -142,7 +354,7 @@ public abstract class AbstractBehavior implements List { + + private final List parent; + + private final RequestOptionCall call; + + public BulkList(final List parent, final RequestOptionCall call) { + this.parent = parent; + this.call = call; + } + + public int size() { + return parent.size(); + } + + public boolean isEmpty() { + return parent.isEmpty(); + } + + public boolean contains(final Object o) { + return parent.contains(o); + } + + public Iterator iterator() { + return parent.iterator(); + } + + public Object[] toArray() { + return parent.toArray(); + } + + public T[] toArray(final T[] a) { + return parent.toArray(a); + } + + public boolean add(final E e) { + return parent.add(e); + } + + public boolean remove(final Object o) { + return parent.remove(o); + } + + public boolean containsAll(final Collection c) { + return parent.containsAll(c); + } + + public boolean addAll(final Collection c) { + return parent.addAll(c); + } + + public boolean addAll(final int index, final Collection c) { + return parent.addAll(index, c); + } + + public boolean removeAll(final Collection c) { + return parent.removeAll(c); + } + + public boolean retainAll(final Collection c) { + return parent.retainAll(c); + } + + public void clear() { + parent.clear(); + } + + public boolean equals(final Object o) { + return parent.equals(o); + } + + public int hashCode() { + return parent.hashCode(); + } + + public E get(final int index) { + return parent.get(index); + } + + public E set(final int index, final E element) { + return parent.set(index, element); + } + + public void add(final int index, final E element) { + parent.add(index, element); + } + + public E remove(final int index) { + return parent.remove(index); + } + + public int indexOf(final Object o) { + return parent.indexOf(o); + } + + public int lastIndexOf(final Object o) { + return parent.lastIndexOf(o); + } + + public ListIterator listIterator() { + return parent.listIterator(); + } + + public ListIterator listIterator(final int index) { + return parent.listIterator(index); + } + + public List subList(final int fromIndex, final int toIndex) { + return parent.subList(fromIndex, toIndex); + } + + public RequestOptionCall getCall() { + return call; + } + } } diff --git a/dbflute_fess/freegen/elasticsearch/BsBehavior.vm b/dbflute_fess/freegen/elasticsearch/BsBehavior.vm index 8e90cdd1a..c5068fbd6 100644 --- a/dbflute_fess/freegen/elasticsearch/BsBehavior.vm +++ b/dbflute_fess/freegen/elasticsearch/BsBehavior.vm @@ -1,5 +1,6 @@ package ${request.package}.bsbhv; +import java.util.List; import java.util.Map; import ${request.package}.bsentity.AbstractEntity; @@ -9,11 +10,13 @@ import ${request.package}.cbean.${table.camelizedName}CB; import ${request.package}.exentity.${table.camelizedName}; import org.dbflute.Entity; import org.dbflute.bhv.readable.CBCall; +import org.dbflute.bhv.readable.EntityRowHandler; import org.dbflute.cbean.ConditionBean; import org.dbflute.cbean.result.ListResultBean; import org.dbflute.cbean.result.PagingResultBean; import org.dbflute.exception.IllegalBehaviorStateException; import org.dbflute.optional.OptionalEntity; +import org.elasticsearch.action.bulk.BulkRequestBuilder; import org.elasticsearch.action.delete.DeleteRequestBuilder; import org.elasticsearch.action.index.IndexRequestBuilder; @@ -24,12 +27,22 @@ public abstract class Bs${table.camelizedName}Bhv extends AbstractBehavior<${tab @Override public String asTableDbName() { + return asEsIndexType(); + } + + @Override + protected String asEsIndex() { + return "${table.indexSettings.index}"; + } + + @Override + public String asEsIndexType() { return "${table.name}"; } @Override - protected String asIndexEsName() { - return "${table.indexSettings.index}"; + public String asEsSearchType() { + return "${table.name}"; } @Override @@ -130,6 +143,14 @@ public abstract class Bs${table.camelizedName}Bhv extends AbstractBehavior<${tab return (PagingResultBean<${table.camelizedName}>) facadeSelectList(createCB(cbLambda)); } + public void selectCursor(CBCall<${table.camelizedName}CB> cbLambda, EntityRowHandler<${table.camelizedName}> entityLambda) { + facadeSelectCursor(createCB(cbLambda), entityLambda); + } + + public void selectBulk(CBCall<${table.camelizedName}CB> cbLambda, EntityRowHandler> entityLambda) { + delegateSelectBulk(createCB(cbLambda), entityLambda,typeOfSelectedEntity()); + } + public void insert(${table.camelizedName} entity) { doInsert(entity, null); } @@ -174,6 +195,34 @@ public abstract class Bs${table.camelizedName}Bhv extends AbstractBehavior<${tab doDelete(entity, null); } + public int queryDelete(CBCall<${table.camelizedName}CB> cbLambda) { + return doQueryDelete(createCB(cbLambda), null); + } + + public int[] batchInsert(List<${table.camelizedName}> list) { + return batchInsert(list, null); + } + + public int[] batchInsert(List<${table.camelizedName}> list, RequestOptionCall call) { + return doBatchInsert(new BulkList<>(list, call), null); + } + + public int[] batchUpdate(List<${table.camelizedName}> list) { + return batchUpdate(list, null); + } + + public int[] batchUpdate(List<${table.camelizedName}> list, RequestOptionCall call) { + return doBatchUpdate(new BulkList<>(list, call), null); + } + + public int[] batchDelete(List<${table.camelizedName}> list) { + return batchDelete(list, null); + } + + public int[] batchDelete(List<${table.camelizedName}> list, RequestOptionCall call) { + return doBatchDelete(new BulkList<>(list, call), null); + } + // TODO create, modify, remove } diff --git a/dbflute_fess/freegen/elasticsearch/BsConditionFilter.vm b/dbflute_fess/freegen/elasticsearch/BsConditionFilter.vm index e6ba6190e..2c5e5176b 100644 --- a/dbflute_fess/freegen/elasticsearch/BsConditionFilter.vm +++ b/dbflute_fess/freegen/elasticsearch/BsConditionFilter.vm @@ -111,6 +111,25 @@ public abstract class Bs${table.camelizedName}CF extends AbstractConditionFilter #if ($column.isNormalColumn) #set ($javaNative = ${column.type}) + public void set${column.capCamelName}_NotEqual($javaNative ${column.uncapCamelName}) { + set${column.capCamelName}_NotEqual(${column.uncapCamelName}, null, null); + } + + public void set${column.capCamelName}_NotEqual($javaNative ${column.uncapCamelName}, ConditionOptionCall notOpLambda, + ConditionOptionCall eqOpLambda) { + not(subCf -> { + subCf.set${column.capCamelName}_Equal(${column.uncapCamelName}, eqOpLambda); + } , notOpLambda); + } + + public void set${column.capCamelName}_Equal($javaNative ${column.uncapCamelName}) { + set${column.capCamelName}_Term(${column.uncapCamelName}, null); + } + + public void set${column.capCamelName}_Equal($javaNative ${column.uncapCamelName}, ConditionOptionCall opLambda) { + set${column.capCamelName}_Term(${column.uncapCamelName}, opLambda); + } + public void set${column.capCamelName}_Term($javaNative ${column.uncapCamelName}) { set${column.capCamelName}_Term(${column.uncapCamelName}, null); } diff --git a/dbflute_fess/freegen/elasticsearch/BsConditionQuery.vm b/dbflute_fess/freegen/elasticsearch/BsConditionQuery.vm index c0690fc50..05cd90025 100644 --- a/dbflute_fess/freegen/elasticsearch/BsConditionQuery.vm +++ b/dbflute_fess/freegen/elasticsearch/BsConditionQuery.vm @@ -66,6 +66,14 @@ public abstract class Bs${table.camelizedName}CQ extends AbstractConditionQuery #foreach ($column in $table.columnList) #if ($column.isNormalColumn) #set ($javaNative = ${column.type}) + public void set${column.capCamelName}_Equal($javaNative ${column.uncapCamelName}) { + set${column.capCamelName}_Term(${column.uncapCamelName}, null); + } + + public void set${column.capCamelName}_Equal($javaNative ${column.uncapCamelName}, ConditionOptionCall opLambda) { + set${column.capCamelName}_Term(${column.uncapCamelName}, opLambda); + } + public void set${column.capCamelName}_Term($javaNative ${column.uncapCamelName}) { set${column.capCamelName}_Term(${column.uncapCamelName}, null); } diff --git a/dbflute_fess/freegen/elasticsearch/BsEntity.vm b/dbflute_fess/freegen/elasticsearch/BsEntity.vm index 26b342ca6..37001d1f6 100644 --- a/dbflute_fess/freegen/elasticsearch/BsEntity.vm +++ b/dbflute_fess/freegen/elasticsearch/BsEntity.vm @@ -1,5 +1,9 @@ package ${request.package}.bsentity; +#if ($table.get("_id") && $table.get("_id").get("path")) +#set ($idColumn = $table.get("_id").get("path")) +#end +import java.time.LocalDateTime; import java.util.HashMap; import java.util.Map; @@ -35,9 +39,11 @@ public class Bs${table.camelizedName} extends AbstractEntity { #elseif ($column.isRefColumn) #set ($javaNative = ${column.camelizedName}) #end +#if ($column.name != $idColumn) /** ${column.name} */ protected ${javaNative} ${column.uncapCamelName}; +#end #end // [Referrers] *comment only #foreach ($referrer in $table.referrerList) @@ -53,14 +59,36 @@ public class Bs${table.camelizedName} extends AbstractEntity { #elseif ($column.isRefColumn) #set ($javaNative = ${column.camelizedName}) #end - public ${javaNative} get${column.capCamelName}() { +#if ($column.name != $idColumn) +#if ($javaNative == "boolean") + public ${javaNative} is${column.capCamelName}() { + checkSpecifiedProperty("${column.uncapCamelName}"); return ${column.uncapCamelName}; } +#else + public ${javaNative} get${column.capCamelName}() { + checkSpecifiedProperty("${column.uncapCamelName}"); + return ${column.uncapCamelName}; + } +#end + + public void set${column.capCamelName}(${javaNative} value) { + registerModifiedProperty("${column.uncapCamelName}"); + this.${column.uncapCamelName} = value; + } + +#else + public ${javaNative} get${column.capCamelName}() { + checkSpecifiedProperty("${column.uncapCamelName}"); + return asDocMeta().id(); + } public void set${column.capCamelName}(${javaNative} value) { - ${column.uncapCamelName} = value; + registerModifiedProperty("${column.uncapCamelName}"); + asDocMeta().id(value); } +#end #end @Override @@ -68,9 +96,15 @@ public class Bs${table.camelizedName} extends AbstractEntity { Map sourceMap = new HashMap<>(); #foreach ($column in $table.columnList) #if ($column.isNormalColumn) +#if ($column.name != $idColumn) if (${column.uncapCamelName} != null) { sourceMap.put("${column.name}", ${column.uncapCamelName}); } +#else + if (asDocMeta().id() != null) { + sourceMap.put("${column.name}", asDocMeta().id()); + } +#end #end #end return sourceMap;