Is it possible to query Hazelcast Cache? If yes, How to do it?
I am trying to implement caching using hazelcast.
Here's my code. My question is that, when findAllGames() is executed i am caching all the games in "gamesCache" and when findGameByTypes() is executed, I want it to query "gamesCache" instead of hitting the database and return the result.
@Cacheable(cacheNames = "gamesCache", key = "#root.methodName")
public List<Game> findAllGames() {
List<Game> games = gamesDao.getAllGames(); // dao call
//some database call
}
public List<Game> findGameByTypes(GameType gameType) {
List<Game> games = gamesDao.getGamesByType(gameType); // dao call
//some logic
}
public class Game implements Serializable {
private long gameId;
private String gameName;
private GameType gameType;
}
public class GameType implements Serializable {
private long gameId;
private String gameGenre;
private Boolean status;
}
findAllGames() is always hit first than findGamesByTypes().
Now the cached map is generated with "findAllGames" as key and List of games as value. Now Is there any way to query the map using the GameType attributes as criteria.
Is there any way to implement this? I am open to other suggestions as well.
java spring caching hazelcast hazelcast-imap
add a comment |
I am trying to implement caching using hazelcast.
Here's my code. My question is that, when findAllGames() is executed i am caching all the games in "gamesCache" and when findGameByTypes() is executed, I want it to query "gamesCache" instead of hitting the database and return the result.
@Cacheable(cacheNames = "gamesCache", key = "#root.methodName")
public List<Game> findAllGames() {
List<Game> games = gamesDao.getAllGames(); // dao call
//some database call
}
public List<Game> findGameByTypes(GameType gameType) {
List<Game> games = gamesDao.getGamesByType(gameType); // dao call
//some logic
}
public class Game implements Serializable {
private long gameId;
private String gameName;
private GameType gameType;
}
public class GameType implements Serializable {
private long gameId;
private String gameGenre;
private Boolean status;
}
findAllGames() is always hit first than findGamesByTypes().
Now the cached map is generated with "findAllGames" as key and List of games as value. Now Is there any way to query the map using the GameType attributes as criteria.
Is there any way to implement this? I am open to other suggestions as well.
java spring caching hazelcast hazelcast-imap
add a comment |
I am trying to implement caching using hazelcast.
Here's my code. My question is that, when findAllGames() is executed i am caching all the games in "gamesCache" and when findGameByTypes() is executed, I want it to query "gamesCache" instead of hitting the database and return the result.
@Cacheable(cacheNames = "gamesCache", key = "#root.methodName")
public List<Game> findAllGames() {
List<Game> games = gamesDao.getAllGames(); // dao call
//some database call
}
public List<Game> findGameByTypes(GameType gameType) {
List<Game> games = gamesDao.getGamesByType(gameType); // dao call
//some logic
}
public class Game implements Serializable {
private long gameId;
private String gameName;
private GameType gameType;
}
public class GameType implements Serializable {
private long gameId;
private String gameGenre;
private Boolean status;
}
findAllGames() is always hit first than findGamesByTypes().
Now the cached map is generated with "findAllGames" as key and List of games as value. Now Is there any way to query the map using the GameType attributes as criteria.
Is there any way to implement this? I am open to other suggestions as well.
java spring caching hazelcast hazelcast-imap
I am trying to implement caching using hazelcast.
Here's my code. My question is that, when findAllGames() is executed i am caching all the games in "gamesCache" and when findGameByTypes() is executed, I want it to query "gamesCache" instead of hitting the database and return the result.
@Cacheable(cacheNames = "gamesCache", key = "#root.methodName")
public List<Game> findAllGames() {
List<Game> games = gamesDao.getAllGames(); // dao call
//some database call
}
public List<Game> findGameByTypes(GameType gameType) {
List<Game> games = gamesDao.getGamesByType(gameType); // dao call
//some logic
}
public class Game implements Serializable {
private long gameId;
private String gameName;
private GameType gameType;
}
public class GameType implements Serializable {
private long gameId;
private String gameGenre;
private Boolean status;
}
findAllGames() is always hit first than findGamesByTypes().
Now the cached map is generated with "findAllGames" as key and List of games as value. Now Is there any way to query the map using the GameType attributes as criteria.
Is there any way to implement this? I am open to other suggestions as well.
java spring caching hazelcast hazelcast-imap
java spring caching hazelcast hazelcast-imap
edited Nov 19 '18 at 7:17
Akshaya Kumar T
asked Nov 19 '18 at 6:34
Akshaya Kumar TAkshaya Kumar T
198
198
add a comment |
add a comment |
3 Answers
3
active
oldest
votes
As suggested by @wildnez, you can use PRedicate and/or SQLQuery. Also, since you're using Spring, you can also benefit from Spring-Data-Hazelcast project which automatically generates queries for you from method name: https://github.com/hazelcast/spring-data-hazelcast
But you need to change your way of caching. Instead of having only one entry in the cache, with key findAllGames and storing all games in a collection, you should store all entries individually in the cache, gameId as key & Game as value. This way you can query values using either of the methods.
Thanks, That's what I tried and worked for me!
– Akshaya Kumar T
Nov 20 '18 at 6:52
add a comment |
Please have a look at the MapLoader provided by Hazelcast. https://docs.hazelcast.org/docs/3.8/javadoc/com/hazelcast/core/MapLoader.html
You would have to implement a loadAll which would be a call to your findAllGames() which would save the key as gameType against the object.
Any call to load should be a call findGameByTypes which would be invoked if it wasnt able to find the data in the cache.
Have a look at this blog to ensure you understand the pitfalls involved.
https://dzone.com/articles/hazelcasts-maploader-pitfalls
I have added more details to the question. It may give a fair idea of what I want to achieve. Could you elaborate your answer a bit more or provide an example.?
– Akshaya Kumar T
Nov 19 '18 at 7:19
Thanks for clarifiying. Hazelcast does support criteria based queries. docs.hazelcast.org/docs/3.7/manual/html-single/… . You would need to setup a predicate. I havent tried on a composite object but for simple objects it should work. Please give it a try and let us know
– Renny
Nov 19 '18 at 7:29
I have gone through that link. Here the name of my cache is "gamesCache" and the key i used is "findAllGames". In the example provided in the link in the "Querying with Criteria Api" section, they do this IMap<String, Employee> map = hazelcastInstance.getMap("employee"); I am having difficulty in understanding what this returns. I mean what are the key and values of this map.?
– Akshaya Kumar T
Nov 19 '18 at 7:52
you are creating a cache with the key as the method name. instead of this you could go ahead with a query to the repository using the Game Data retrieved save them into a Hazelcast map with gameId as key and the Game as object. Hazelcast stores its data in a map so you need to align your data to the same pattern
– Renny
Nov 19 '18 at 8:44
add a comment |
You can query Hazelcast Map/Cache using Predicate or SqlQuery. Check out detail documentation here: https://docs.hazelcast.org/docs/3.11/manual/html-single/index.html#distributed-query
Yes, I have looked into this. I followed the employee example in Querying with criteria Api. However I have a doubt that what will this return hazelcastInstance.getMap("findAllGames")? A map with "findAllGames" as key and List<Game> as value. If yes, how to structure the predicate to query the cache?
– Akshaya Kumar T
Nov 19 '18 at 7:35
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53369433%2fis-it-possible-to-query-hazelcast-cache-if-yes-how-to-do-it%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
3 Answers
3
active
oldest
votes
3 Answers
3
active
oldest
votes
active
oldest
votes
active
oldest
votes
As suggested by @wildnez, you can use PRedicate and/or SQLQuery. Also, since you're using Spring, you can also benefit from Spring-Data-Hazelcast project which automatically generates queries for you from method name: https://github.com/hazelcast/spring-data-hazelcast
But you need to change your way of caching. Instead of having only one entry in the cache, with key findAllGames and storing all games in a collection, you should store all entries individually in the cache, gameId as key & Game as value. This way you can query values using either of the methods.
Thanks, That's what I tried and worked for me!
– Akshaya Kumar T
Nov 20 '18 at 6:52
add a comment |
As suggested by @wildnez, you can use PRedicate and/or SQLQuery. Also, since you're using Spring, you can also benefit from Spring-Data-Hazelcast project which automatically generates queries for you from method name: https://github.com/hazelcast/spring-data-hazelcast
But you need to change your way of caching. Instead of having only one entry in the cache, with key findAllGames and storing all games in a collection, you should store all entries individually in the cache, gameId as key & Game as value. This way you can query values using either of the methods.
Thanks, That's what I tried and worked for me!
– Akshaya Kumar T
Nov 20 '18 at 6:52
add a comment |
As suggested by @wildnez, you can use PRedicate and/or SQLQuery. Also, since you're using Spring, you can also benefit from Spring-Data-Hazelcast project which automatically generates queries for you from method name: https://github.com/hazelcast/spring-data-hazelcast
But you need to change your way of caching. Instead of having only one entry in the cache, with key findAllGames and storing all games in a collection, you should store all entries individually in the cache, gameId as key & Game as value. This way you can query values using either of the methods.
As suggested by @wildnez, you can use PRedicate and/or SQLQuery. Also, since you're using Spring, you can also benefit from Spring-Data-Hazelcast project which automatically generates queries for you from method name: https://github.com/hazelcast/spring-data-hazelcast
But you need to change your way of caching. Instead of having only one entry in the cache, with key findAllGames and storing all games in a collection, you should store all entries individually in the cache, gameId as key & Game as value. This way you can query values using either of the methods.
answered Nov 20 '18 at 6:42
Gokhan OnerGokhan Oner
2,1561020
2,1561020
Thanks, That's what I tried and worked for me!
– Akshaya Kumar T
Nov 20 '18 at 6:52
add a comment |
Thanks, That's what I tried and worked for me!
– Akshaya Kumar T
Nov 20 '18 at 6:52
Thanks, That's what I tried and worked for me!
– Akshaya Kumar T
Nov 20 '18 at 6:52
Thanks, That's what I tried and worked for me!
– Akshaya Kumar T
Nov 20 '18 at 6:52
add a comment |
Please have a look at the MapLoader provided by Hazelcast. https://docs.hazelcast.org/docs/3.8/javadoc/com/hazelcast/core/MapLoader.html
You would have to implement a loadAll which would be a call to your findAllGames() which would save the key as gameType against the object.
Any call to load should be a call findGameByTypes which would be invoked if it wasnt able to find the data in the cache.
Have a look at this blog to ensure you understand the pitfalls involved.
https://dzone.com/articles/hazelcasts-maploader-pitfalls
I have added more details to the question. It may give a fair idea of what I want to achieve. Could you elaborate your answer a bit more or provide an example.?
– Akshaya Kumar T
Nov 19 '18 at 7:19
Thanks for clarifiying. Hazelcast does support criteria based queries. docs.hazelcast.org/docs/3.7/manual/html-single/… . You would need to setup a predicate. I havent tried on a composite object but for simple objects it should work. Please give it a try and let us know
– Renny
Nov 19 '18 at 7:29
I have gone through that link. Here the name of my cache is "gamesCache" and the key i used is "findAllGames". In the example provided in the link in the "Querying with Criteria Api" section, they do this IMap<String, Employee> map = hazelcastInstance.getMap("employee"); I am having difficulty in understanding what this returns. I mean what are the key and values of this map.?
– Akshaya Kumar T
Nov 19 '18 at 7:52
you are creating a cache with the key as the method name. instead of this you could go ahead with a query to the repository using the Game Data retrieved save them into a Hazelcast map with gameId as key and the Game as object. Hazelcast stores its data in a map so you need to align your data to the same pattern
– Renny
Nov 19 '18 at 8:44
add a comment |
Please have a look at the MapLoader provided by Hazelcast. https://docs.hazelcast.org/docs/3.8/javadoc/com/hazelcast/core/MapLoader.html
You would have to implement a loadAll which would be a call to your findAllGames() which would save the key as gameType against the object.
Any call to load should be a call findGameByTypes which would be invoked if it wasnt able to find the data in the cache.
Have a look at this blog to ensure you understand the pitfalls involved.
https://dzone.com/articles/hazelcasts-maploader-pitfalls
I have added more details to the question. It may give a fair idea of what I want to achieve. Could you elaborate your answer a bit more or provide an example.?
– Akshaya Kumar T
Nov 19 '18 at 7:19
Thanks for clarifiying. Hazelcast does support criteria based queries. docs.hazelcast.org/docs/3.7/manual/html-single/… . You would need to setup a predicate. I havent tried on a composite object but for simple objects it should work. Please give it a try and let us know
– Renny
Nov 19 '18 at 7:29
I have gone through that link. Here the name of my cache is "gamesCache" and the key i used is "findAllGames". In the example provided in the link in the "Querying with Criteria Api" section, they do this IMap<String, Employee> map = hazelcastInstance.getMap("employee"); I am having difficulty in understanding what this returns. I mean what are the key and values of this map.?
– Akshaya Kumar T
Nov 19 '18 at 7:52
you are creating a cache with the key as the method name. instead of this you could go ahead with a query to the repository using the Game Data retrieved save them into a Hazelcast map with gameId as key and the Game as object. Hazelcast stores its data in a map so you need to align your data to the same pattern
– Renny
Nov 19 '18 at 8:44
add a comment |
Please have a look at the MapLoader provided by Hazelcast. https://docs.hazelcast.org/docs/3.8/javadoc/com/hazelcast/core/MapLoader.html
You would have to implement a loadAll which would be a call to your findAllGames() which would save the key as gameType against the object.
Any call to load should be a call findGameByTypes which would be invoked if it wasnt able to find the data in the cache.
Have a look at this blog to ensure you understand the pitfalls involved.
https://dzone.com/articles/hazelcasts-maploader-pitfalls
Please have a look at the MapLoader provided by Hazelcast. https://docs.hazelcast.org/docs/3.8/javadoc/com/hazelcast/core/MapLoader.html
You would have to implement a loadAll which would be a call to your findAllGames() which would save the key as gameType against the object.
Any call to load should be a call findGameByTypes which would be invoked if it wasnt able to find the data in the cache.
Have a look at this blog to ensure you understand the pitfalls involved.
https://dzone.com/articles/hazelcasts-maploader-pitfalls
answered Nov 19 '18 at 7:01
RennyRenny
608
608
I have added more details to the question. It may give a fair idea of what I want to achieve. Could you elaborate your answer a bit more or provide an example.?
– Akshaya Kumar T
Nov 19 '18 at 7:19
Thanks for clarifiying. Hazelcast does support criteria based queries. docs.hazelcast.org/docs/3.7/manual/html-single/… . You would need to setup a predicate. I havent tried on a composite object but for simple objects it should work. Please give it a try and let us know
– Renny
Nov 19 '18 at 7:29
I have gone through that link. Here the name of my cache is "gamesCache" and the key i used is "findAllGames". In the example provided in the link in the "Querying with Criteria Api" section, they do this IMap<String, Employee> map = hazelcastInstance.getMap("employee"); I am having difficulty in understanding what this returns. I mean what are the key and values of this map.?
– Akshaya Kumar T
Nov 19 '18 at 7:52
you are creating a cache with the key as the method name. instead of this you could go ahead with a query to the repository using the Game Data retrieved save them into a Hazelcast map with gameId as key and the Game as object. Hazelcast stores its data in a map so you need to align your data to the same pattern
– Renny
Nov 19 '18 at 8:44
add a comment |
I have added more details to the question. It may give a fair idea of what I want to achieve. Could you elaborate your answer a bit more or provide an example.?
– Akshaya Kumar T
Nov 19 '18 at 7:19
Thanks for clarifiying. Hazelcast does support criteria based queries. docs.hazelcast.org/docs/3.7/manual/html-single/… . You would need to setup a predicate. I havent tried on a composite object but for simple objects it should work. Please give it a try and let us know
– Renny
Nov 19 '18 at 7:29
I have gone through that link. Here the name of my cache is "gamesCache" and the key i used is "findAllGames". In the example provided in the link in the "Querying with Criteria Api" section, they do this IMap<String, Employee> map = hazelcastInstance.getMap("employee"); I am having difficulty in understanding what this returns. I mean what are the key and values of this map.?
– Akshaya Kumar T
Nov 19 '18 at 7:52
you are creating a cache with the key as the method name. instead of this you could go ahead with a query to the repository using the Game Data retrieved save them into a Hazelcast map with gameId as key and the Game as object. Hazelcast stores its data in a map so you need to align your data to the same pattern
– Renny
Nov 19 '18 at 8:44
I have added more details to the question. It may give a fair idea of what I want to achieve. Could you elaborate your answer a bit more or provide an example.?
– Akshaya Kumar T
Nov 19 '18 at 7:19
I have added more details to the question. It may give a fair idea of what I want to achieve. Could you elaborate your answer a bit more or provide an example.?
– Akshaya Kumar T
Nov 19 '18 at 7:19
Thanks for clarifiying. Hazelcast does support criteria based queries. docs.hazelcast.org/docs/3.7/manual/html-single/… . You would need to setup a predicate. I havent tried on a composite object but for simple objects it should work. Please give it a try and let us know
– Renny
Nov 19 '18 at 7:29
Thanks for clarifiying. Hazelcast does support criteria based queries. docs.hazelcast.org/docs/3.7/manual/html-single/… . You would need to setup a predicate. I havent tried on a composite object but for simple objects it should work. Please give it a try and let us know
– Renny
Nov 19 '18 at 7:29
I have gone through that link. Here the name of my cache is "gamesCache" and the key i used is "findAllGames". In the example provided in the link in the "Querying with Criteria Api" section, they do this IMap<String, Employee> map = hazelcastInstance.getMap("employee"); I am having difficulty in understanding what this returns. I mean what are the key and values of this map.?
– Akshaya Kumar T
Nov 19 '18 at 7:52
I have gone through that link. Here the name of my cache is "gamesCache" and the key i used is "findAllGames". In the example provided in the link in the "Querying with Criteria Api" section, they do this IMap<String, Employee> map = hazelcastInstance.getMap("employee"); I am having difficulty in understanding what this returns. I mean what are the key and values of this map.?
– Akshaya Kumar T
Nov 19 '18 at 7:52
you are creating a cache with the key as the method name. instead of this you could go ahead with a query to the repository using the Game Data retrieved save them into a Hazelcast map with gameId as key and the Game as object. Hazelcast stores its data in a map so you need to align your data to the same pattern
– Renny
Nov 19 '18 at 8:44
you are creating a cache with the key as the method name. instead of this you could go ahead with a query to the repository using the Game Data retrieved save them into a Hazelcast map with gameId as key and the Game as object. Hazelcast stores its data in a map so you need to align your data to the same pattern
– Renny
Nov 19 '18 at 8:44
add a comment |
You can query Hazelcast Map/Cache using Predicate or SqlQuery. Check out detail documentation here: https://docs.hazelcast.org/docs/3.11/manual/html-single/index.html#distributed-query
Yes, I have looked into this. I followed the employee example in Querying with criteria Api. However I have a doubt that what will this return hazelcastInstance.getMap("findAllGames")? A map with "findAllGames" as key and List<Game> as value. If yes, how to structure the predicate to query the cache?
– Akshaya Kumar T
Nov 19 '18 at 7:35
add a comment |
You can query Hazelcast Map/Cache using Predicate or SqlQuery. Check out detail documentation here: https://docs.hazelcast.org/docs/3.11/manual/html-single/index.html#distributed-query
Yes, I have looked into this. I followed the employee example in Querying with criteria Api. However I have a doubt that what will this return hazelcastInstance.getMap("findAllGames")? A map with "findAllGames" as key and List<Game> as value. If yes, how to structure the predicate to query the cache?
– Akshaya Kumar T
Nov 19 '18 at 7:35
add a comment |
You can query Hazelcast Map/Cache using Predicate or SqlQuery. Check out detail documentation here: https://docs.hazelcast.org/docs/3.11/manual/html-single/index.html#distributed-query
You can query Hazelcast Map/Cache using Predicate or SqlQuery. Check out detail documentation here: https://docs.hazelcast.org/docs/3.11/manual/html-single/index.html#distributed-query
answered Nov 19 '18 at 7:26
wildnezwildnez
55338
55338
Yes, I have looked into this. I followed the employee example in Querying with criteria Api. However I have a doubt that what will this return hazelcastInstance.getMap("findAllGames")? A map with "findAllGames" as key and List<Game> as value. If yes, how to structure the predicate to query the cache?
– Akshaya Kumar T
Nov 19 '18 at 7:35
add a comment |
Yes, I have looked into this. I followed the employee example in Querying with criteria Api. However I have a doubt that what will this return hazelcastInstance.getMap("findAllGames")? A map with "findAllGames" as key and List<Game> as value. If yes, how to structure the predicate to query the cache?
– Akshaya Kumar T
Nov 19 '18 at 7:35
Yes, I have looked into this. I followed the employee example in Querying with criteria Api. However I have a doubt that what will this return hazelcastInstance.getMap("findAllGames")? A map with "findAllGames" as key and List<Game> as value. If yes, how to structure the predicate to query the cache?
– Akshaya Kumar T
Nov 19 '18 at 7:35
Yes, I have looked into this. I followed the employee example in Querying with criteria Api. However I have a doubt that what will this return hazelcastInstance.getMap("findAllGames")? A map with "findAllGames" as key and List<Game> as value. If yes, how to structure the predicate to query the cache?
– Akshaya Kumar T
Nov 19 '18 at 7:35
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53369433%2fis-it-possible-to-query-hazelcast-cache-if-yes-how-to-do-it%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown